微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > RS485-CAN 转换器的设计

RS485-CAN 转换器的设计

时间:12-20 来源:互联网 点击:

定义。最终在RS485总线中传输还是以帧为单位,其中包含了地址信息。RS485设备会自动根据接收到的帧,自动判断该帧是否发往本节点,然后做出相应处理。因此,在RS485设备要发送数据时,RS485-CAN总线转换器只需把RS485总线的数据进行帧打包后送入CAN的数据帧中,然后发送到CAN网络上;而RS485设备在接收数据时,RS485-CAN总线转换器则把RS485总线的数据帧从接收到的CAN数据帧中提取出来,发往RS485设备即可。


图4:RS485-CAN 协议模型

  3.1CAN 接口软件设计

  CAN总线数据链路层结构可分为逻辑链路控制(LLC)子层和媒体访问控制(MAC)子层。LLC子层主要完成帧接收滤波,超载通告和恢复管理,而MAC子层结构功能模块包括发送和接收两个部分。对于CAN总线数据链路层的各种协议已经被集成到SJA1000芯片中,应用时只要对SJA1000芯片的控制寄存器进行相应的初始化即可进行通信,而数据的接收和发送等也是通过读写SJA1000内部寄存器来实现的。这里只给出SJA1000的初始化源程序,其它程序可参考文献[2]进行编写。

  SJA1000开始工作之前,首先要判断SJA1000与微处理器的连接是否正确,在确认正确后开始SJA1000的初始化,之后SJA1000进入工作模式,然后才可以进行数据的读写。

  typedef struct _CAN_PORTSTRUCT /*SJA1000初始化配置文件结构体*/

  {

  FIL filter; /*滤波方式*/

  LIS lisen; /*只听模式/正常模式*/

  TES test; /*自测试模式/正常模式*/

  SLE sleep; /*睡眠模式设置*/

  BAUD baud_rate; /*波特率*/

  MODEL workmodel ; /*工作模式*/

  UCHAR mask1;

  UCHAR mask2;

  UCHAR mask3;

  UCHAR mask4;

  UCHAR code1;

  UCHAR code2;

  UCHAR code3;

  UCHAR code4;

  }CAN_PORT,*CANPORTPTR;

  STATUS sja1000Init(CANPORTPTR pDev) /*SJA1000初始化*/

  {

  UCHAR value;

  canBoardInit(); /*进入复位模式*/

  canBoard_canOutByte(SJA1000_MOD,MOD_RM); /*确定CAN控制器工作模式*/

  value = canBoard_canInByte(SJA1000_CDR);

  if(pDev->workmodel == Peli) value|= PeliCAN ;

  else value &= ~PeliCAN;

  /*设置模式寄存器(只在PeliCAN模式可访问)*/

  canBoard_canOutByte(SJA1000_CDR,value|0x48);

  value = canBoard_canInByte(SJA1000_MOD);

  if(pDev->sleep == SNORM) value &=~(MOD_SM); /*睡眠模式*/

  else value|= MOD_SM; /*正常模式*/

  if(pDev->lisen == LNORM) value&= ~(MOD_LOM); /*正常模式*/

  else value|= MOD_LOM; /*只听模式*/

  if(pDev->test == TNORM) value&= ~(MOD_STM); /*正常模式*/

  else value|= MOD_STM; /*自检测模式*/

  if(pDev->filter == SINGLE) value|= MOD_AFM; /*单向验收滤波*/

  else value &=(~MOD_AFM); /*双向验收滤波*/

  canBoard_canOutByte(SJA1000_MOD,value);

  switch (pDev->baud_rate)

  {

  case B20: //波特率为20kpbs

  canBoard_canOutByte(SJA1000_BTR0,0x07);

  canBoard_canOutByte(SJA1000_BTR1,0x7F);

  break;

  case B80: //波特率为80kpbs

  canBoard_canOutByte(SJA1000_BTR0,0x01);

  canBoard_canOutByte(SJA1000_BTR1,0x7F);

  break;

  case B250: //波特率为250kpbs

  canBoard_canOutByte(SJA1000_BTR0,0x00);

  canBoard_canOutByte(SJA1000_BTR1,0x1C);

  break;

  case B500: //波特率为500kpbs

  canBoard_canOutByte(SJA1000_BTR0,0x00);

  canBoard_canOutByte(SJA1000_BTR1,0x14);

  break;

  default: //默认波特率为20kpbs

  canBoard_canOutByte(SJA1000_BTR0,0x07);

  canBoard_canOutByte(SJA1000_BTR1,0x7F);

  }

  canBoard_canOutByte(SJA1000_CMR,0); /*设置命令寄存器*/

  canBoard_canOutByte(SJA1000_EWLR,0x60); /*设置错误报警限额寄存器*/

  canBoard_canOutByte(SJA1000_IER,0); /*不使能所有中断*/

  canBoard_canOutByte(SJA1000_OCR,0xaa); /*输出控制寄存器设置*/

  canBoard_canOutByte(SJA1000_TXERR,0x0); /*设置发送错误计数器*/

  canBoard_canOutByte(SJA1000_RXERR,0x0); /*设置接受错误计数器*/

  canBoard_canOutByte(SJA1000_RMC,0); /*设置接收报文计数器*/

  canBoard_canOutByte(SJA1000_ACR0,pDev->code1);

  canBoard_canOutByte(SJA1000_ACR1,pDev->code2); /*设置验收代码寄存器*/

  canBoard_canOutByte(SJA1000_ACR2,pDev->code3);

  canBoard_canOutByte(SJA1000_ACR3,pDev->code4);

  canBoard_canOutByte(SJA1000_AMR0,pDev->mask4);

  canBoard_canOutByte(SJA1000_AMR1,pDev->mask4); /*设置验收屏蔽寄存器*/

  canBoard_canOutByte(SJA1000_AMR2,pDev->mask4);

  canBoard_canOutByte(SJA1000_AMR3,pDev->mask4);

  return OK;

  }

  3.2 RS485接口软件设计

RS4

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top