Wince6环境下OMAP3530平台SPI接口调试笔记
guyue3988 2012年2月1日13:14:45
1、 开发平台:SBC8100,开发环境:VS2005
2、 SBC8100的30pin多功能扩展接口中SPI1接口有4个引脚:SPI1_CLK; SPI1_CS0; SPI1_SIMO; SPI1_SOMI;
3、 参考TI官方Omap3530 wince6 SDK开发包:http://www.ti.com.cn/tool/cn/wincesdk-a8。
安装后查看其自带的SPI测试程序: \WINCE600\PLATFORM\EVM_OMAP3530\SRC\test\Tux_SPI。
VS2005中新建SPI_Test的MFC应用程序,把Tux_SPI复制过来,编译出现很多错误。原因sdk_spi.h在SBC8100中没有,把它copy过来,同时注释g_pKato相关代码行,重新编译通过OK~。
4、 设断点调试发现,hSpi = CreateFile(/*DeviceName*/L"SPI1:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);执行以后hSpi一直为空,查找原因,原以为PIN_MOD没有设置好,检查之:\WINCE600\PLATFORM\SBC8100\SRC\BOOT\XLDR中的platform.c文件中有关SPI1的管脚配置如下:
// MCSPI1
OUTREG16(&pConfig->CONTROL_PADCONF_MCSPI1_CLK, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0)); /*MCSPI1_CLK*/
OUTREG16(&pConfig->CONTROL_PADCONF_MCSPI1_SIMO, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0)); /*MCSPI1_SIMO*/
OUTREG16(&pConfig->CONTROL_PADCONF_MCSPI1_SOMI, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_0)); /*MCSPI1_SOMI*/
OUTREG16(&pConfig->CONTROL_PADCONF_MCSPI1_CS0, (INPUT_DISABLE | PULL_INACTIVE | MUX_MODE_0)); /*MCSPI1_CS0*/
OUTREG16(&pConfig->CONTROL_PADCONF_MCSPI1_CS1, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_4)); /*GPIO_175 (touch irq)*/
OUTREG16(&pConfig->CONTROL_PADCONF_MCSPI1_CS2, (INPUT_ENABLE | PULL_INACTIVE | MUX_MODE_4)); /*GPIO_176 (eth irq)*/
OUTREG16(&pConfig->CONTROL_PADCONF_MCSPI1_CS3, (INPUT_DISABLE | PULL_INACTIVE | MUX_MODE_4)); /*GPIO_177 (GPIO Expansion bus)*/
配置显示这几个管脚已设置为SPI1功能模式,没有错啊!打电话给Timll工程师,给的解决方案就是检查PIN_MOD的设置,然后不知所然,陷入纠结当中。
5、 无意间想到工程的批处理文件对驱动的加载有着莫大联系,于是马上检查SBC8100.bat,果然啊!!有重大发现“set BSP_NOSPI1=1”,结合 platform.reg中“IF BSP_NOSPI !”和“IF BSP_NOSPI1 !”,问题就出在这里啊,如果设为1那么驱动spi.dll就不加载,激动着把它改为:“set BSP_NOSPI1=”,然后Sysgen,重新烧写系统到Flash,测试发现CreateFile成功,hSpi不为空!
接下来测试SPI_Configure():
if(!DeviceIoControl(hSpi, IOCTL_SPI_CONFIGURE, &SpiConfigure, sizeof(SpiConfigure), NULL, 0, &dwBytesReturned, NULL)) { bRet = FALSE; goto CLOSE; }
SPI_Configure成功!
测试SPI_WriteRead():
if(!DeviceIoControl(hSpi, IOCTL_SPI_WRITEREAD, pInBuffer, sizeof(pInBuffer), pOutBuffer, sizeof(pOutBuffer), &dwBytesReturned, NULL)) { bRet = FALSE; goto CLOSE; }
if条件一直为TURE,重新进入Close,分析之:
SPI_Open(), SPI_Configure()都已经成功,而SPI_ WriteRead ()失败,说明驱动中SPI_ WriteRead函数有问题,检查SBC8100中SPI相关的驱动:\WINCE600\PLATFORM\SBC8100\SRC\CSP\OMAP3430\SPI,其中通过spi.c打开spi.h,发现spi.h中有如下定义:#define SPI_DEVICE_NAME L"SPI2:"
而且spi.c中SPI_IOControl部分中的switch (dwCode)也没有IOCTL_SPI_WRITEREAD这一分支!靠!联想到SBC8100平台中SPI接口只有在触摸屏上有应用,明白了!!SBC8100自带的SPI驱动spi.dll实际上只有SPI2的驱动,SPI1、3、4的驱动加载的也是spi.dll,我们如果打开SPI1设备且SPI_ WriteRead ()那就理所当然的失败啊!!!
解决方法:参考\WINCE600\PLATFORM\SBC8100\SRC\CSP\OMAP3430\SPI
以及\WINCE600\PLATFORM\COMMON\SRC\SOC\COMMON_TI_V1\COMMON_TI\SPI,自己编写SPI1的驱动并输出为spidriver.dll,更改platform.reg内容如下:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SPI1]
"Prefix"="SPI"
"Dll"="spidriver.dll"
然后Sysgen,重新烧写系统到Flash,测试之,SPI_ WriteRead ()成功!!!!