EDN China > 设计实例 > 嵌入式系统 > 开发工具 > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

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

来源:电子产品世界 杨龙山?? 2007年04月27日 ?? 收藏0

  软件设计

  对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.选择分享给朋友
?? ??

LPC2131? CAN总线? ARM? μCOS-II?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