给你一些意见,我自己总结的,不知道对不对!
1,如何编译出spi.dll文件
BSP默认是不生成spi.dll文件 的,可以通过设置smdk210.bat文件中的BSP_NOSPI=1设置为BSP_NOSPI=即可,因为
在source文件中添加了!if "$(BSP_NOSPI)" == "1" SKIPBUILD= 1 !endif 选项
2,spi_INITFail Error KernelIoControl问题
找到原因是isri.dwIrq的值为-1
解决办法:在DDKReg_GetIsrInfo的定义 中看到
// 如果注册表中没有指定IRQ值,dwIrq将被设置为IRQ_UNSPECIFIED。
// 如果注册表中没有指定SYSINTR值,dwSysintr将被设置为IRQ_UNSPECIFIED。 设置为SYSINTR_NOP。
这里需要设置配额WRITE_REG_DWORD(DrvKey,L"Irq", DriverIRQ); DriverIRQ为spi的物理中断号
不需要设置Sysintr,一般采用动态申请的方式。
还要设置WRITE_REG_DWORD(DrvKey,L"DeviceArrayIndex", DriverDeviceArrayIndex);这是什么我也不知道
3,对spi的初始化
static void InitSpiConfig(BOOL 模式)
{
if (mode)//master
{
spiConfig.dwMode = SPI_MASTER_MODE;< /p>
}
else//从机
{
spiConfig.dwMode = SPI_SLAVE_MODE;
}
/*接收发送使用中断模式,不使用DMA模式*/
spiConfig.bUseRxDMA = FALSE;
spiConfig.bUseRxIntr = TRUE;
< p> spiConfig.bUseTxDMA = FALSE;spiConfig.bUseTxIntr = TRUE;
spiConfig.dwLineStrength = 0;
spiConfig.dwFBClkSel = 0;
>spiConfig.Format = SPI_FORMAT_1;
/*设置SPI的预频率和超时值*/
spiConfig.dwTimeOutVal = 0;
spiConfig.dwPrescaler = 120;
if( DeviceIoControl(hdDevice, SPI_IOCTL_SET_CONFIG, &spiConfig, sizeof(spiConfig), NULL, NULL, NULL, NULL)!=TRUE )
{
RETAILMSG(1, (TEXT("[SPI1] SPI_IOCTL_SET_CONFIG 失败\r\n")));
}
if( DeviceIoControl(hdDevice, SPI_IOCTL_START, NULL, NULL, NULL, NULL, NULL, NULL)!=TRUE )
{
RETAILMSG(1, (TEXT("[SPI1] SPI_IOCTL_START 失败\r\n")));
}
}
如果还是不行的话,再问吧!