基于LPC2131嵌入式系统的CAN模块设计与实现

技术分类: 嵌入式系统  | 2007-04-27
来源:电子产品世界 杨龙山

  软件设计

  对SJA1000的读写访问

  由于LPC2131的48个引脚全是IO,所以首先需要通过软件模拟读写SJA1000的时序,来对SJA1000进行操作,进而完成CAN通讯功能。

  依据SJA1000在Intel模式下的读写时序[4],可编写LPC2131通过CAN控制器SJA1000发送数据的写函数void WriteCan(uint8 Addr,uint8 Data)和接受CAN控制器所接受的数据的读函数uint8 ReadCan(uint8 Addr),其中Addr为SJA1000相应的寄存器的地址,Data为LPC2131所发送的数据,读函数ReadCan可返回所接受的数据。

  CAN通讯的实现

  要实现一个CAN通讯需要实现3个功能模块:对SJA1000的初始化模块;数据发送模块;数据接受模块。

  ·对SJA1000的初始化模块

  在开始通讯之前,首先要在SJA

1000的各个功能寄存器进行设置,包括模式寄存器,波特率,时钟分频器,中断使能寄存器,,滤波寄存器,输出控制寄存器。

  uint8 IniSJA1000(uint8 BTR0,uint8 BTR1)

  {

  IO0CLR=CS;      //片选SJA1000

  WriteCan(0,0x09);  //进入复位模式

  WriteCan(31,0xe8); //设置时钟分频器

  WriteCan(4,0xfd);  //设置中断使能寄存器

  WriteCan(16,AcceptCode1);//设置验收代码1

  WriteCan(17,AcceptCode2);//设置验收代码2

  WriteCan(18,AcceptCode3);//设置验收代码3

  WriteCan(19,AcceptCode4);//设置验收代码4

  WriteCan(20,MaskCode1); //设置验收屏蔽1

  WriteCan(21,MaskCode2); //设置验收屏蔽2

  WriteCan(22,MaskCode3); //设置验收屏蔽3

  WriteCan(23,MaskCode4); //设置验收屏蔽4          

  WriteCan(6,BTR0); //设置总线时序寄存器1

  WriteCan(7,BTR1); //设置总线时序寄存器2

  WriteCan(8,0xfa);  //设置输出控制积存器

  WriteCan(0,0x08);  //进入操作模式

  OSCANMbox=OSMboxCreate(0);/建立CAN通讯邮箱

  if (OSCANMbox==NULL)

  {

  return FALSE;

  }

  return TRUE;

  }

  ·数据发送模块

  假设要发送的数据的ID存储在数组ID[4]中,数据存储在数组SendData[8]中,其发送模块程序如下所示,其中参数DLC为发送的字节数,FF为帧类型,即0为数据帧,1为远程帧。

  void Tx(uint8 DLC,uint8 FF)

  {

  uint8 i;

  OS_ENTER_CRITICAL();

  If (FF==0x01)

  {

  WriteCan(16,DLC+0x80);     //数据帧

  }

  else

  {

  WriteCan(16,DLC+0xd0);    //远程帧

  }

  WriteCan(17,ID[0]);

  WriteCan(18,ID[1]);

  WriteCan(19,ID[2]);

  WriteCan(20,ID[3]);         //TX标识码

  for (i=0;i

  WriteCan(21+i,sentdata[i]); //TX数据

  WriteCan(1,0x01);//设置发送寄存器发送

  OS_EXIT_CRITICAL();

  }

1】【2】【3
加载中

对文章的评论

剩余字数:  

浏览该文章的用户还看过...

  • 文 章

  • 论 坛

  • 博 客

  • 小 组

设计资源与分销