最近需要增加一个CAN的驱动(MCP2510),而在板子上的是与SPI接口相连,先说说基本的原理吧:
2440没有集成CAN控制器,那么就需要在外接一个CAN的控制器,现选择了MCP2510。mcp2510通过SPI与2440通讯,通过mcp2510来扩展2440的CAN接口,可以降低硬件电路的复杂度。
具体到驱动中,是nk运行之后,启动加载spi.dll之后,然后通过spi的驱动初始化CAN控制器(MCP2510)。工作流程是SPI的驱动中去调用CAN的驱动(当然也可以单独把CAN驱动做成一个DLL,由系统自动加载,但要注意,SPI.dll要在Can.dll之前加载,因为CAN的驱动程序的工作要用到SPI的驱动)。
首先要将SPI驱动加到nk当中去,要修改并增加以下内容:
1、/driver/dir文件中增加spi内容,这样在编译的时候就可以去编译/driver/spi目录了;
2、注册表文件platform.reg文件中增加:
IF BSP_NOSPI !
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Spi]
"Prefix"="SPI"
"Dll"="spi.dll"
"Index"=dword:1
"Order"=dword:0
ENDIF BSP_NOSPI !
3、platform/my_project/smdk2440.bat文件中增加“SET BSP_NOSPI=”;
4、platform.bib文件中增加动态库:
IF BSP_NOSPI !
spi.dll $(_FLATRELEASEDIR)\spi.dll NK SH
ENDIF BSP_NOSPI !
5、在cfw.c、armint.c文件中增加相应的中断代码(略)。
其次就是写读写mcp2510寄存器的函数详细以下代码:
读mcp2510寄存器:
void SPI_WriteMCP2510(UCHAR char1,UCHAR char2,int parameter_number)
{
// Config GPG3 is Master SPI CS
v_pIOPregs->rGPGCON &= ~(0x3 << 4);
v_pIOPregs->rGPGCON |= (0x1 << 4);
v_pIOPregs->rGPGUP |= (0x1 << 2);
// Initialize CS is low
v_pIOPregs->rGPGDAT &= ~(0x1 <<2);
v_pSSPregs->rSPTDAT0 = 0x02;
while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );
v_pSSPregs->rSPTDAT0 = char1; // Write MCP41010 write command
if (parameter_number == 2)
while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );
v_pSSPregs->rSPTDAT0 = char2; // Write Potentiometer value
// Wait to complete write data
while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );
v_pIOPregs->rGPGDAT |= (0x1 <<2);
}
写mcp2510寄存器:
UCHAR SPI_ReadMCP2510(UCHAR Addr)
{
UCHAR SPI_RegAddr,return_char;
SPI_RegAddr = Addr;
// Config GPG3 is Master SPI CS
v_pIOPregs->rGPGCON &= ~(0x3 << 4);
v_pIOPregs->rGPGCON |= (0x1 << 4);
v_pIOPregs->rGPGUP |= (0x1 << 2);
// Initialize CS is low
v_pIOPregs->rGPGDAT &= ~(0x1 <<2);
v_pSSPregs->rSPTDAT0 = 0x03;
while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );
v_pSSPregs->rSPTDAT0 = SPI_RegAddr;
while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );
v_pSSPregs->rSPTDAT0 = 0xff;
while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );
return_char= v_pSSPregs->rSPRDAT0;
while( (v_pSSPregs->rSPSTA0 & 0x01) != 1 );
v_pIOPregs->rGPGDAT |= (0x1 <<2);
return return_char;
}
只要这两个函数写对了,你离成功也就不远了。
mcp2510的初始化时一定要注意波特率的计算!!!!
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13771794/viewspace-526722/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/13771794/viewspace-526722/