《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于CAN总线的PC机与单片机的多点通信
基于CAN总线的PC机与单片机的多点通信
2015年微型机与应用第15期
刘 登,李国利,陈 健,张恺钰,时 光
(金陵科技学院 机电工程学院,江苏 南京 211169)
摘要: 设计了一种基于CAN总线的PC机与单片机多点通信系统。系统包括PC机、STC89S52单片机、CAN接口控制器、串行收发器等。介绍了USB转CAN通信接口的通信节点设计方案,给出了各通信节点的硬件电路和软件设计,最后进行了系统通信实验,结果表明该系统具有可靠性高、抗干扰能力强等特点。
Abstract:
Key words :

  摘  要: 设计了一种基于CAN总线的PC机与单片机多点通信系统。系统包括PC机、STC89S52单片机、CAN接口控制器、串行收发器等。介绍了USB转CAN通信接口的通信节点设计方案,给出了各通信节点的硬件电路和软件设计,最后进行了系统通信实验,结果表明该系统具有可靠性高、抗干扰能力强等特点。

  关键词: CAN总线;单片机;多点通信

0 引言

  传统的单片机串口通信中大多采用RS232或RS485串口,因其传输速率和距离(小于1.5 km)的限制,已渐渐不能满足用户系统需求,而CAN总线因其卓越的性能,被广泛应用到汽车工业、自动控制、楼宇自动化、医学设备等各个领域[1]。CAN(Controller Area Network,控制器局域网)属于现场总线的范畴,是一种有效支持分布式控制或实时控制的串行通信网络,是国际上应用最广泛的现场总线之一[2-3]。CAN可以组建多主对等的总线通信系统;具有非破坏性总线仲裁技术,让优先级高的信息得到更快速的处理;具有强大的错误检测机制,可以检测到总线上的任何错误;采用短帧结构、位填充和CRC校验等措施,使传输具有高可靠性。这些优点使得CAN总线特别适用于工业过程监控设备的互联。在所有的CAN转接口中,USB速度快,即插即用,使用更加广泛,采用USB转CAN总线实现单片机与上位机的通信具有一定的研究与应用意义[4]。

1 系统硬件设计

  1.1 系统总体设计

001.jpg

  系统的总体结构如图1所示,硬件电路主要包括USB转CAN通信接口以及各个通信节点,每个节点由CAN收发器TJA1050、CAN控制器SJA1000和单片机STC89S52组成,CAN总线两端应串接120 ?赘的电阻,该电阻对于匹配总线阻抗起着重要作用。系统主要实现的功能为:PC机通过USB转CAN通信接口向CAN总线发送一帧CAN总线数据,相应节点在接收到CAN消息后,存储在SJA1000的接收缓冲区中,并向单片机发送中断信号,单片机在中断子程序中读取SJA1000接收缓冲区中的数据,当需要向上位机发送数据时,先由单片机将一帧CAN消息写入到SJA1000的发送缓冲区,再将其发送到CAN总线上,PC机调用接收子函数以实现CAN消息的接收。

  1.2 USB转CAN模块硬件设计

002.jpg

  该部分硬件框图如图2所示。此部分对应于图1中的USB转CAN通信接口模块。USB控制芯片采用CP2102,该芯片是一种高度集成的USB转UART桥接器,包含USB2.0全速功能控制器,符合USB2.0规范的要求。USB收发器内含512 B接收缓冲器和512 B发送缓冲器,振荡器和带有全部的调制解调器控制信号的异步串行数据总线,CP2102内置有与计算机通信的USB协议,PC机通过USB控制芯片CP2102向单片机发送CAN消息,再由单片机通过SJA1000将数据送到CAN总线上。所提供的COM口器件驱动器允许一个基于CP2102的产品作为PC机的一个COM口使用,可以像操作通用串行口的控制方式来使用这个COM口。

  1.3 CAN模块节点硬件设计

