电子文章 | 电子资料下载 | 家电维修 | 维修资料下载 | 加入收藏 | 全站地图
您现在所在位置:电子爱好者电子文章接口定义CAN总线与PC机串口通信适配器设计与实现

CAN总线与PC机串口通信适配器设计与实现

11-20 14:46:26 | http://www.5idzw.com | 接口定义 | 人气:860
标签:接口技术,微机原理与接口技术,单片机原理与接口技术,http://www.5idzw.com CAN总线与PC机串口通信适配器设计与实现,http://www.5idzw.com

  txtReceive. Text= txtReceive. Text+ Trim(MSComm1. Input)&vbCrLf

  Case comEvSend  传输缓冲区有Sthreshold 个字符

  End Select

  End Sub

  Private SuBtxtThreshold Change ( ) p阈值设定文本框的Change事件

  MSComm1. Rthreshold = Val (txtThreshold. Text) p当设定的阈值变化时,实时改变通讯对象的属性

  End Sub

  AT89C51单片机部分

  单片机部分采用C语言编程。C语言编程具有快捷、模块功能强大、可靠性好、效率高等优点。其中程序初始化包括设定串口工作方式,定时器、中断寄存器初始化,各变量的初始化。

  TMOD = 0x20; //定时器1为发生器

  SCON= 0x50; //串口工作方式1

  TH1= 0xfd ; //设定波特率= 9600bit/s

  TL1= 0xfd ;

  EA= 1; //开中断

  ES= 1; //允许串口中断

  TR1= 1; //启动定时器T1

  SPECHAR = 0xff ; //设定通讯开始标志

  程序采用中断接收,查询发送的方式。串口中断服务程序流程图如图3所示。


  SJA1000控制器部分

  初始化子程序CANINIT()

  选用CAN2. 0协议构建CAN总线控制网络,对SJA1000的初始化主要包括工作方式的设置、验收代码寄存器ACR、验收屏蔽寄存器AMR、波特率的参数设置等。

  void canàinit(void) /*SJA1000的初始化子函数*/

  {control = 1; /*禁止超载、出错及接收中断,并置复位请求位使其进入复位状态*/

  while (control&0x01== 0);

  acceptanceàcode = 0x01; /*验收码寄存器(存机号1号)*/

  acceptanceàmask= 0xfe ; /*验收屏蔽码寄存器*/

  busàtimingà0= 0x03; /*总线定时寄存器0,同步跳转宽度

  T0= T,BPS= 125 k*/

  busàtimingà1= 0x18; /*总线定时寄存器1,T1= 9T,T2=2T,波特率为500kbit/S*/

  outputàcontrol = 0x1A; /*正常输出方式,TX1引脚悬浮*/

  clockàdivider = 0x40; /*BASICCAN模式,RX1接固定电平*/

  control = 0x1A; /*清复位请求,使其进入工作状态*/

  }

  发送canàsend()

  发送子程序负责节点报文的发送,由CAN控制器SJA1000独立完成,将命令寄存器里的发送请求标志置位,即可发送SJA1000发送缓冲区中的报文。

  void canàsend(unsigned char ID ,char*xdata) /*该子函数完成一帧数据的发送*/

  {while ( (status&0x10)>> 4 == 1)àNOPà; /*检查上次请求发送是否完成*/

  while ( (status&0x04)>> 2== 0)àNOPà;

  Transmitbuffer1= ID;

  Transmitbuffer2= 0x08;

  Transmitbuffer3= txdata[0] ;

  Transmitbuffer10= txdata[7] ;

  Command = 0x05 ; /*发送请求*/

  while ( (status&0x08)>> 3== 0);

  }

  接收子程序canàreceive ()

  接收子程序负责节点报文的接收。SJA1000自动接收发往该节点的数据并将收到的数据放到它的接收缓冲器中。

  SJA1000的报文接收主要有2种方式:中断接收方式和查询接收方式。系统采用的是中断接收方式。

  {unsigned char ir ;

  ir = interrupt; /*获得SJA1000的中断状态*/

  EA= 0;

  If ( (ir&0x04)>> 2== 1)error ( ); /*如果是出错中断,则调出错处理函数*/

  If ( (ir&0x08)>> 3== 1)overruN( ); /*如果是超载中断,则调超载处理函数*/

  While ( ( (ir&0x04)>> 2== 1)‖( ( (ir&0x08)>> 3)== 1){àNOPà;}

  RxID[0] = Receivebuffer1;

  RxID[0] = Receivebuffer2;

  If ( ( (Receivebuffer2&0x10)>> 4)== 0) /*如果是数据帧,则接收数据*/

  {Rxdata[0] = Receivebuffer3;

  .

  Rxdata[7] = Receivebuffer10;

  Command = 0x04 ; /*SJA1000的接收缓存器被释放*/

  }

  else if ( ( (Receivebuffer2&0x10)>> 4)== 1) /*如果是远程帧,则作相应处理*/

  {  /*相应处理程序*/

  EA= 1;

  }

  }

  结束语

  介绍了一种低成本、高可靠性、快捷的通用型CAN总线与PC机通过RS-232串口互连方案。该互连方案很好地保证了管理监控层和现场生产测控层之间的连接,方便了上下层信息交流,满足工厂、变电站等工业场合的应用要求。


上一页  [1] [2] 

,CAN总线与PC机串口通信适配器设计与实现