刘 登,李国利,陈 健,张恺钰,时 光(金陵科技学院 机电工程学院,江苏 南京 211169)
基于CAN总线的PC机与单片机的多点通信*
刘 登,李国利,陈 健,张恺钰,时 光
(金陵科技学院 机电工程学院,江苏 南京 211169)
设计了一种基于CAN总线的PC机与单片机多点通信系统。系统包括PC机、STC89S52单片机、CAN接口控制器、串行收发器等。介绍了USB转CAN通信接口的通信节点设计方案,给出了各通信节点的硬件电路和软件设计,最后进行了系统通信实验,结果表明该系统具有可靠性高、抗干扰能力强等特点。
CAN总线;单片机;多点通信
传统的单片机串口通信中大多采用RS232或RS485串口,因其传输速率和距离(小于 1.5 km)的限制,已渐渐不能满足用户系统需求,而CAN总线因其卓越的性能,被广泛应用到汽车工业、自动控制、楼宇自动化、医学设备等各个领域[1]。CAN(Controller Area Network,控制器局域网)属于现场总线的范畴,是一种有效支持分布式控制或实时控制的串行通信网络,是国际上应用最广泛的现场总线之一[2-3]。CAN可以组建多主对等的总线通信系统;具有非破坏性总线仲裁技术,让优先级高的信息得到更快速的处理;具有强大的错误检测机制,可以检测到总线上的任何错误;采用短帧结构、位填充和CRC校验等措施,使传输具有高可靠性。这些优点使得CAN总线特别适用于工业过程监控设备的互联。在
所有的 CAN转接口中,USB速度快,即插即用,使用更加广泛,采用USB转CAN总线实现单片机与上位机的通信具有一定的研究与应用意义[4]。
1.1系统总体设计
系统的总体结构如图1所示,硬件电路主要包括USB转CAN通信接口以及各个通信节点,每个节点由CAN收发器 TJA1050、CAN控制器 SJA1000和单片机STC89S52组成,CAN总线两端应串接 120 Ω的电阻,该电阻对于匹配总线阻抗起着重要作用。系统主要实现的功能为:PC机通过USB转CAN通信接口向CAN总线发送一帧CAN总线数据,相应节点在接收到CAN消息后,存储在SJA1000的接收缓冲区中,并向单片机发送中断信号,单片机在中断子程序中读取SJA1000接收缓冲区中的数据,当需要向上位机发送数据时,先由单片机将一帧CAN消息写入到SJA1000的发送缓冲区,再将其发送到CAN总线上,PC机调用接收子函数以实现CAN消息的接收。
1.2USB转CAN模块硬件设计
该部分硬件框图如图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口。
图 2USB转CAN硬件框图
1.3CAN模块节点硬件设计
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]。
图3 CAN模块各节点电路图
CAN控制器的CS片选端连接到单片机的通用 I/O口上,由图 3可知 SJA1000基址 SJA_BaseAdr即为0x7F00,数据端 AD0~AD7连接到单片机的 P0.0~P0.7以实现数据的交换,SJA1000的INT是终端信号输出端,在中断允许的情况下,有中断发生时,INT出现由高电平到低电平的跳变,因此此脚与单片机的外部中断输入脚INT0相连,从而使单片机可通过外部中断的方式访问SJA1000。
2.1各节点单片机控制程序
单片机主函数流程如图4所示。
图4 单片机主函数流程图
这里单片机主要完成CAN控制器 SJA1000的初始化,初始化程序中需要设置时钟分频寄存器、验收代码寄存器、验收定时寄存器和总线定时寄存器,以及数据的接收和发送。首先,微处理器关闭SJA1000的中断,然后写SJA1000的模式寄存器,将模式寄存器中的RM位置1,进入复位模式,接下来在时钟寄存器里确定使用BasicCAN模式还是 PeliCAN模式,本系统采用了 Peli-CAN模式,验收代码寄存器和验收屏蔽寄存器的设置决定了各个节点的地址,在通信过程中起到重要作用,可以让单片机选择性地接收响应节点CAN消息,通信波特率在总线定时寄存器 BTR0和BTR1中进行设置,输出寄存器配置输出位流的电平驱动形式,通过中断寄存器IR和中断使能寄存器IER设置正确的中断模式以实现CAN数据的正确收发处理,最后将模式寄存器RM位请求清0,进入工作模式。初始化程序的流程图如图5所示,关键部分程序如下:
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;//退出复位模式
发送过程单片机将要发送的数据以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上位机软件设计
上位机软件基于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),dw-Timeout)==0)
return CAN_ERR_TRANS;
return CAN_OK;
}
图7 主线程和读线程流程图
接收子程序关键部分如下:
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所示。
为验证系统通信的可靠性和稳定性,实验中拟将一帧 CAN消息设置为 ID:01(十六进制),消息长度为 8,采用标准数据帧传输一个十六进制数据,下位机采用数码管显示的方式来判断数据传输的正确性。当下位机接收到消息后,将会把此消息重新返回给上位机。经过几次反复实验,系统通信稳定、可靠。
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.
Multipoint communication between PC and MCU based on CAN bus
Liu Deng,Li Guoli,Chen Jian,Zhang Kaiyu,Shi Guang
(College of Mechanical and Electrical Engineering,Jinling Institute of Technology,Nanjing 211169,China)
A kind of multipoint communication system between PC and MCU based on CAN bus is designed.The system consists of PC,STC89S52 MCU,the CAN port controller,serial transceiver,etc.The communication nodes design scheme of USB to CAN communication interface is introduced,and the hardware circuit and software of communication node are designed.The experiments of system communication are performed in the last.The results show that the system has the characteristics of high reliability,strong anti-interference ability etc.
CAN bus;MCU;multipoint communication
TP393
A
1674-7720(2015)15-0067-04
刘登,李国利,陈健,等.基于CAN总线的PC机与单片机的多点通信[J].微型机与应用,2015,34(15):67-70.
2015-04-11)
刘登(1993-),男,本科在读,主要研究方向:自动化控制技术。
2014江苏省高等学校大学生实践创新训练计划重点项目(201413573007Z)
李国利(1973-),通信作者,男,硕士,副教授,主要研究方向:自动化检测与控制技术。E-mail:1260342839@qq.com。