003.jpg

  CAN节点的通信核心芯片为CAN控制器和CAN驱动收发器,各节点电路图如图3所示。CAN控制器SJA1000是一种独立控制器,是PHILIPS半导体PCA82C200 CAN控制器(BasicCAN)的替代品,而且它增加了一种新的工作模式(PeliCAN),这种模式支持具有很多新特性的CAN2.0B协议[5-6]。TJA1050 符合ISO 11898标准,协议控制器通过一条串行数据输出线TxD和一条串行数据输入线RxD连接到收发器,而收发器则通过它的两个有差动接收和发送能力的总线终端CANH和CANL连接到总线线路。它的引脚S用于模式控制,参考输出电压Vef提供一个Vcc/2的额定输出电压,这个电压是作为带有模拟Rx输入的CAN控制器的参考电平。由于SJA1000具有数字输入,因此它不需要这个电压。收发器使用5 V的额定电源电压。

  微处理器采用STC公司生产的STC89S52,它是一种低功耗、高性能CMOS 8位微控制器,具有8 KB Flash,512 B RAM,3个16位定时器/计数器,4个外部中断[7]。

  CAN控制器的CS片选端连接到单片机的通用I/O口上,由图3可知SJA1000基址SJA_BaseAdr即为0x7F00,数据端AD0~AD7连接到单片机的P0.0~P0.7以实现数据的交换,SJA1000的INT是终端信号输出端,在中断允许的情况下,有中断发生时,INT出现由高电平到低电平的跳变,因此此脚与单片机的外部中断输入脚INT0相连,从而使单片机可通过外部中断的方式访问SJA1000。

2 系统软件设计

  2.1 各节点单片机控制程序

  单片机主函数流程如图4所示。

004.jpg

  这里单片机主要完成CAN控制器SJA1000的初始化,初始化程序中需要设置时钟分频寄存器、验收代码寄存器、验收定时寄存器和总线定时寄存器,以及数据的接收和发送。首先,微处理器关闭SJA1000的中断,然后写SJA1000的模式寄存器,将模式寄存器中的RM位置1,进入复位模式,接下来在时钟寄存器里确定使用BasicCAN模式还是PeliCAN模式,本系统采用了PeliCAN模式,验收代码寄存器和验收屏蔽寄存器的设置决定了各个节点的地址,在通信过程中起到重要作用,可以让单片机选择性地接收响应节点CAN消息,通信波特率在总线定时寄存器BTR0和BTR1中进行设置,输出寄存器配置输出位流的电平驱动形式,通过中断寄存器IR和中断使能寄存器IER设置正确的中断模式以实现CAN数据的正确收发处理,最后将模式寄存器RM位请求清0,进入工作模式。初始化程序的流程图如图5所示,关键部分程序如下:

005.jpg

  EA=0;//关总中断

  BCAN_ENTER_RETMODEL();//进入复位模式

  BCAN_CREATE_COMMUNATION();//接口检测

  BCAN_SET_OUTCLK(0x88);//Pelican模式

  BCAN_SET_OBJECT(0x01,0x01,0x00,0x20,0xff,0xff,0x00,0x00);//验收码和屏蔽码

  BCAN_SET_BANDRATE(ByteRate_125k);//设置波特率

  REG_OCR=0x1a;//设置输出控制寄存器

  REG_INTENABLE=0x1D;//设置中断,接收

  BCAN_SET_CONTROL(0x08);

  SJA=REG_CONTROL;

  *SJA=*SJA&0xfe;

  if(*SJA!=0x00)

  return 0;//退出复位模式

006.jpg

  发送过程单片机将要发送的数据以CAN协议规定的帧格式构成数据帧,存入SJA1000的发送缓冲区,然后写发送命令,在把数据写入发送缓冲区前,先判断SJA1000的工作状态,再决定是否发送,其发送一个数据帧的过程如图6所示,发送数据子程序如下:

  Void SendMessage(unsigned char CAN_TX_data,unsigned char length1)

  loop:

  SJA=REG_STATUS;

  temptt=*SJA;

  if((temptt&0x04)==0x00)goto loop;//循环检测等待

  {

  SJA=REG_RXBuffer1;//发送缓冲区1

  *SJA=length1;

  *SJA=CAN_TX_data;

  BCAN_CMD_PRG(TR_CMD);//请求发送

  }

  接收数据采用接收中断方式,单片机在中断程序中从数据口读取CAN消息,具有较高的实时性,接收数据子程序如下:

  void ex0_int(void)interrupt 0 using 1

  {

  unsigned char tt,tt1,length,i;

  SJA=REG_INTERRUPT;

  if((*SJA)&0x01)//产生接收中断

  {

  SJA=REG_RXBuffer1;

  tt=*SJA;

  tt1=*SJA;

  length=tt1&0x0F;

  if ((tt&0x40)!=0x40)

  //将帧格式设置为数据帧

  {

  SJA=REG_RXBuffer4;

  memcpy(RevceData,SJA_BCANAdr,length);

  //将接收到的数据存入RevceData数组中

  }

  BCAN_CMD_PRG(RRB_CMD);

  //释放SJA1000接收缓冲区

  }

  }

  2.2 上位机软件设计

