一、硬件接口说明:
主板上J2302插座对应CPU的I2C3,插座线序说明:
序号 | 说明 | 备注 |
---|---|---|
1 | VCC | 输出电压3.3V |
2 | I2C3_SCL | 该PIN需要外部加4.7K电阻上拉到VCC |
3 | I2C3_SDA | 该PIN需要外部加4.7K电阻上拉到VCC |
4 | GND | 电源参考地 |
二、BIOS中添加I2C Slave从机设备
添加方法:请参考"Windows驱动开发"描述后面部分"新设备加入到系统"流程,这里仅说明需要添加的ASL代码(注意:下面用了中文注解关键信息,根据实际硬件进行修改。需要强调的是正式ASL代码中不能出现中文,使用时候删除掉中文注解或者换成英文注解):
以下ASL 代码添加一个I2C设备,根据实际情况,主要修改关键3项:
项目 | 描述值 | 备注 |
---|---|---|
设备驱动ID | I2C30001 | 驱动程序对应的关联硬件ID |
I2C Slave从机设备地址 | 0X50 | I2C外设从机7位地址,不含读/写位 |
I2C速率 | 0x00061A80 | I2C速率,支持常用100K,400K等,这里是400K |
Scope (_SB.PC00.I2C3)
{
Device (EPC3)
{
Name (_ADR, Zero)
Name (_HID, "I2C30001") // _HID: 硬件ID,设备管理器显示和驱动配备用到
Name (_CID, "I2C30001") // _CID: 兼容ID,和_HID即可
Name (_S0W, Zero)
Name (_UID, One)
Method (_CRS, 0, NotSerialized)
{
Name (RBUF, ResourceTemplate ()
{
I2cSerialBusV2 (0x50, //I2C从机设备地址:7位表示,不包含读/写位
ControllerInitiated,
0x00061A80, //速率,这里是400K
AddressingMode7Bit,
"\\_SB.PC00.I2C3",
0x00, ResourceConsumer, , Exclusive,
)
})
Return (RBUF)
}
Method (_STA, 0, NotSerialized)
{
Return (0x0F)
}
}
}
I2C设备添加到BIOS后,可以从设备管理器里面查看到:未知设备,对应的硬件ID和ASL代码中描述_HID (I2C30001)一样的,如图
三、设备ID和驱动程序关联
我们将提供I2C驱动程序,把硬件ID I2C30001 添加到驱动安装文件"SpbDriver.inf"中,驱动文件全文如下:
[Version]
Signature = "$WINDOWS NT$"
Class = HIDClass
ClassGuid ={745a17a0-74d3-11d0-b6fe-00a0c90f57da}
Provider = %ProviderName%
DriverVer = 08/13/2023,16.5.5.7
CatalogFile = SpbDriver.cat
PnpLockdown = 1
[DestinationDirs]
DefaultDestDir = 13
[SourceDisksNames]
1 = %DiskId1%,,,""
[SourceDisksFiles]
SpbDriver.sys = 1,,
[Manufacturer]
%StdMfg%=Standard,NTamd64
[Standard.NTamd64]
%SpbDriver.DeviceDesc%=SpbDriver_Device, ACPI\25DV0053
%SpbDriver1.DeviceDesc%=SpbDriver_Device, ACPI\25DV0057
%SpbDriver2.DeviceDesc%=SpbDriver_Device, ACPI\I2C30001
%SpbDriver3.DeviceDesc%=SpbDriver_Device, ACPI\SPI1001
[SpbDriver_Device.NT]
CopyFiles=Drivers_Dir
[SpbDriver_Device.NT.HW]
AddReg=SpbDriver_AddReg
[Drivers_Dir]
SpbDriver.sys
[SpbDriver_AddReg]
HKR,Settings,"ConnectInterrupt",0x00010001,1
[SpbDriver_Device.NT.Services]
AddService = SpbDriver,%SPSVCINST_ASSOCSERVICE%, SpbDriver_Service_Inst
[SpbDriver_Service_Inst]
DisplayName = %SpbDriver.SVCDESC%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %13%\SpbDriver.sys
[Strings]
SPSVCINST_ASSOCSERVICE= 0x00000002
ProviderName = "www.youyeetoo.com"
StdMfg = "(Standard system devices)"
DiskId1 = "SPB Driver Peripheral Installation Disk #1"
SpbDriver.DeviceDesc = "25DV0053 NFC I2C4 Address 0X53"
SpbDriver.SVCDESC = "SPB Driver Peripheral desc"
SpbDriver1.DeviceDesc = "25DV0057 NFC I2C4 Address 0X57"
SpbDriver2.DeviceDesc = "I2C30001 Address 0X50"
SpbDriver3.DeviceDesc = "SPI1001 Driver"
ClassName = "I2C"
其中文件中最关键的2行,也是根据实际情况修改的2行,如下:
[Standard.NTamd64]
; 驱动匹配的设备ID为I2C30001
%SpbDriver2.DeviceDesc%=SpbDriver_Device, ACPI\I2C30001
[Strings]
; 在设备管理器里面设备显示描述
SpbDriver2.DeviceDesc = "I2C30001 Address 0X50"
四、安装驱动程序
在以上步骤修改好后,在"SpbDriver.inf"文件鼠标右键选"安装",系统弹出提示,选"始终安装驱动程序",过一会就出现安装成功弹窗.在设备管理器中"人机接口设备"中,可以看到已经成功安装该I2C设备驱动程序了,如图:
五、I2C设备读写测试
我们提供C#样例程序,演示I2C读写测试,如图
|注意:I2C从机设备地址和通讯速率需要在主板ASL CODE 中设置和修改
操作流程:
1)先"连接I2C设备"
2)填写寄存器地址,有的设备寄存器地址是1个字节,有的设备寄存器地址是2个字节,根据具体I2C设备进行填写.
3)可以进行读写操作.
可以采用USB转I2C从机模块进行模拟I2C从机,如图:
该模块和电脑USB链接,I2C相关引脚和开发连接如下:
主板J2301接口线序 | 用途 | 模拟模块标注中1和2 |
---|---|---|
1 | 3V3 | 不接:因为改模块已经供电无需接开发板的供电 |
2 | I2C3_SCL | SCL |
3 | I2C3_SDA | SDA |
4 | GND | GND |
在电脑上软件配置,如图左侧参数部分:设置USB转I2C从机模式,地址位数:7位,地址为50,测试寄存器写00,然后点"设置参数"
这里的设备地址50,和主板ASL CODE中描述的I2C从机设备地址要一致.
开发版的I2C测试软件,连接I2C设备后,点"写数据到寄存器",这样模拟I2C从机的软件就显示接受到开发版发来的数据.
接着在开发版的I2C测试软件,点"读取寄存器数据",会在I2C测试软件界面上看到从模拟I2C从机模块读到的数据.
注意:PC模拟软件,设置为I2C从机,相当于模拟一个I2C存储设备,需要先向寄存器地址写内容,再读出才是相同内容.否则可能是其他值.
测试软件下载:
Execution File
驱动程序
测试软件源码下载:
Source Code