硬件接口说明:
主板上J2304插座对应CPU的SPI1,插座线序说明:
序号 | 说明 | 备注 |
---|---|---|
1 | VCC | 3.3V电源 |
2 | CLK | SPI时钟 |
3 | MOSI | |
4 | MISO | |
5 | CS | 片选 |
6 | GND | 电源地 |
1.1 SPI有4种模式,如下:
CPOL(时钟极性) 和 CPHA(时钟相位) 的不同组合,形成了SPI总线的不同模式.不同SPI从设备支持的模式.
模式 | CPOL | CPHA |
---|---|---|
模式一 | 0 | 0 |
模式二 | 0 | 1 |
模式三 | 1 | 0 |
模式四 | 1 | 1 |
1.2 时序图样例
添加方法:请参考"Windows驱动开发"描述后面部分"新设备加入到系统"流程,这里仅说明需要添加的ASL代码(注意:下面用了中文注解关键信息,根据实际硬件进行修改。需要强调的是正式ASL代码中不能出现中文,使用时候删除掉中文注解或者换成英文注解):
以下ASL 代码添加一个SPI设备,根据实际情况,主要修改关键3项:
项目 | 描述值 | 备注 |
---|---|---|
设备驱动ID | SPI1001 | 驱动程序对应的关联硬件ID |
SPI模式 | . | 以下列出4种模式,根据从设备选择对应模式,并屏蔽其他3种模式 |
SPI速率 | 0X89544 | SPI速率,这里是562.5k |
Scope (_SB.PC00.SPI1)
{
Device (SSPI)
{
Name (_ADR, Zero) // _ADR: Address
Name (_HID, "SPI1001") // _HID: Hardware ID
Name (_CID, "SPI1001") // _CID: Compatible ID
Name (_UID, "SPI1001") // _UID: Unique ID
Method(_CRS, 0x0, NotSerialized)
{
Name (RBUF, ResourceTemplate ()
{
// ---model 0--- 562.5k=0X89544
SpiSerialBus (0x0000, PolarityLow, FourWireMode, 0x08,ControllerInitiated, 0X89544, ClockPolarityLow,ClockPhaseFirst,
"\\_SB.PC00.SPI1", 0x00, ResourceConsumer, , )
// ---model 1---
// SpiSerialBus (0x0000, PolarityLow, FourWireMode, 0x08,ControllerInitiated, 0X89544, ClockPolarityLow,ClockPhaseSecond,
// "\\_SB.PC00.SPI1", 0x00, ResourceConsumer, , )
// ---model 2---
// SpiSerialBus (0x0000, PolarityLow, FourWireMode, 0x08,ControllerInitiated, 0X89544, ClockPolarityHigh,ClockPhaseFirst,
// "\\_SB.PC00.SPI1", 0x00, ResourceConsumer, , )
// ---model 3---
// SpiSerialBus (0x0000, PolarityLow, FourWireMode, 0x08,ControllerInitiated, 0X89544, ClockPolarityHigh,ClockPhaseSecond,
// "\\_SB.PC00.SPI1", 0x00, ResourceConsumer, , )
})
Return(RBUF)
}
Method (_STA, 0, NotSerialized) // _STA: Status
{
Return (0x0F)
}
}
}
SPI设备添加到BIOS后,可以从设备管理器里面查看到:未知设备,对应的硬件ID和ASL代码中描述_HID (SPI1001)一样的
我们将提供SPI驱动程序,把硬件ID SPI1001 添加到驱动安装文件"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为SPI1001
%SpbDriver3.DeviceDesc%=SpbDriver_Device, ACPI\SPI1001
[Strings]
; 在设备管理器里面设备显示描述
SpbDriver3.DeviceDesc = "SPI1001 Driver"
如果你安装的系统不是我们释放的固件,那你需要本节内容,如果用的是我们的系统则默认带了驱动了,这步可以跳过。
在以上步骤修改好后,在"SpbDriver.inf"文件鼠标右键选"安装",系统弹出提示,选"始终安装驱动程序",过一会就出现安装成功弹窗.在设备管理器中"人机接口设备"中,可以看到已经成功安装该SPI设备驱动程序了
我们提供C#样例程序,演示SPI读写测试,如图
|注意:SPI从机设备通讯模式和通讯速率需要在主板ASL CODE 中设置和修改
操作流程:
1)先"连接SPI设备"
2)操作:
"SPI仅写":只写不读,需要根据从设备的通讯时序选择该操作.
"SPI先写后读":先写数据给从设备,后续读数据,需要根据从设备的通讯时序选择该操作.
"SPI同步写读":边写数据给从设备同时从设备读数据,需要根据从设备的通讯时序选择该操作.
可以采用USB转SPI从机模块进行模拟SPI从机,如图:
该模块和电脑USB链接,SPI相关引脚和开发连接如下:
主板J2304接口线序 | 用途 | 模拟模块标注中1和4 |
---|---|---|
1 | VCC | 不接:因为改模块已经供电无需接开发板的供电 |
2 | CLK | SCK |
3 | MOSI | MOSI |
4 | MISO | MISO |
5 | CS | CS |
6 | GND | GND |
在电脑上软件配置,如图左侧参数部分:设置USB转SPI从机模式,帧格式:MSB,SPI模式:模式00,然后点"设置参数"
这里的模式00,要和主板ASL CODE 中采用的模式要一一对应,否则通讯数据有问题.
开发版上SPI测试软件,连接SPI设备后,点"SPI同步写读",会看到SPI模拟从机软件会接收到测试软件发来的数据,并返回同步读的数据,同步读写,模拟设备软件会延后一个字节(具体见该模拟软件说明).
测试软件下载:
Execution File
驱动程序
测试软件源码下载:
Source Code
6.1若不是我们提供的windows系统安装包,自行安装其他版本windows系统,系统默认的SPI驱动,在"人体输入设备"中找不到SPI节点.
处理方法如下:
先卸载系统默认的SPI芯片驱动:在"系统设备"中,找到Intel(R) SPI (flash) Controller - 4DA4"
卸载系统默认的SPI芯片驱动后,需要换我们提供的SPI芯片驱动(驱动包里面有2个文件夹,需要先安装SPI驱动,再安装芯片驱动),换好后,重启windows系统就可以看到SPI节点了。
SPI芯片驱动V3