007.jpg

  上位机软件基于C++语言,采用Windows API函数实现串口通信,API函数在通信任务较复杂的系统中具有优势,适合多线程编程,且通信稳定,串口的打开、关闭、读取和写入所用的函数与操作文件的函数完全一致。通过调用CreateFile()函数打开串口,CreateFile()函数会返回一个句柄,在随后的写串口操作中,只需在WriteFile()函数中设置相应的入口参数,将数据转换成CAN消息格式并打包发送即可。读串口操作则是通过ReadFile()函数实现,对接收到的CAN消息数据包解包后提取出数据段,其上位机软件工作流程如图7所示,其中发送子程序关键部分程序如下:

  CAN_msg msg;//CAN消息结构体,

  //结构体成员包括CAN数据地址及类型等

  CAN.SendCANMessage(&msg);//发送CAN消息,

  SendCANMessage()函数定义如下:其中pMsg为CAN消息数据包,dwTimeout为超时时间,如果发送错误,系统将返回错误信息。

  CAN_ERROR RT_CAN::

  SendCANMessage(CAN_msg*pMsg,DWORD dwTimeout)

  {

  if(pMsg==NULL)return CAN_ERR_PARAM;

  if(pMsg->ch==CAN_CONFIG_CHANNEL)

  return CAN_ERR_CHANNEL;

  if(WritePackage((BYTE*)pMsg,sizeof(CAN_msg),dwTimeout)==0)

  return CAN_ERR_TRANS;

  return CAN_OK;

  }

  接收子程序关键部分如下:

  RecvCANMessage(CAN_msg*pMsg,DWORD dwTimeout)

  {

  if(pMsg==NULL)

  return CAN_ERR_PARAM;

  if(WAIT_TIMEOUT==WaitForSingleObject(m_hRecvMsgEvnet,dwTimeout))

  return CAN_ERR_TIMEOUT;

  *pMsg=m_CANRecvMsg;

  return CAN_OK;

  }

  在数据发送或接收完毕后,调用CloseHandle()函数关闭串口。上位机整体界面设计如图8所示。

3 系统实验

  为验证系统通信的可靠性和稳定性,实验中拟将一帧CAN消息设置为ID:01(十六进制),消息长度为8,采用标准数据帧传输一个十六进制数据,下位机采用数码管显示的方式来判断数据传输的正确性。当下位机接收到消息后,将会把此消息重新返回给上位机。经过几次反复实验,系统通信稳定、可靠。

008.jpg

4 结束语

  由于CAN总线通信可靠、性能稳定,具有易开发和低成本等特点,近年来在自动控制等很多领域得到了越来越广泛的应用。在一些复杂系统中,不可避免地存在多点通信的情况。本文设计的基于CAN总线的PC机与单片机多点通信系统,在所有的CAN转接口中,通过USB连接到CAN总线,简化了硬件接口,提高了开发效率,具有很好的应用前景。

参考文献

  [1] 李真花,崔健.CAN总线轻松入门与实践[M].北京:北京航空航天大学出版社,2011.

  [2] 刘维弋,金远平.基于CAN总线的通信系统的设计与实现[J].计算机技术与发展,2007,17(12):207-209.

  [3] 杨春杰,王曙光,亢红波.CAN总线技术[M].北京:北京航空航天大学出版社,2010.

  [4] 张念淮.USB总线接口开发指南[M].北京:国防工业出版社,2001.

  [5] 孙兵,何瑾,陈广厦.基于DSP的CAN总线与以太网互联系统研制[J].仪器仪表学报,2008,29(2):377-380.

  [6] 王平,江华丽,何花.基于单片机的CAN总线通讯应用设计[J].电子测量技术,2009,32(9):131-135.

  [7] 郭天祥.新概念51单片机C语言教程[M].北京:电子工业出版社,2009.


此内容为AET网站原创,未经授权禁止转载。