ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 2440外扩CAN总线

2440外扩CAN总线

原创 Linux操作系统 作者:cifra_guokun 时间:2009-01-05 11:12:34 0 删除 编辑

    最近需要增加一个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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-04-07

  • 博文量
    92
  • 访问量
    304141