Wince6环境下OMAP3530平台SPI接口调试笔记

来源:互联网 发布:快走丝hl编程系统视频 编辑:程序博客网 时间:2024/06/06 23:55
 

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 ()成功!!!!

原创粉丝点击