1、CAN 总线系统的设计与实现在现场总线概念的出现到现在的近 20 年时间里,已经出现了好几种现场总线技术并走向成熟。其中 CAN 总线已被公认为几种最有前途的现场总线之一。CAN 是一种由带有 CAN 控制器组成的高性能串行数据局域通信网络,是国际上应用最广泛的现场总线之一。最初,CAN 被设计作为汽车环境中的微控制器通信,在车载各电子控制装置 ECU 之间交换信息,形成汽车电子控制网络。由于其具有通信速度快、可靠性高和性能价格比好等突出优点,它正越拉越广泛地应用于汽车、机械工业、纺织机械、农业用机械、机器人、数控机床、医疗器械、家用电器及传感器等领域。图 1 所示是典型的 CAN 总线节点的
2、系统框图。系统硬件设计SJA1000 独立 CAN 控制器是 PHILIPS 公司 PCA82C200CAN 控制器的替代产品,它是在完全兼容 PCA82C200 的基础上,增加了一种新的工作模式PeliCAN,SJA1000 完全支持具有很多新特性的 CAN2.0B 协议。SJA1000 的工作模式通过其内部的时钟分频寄存器中的 CAN 模式为来选择。 SJA1000 可以支持多种为处理器的时序特性,如 Intel 模式或 Motorla 模式,SJA1000 与微处理器的接口非常简单,微处理器以访问外部存储器的方式来访问 SJA1000。TJA1050 是控制器局域网 CAN 协议控制器和
3、物理总线之间的接口, TJA1050 可以为总线提供不同的发送性能,为 CAN 控制器提供不同的接收性能。 TJA1050 主要有以下特征:完全符合 ISO 11898 标准,最高速到达 1Mb/s,输入级 3.3V 以及 5V 器件兼容,至少可以连接 110 个节点。本设计的微处理器为 89C51 负责初始化 SJA1000及通过控制 SJA1000 实现数据的接收和发送等通信任务,系统电路图如图 2 所示。CAN 控制器 SJA1000 的数据线 AD0AD7 连接到 51 单片机的 P0 口,连接到基址为 0xFA00 的外部存储器片选信号,当访问地址 0xFA000xFA31 时,CP
4、U 可对SJA1000 执行相应的读写操作。SJA1000 的、分别与 51 对应的引脚相连,接 51 的使 51 可以通过中断方式访问 SJA1000。系统软件设计本设计的系统由 4 个节点组成,一个节点由上位机通过并口转 CAN 总线的数据收发器构成,另外 3 个节点由图 2 所示的单片机 CAN 总线收发系统构成。单片机系统每秒发送一帧(8 个字节)数据。连接上位机的 CAN 总线收发器有相应的上位机测试软件支持,本文主要介绍单片机 CAN 总线收发器的程序设计。图 3 是下位机软件的流程图。系统设计的部分代码如下:main() Sja_1000_Init(); /初始化 SJA1000
5、Init_Cpu(); /初始化 CPUInit_T0(); /初始化定时器flag_init=0x00;while(1)if(rcv_flag) /rcv_flag 为接受标志位,有接收则单片机进行处理rcv_flag=0; BCAN_DATA_RECEIVE(rcv_data);BCAN_CMD_PRG(0X04);disp_rec();if(flag_sec) /定时中断标志为,定时时间到则发送数据帧 flag_sec=0; send_data0=0xaa; send_data1=0x08; send_data2=DA1;send_data3=DA2;send_data4=DA3;sen
6、d_data5=DA4;send_data6=DA5;send_data7=DA6;send_data8=DA7;send_data9=DA8; BCAN_DATA_WRITE(send_data); BCAN_CMD_PRG(0X01);if(err_flag)err_flag=0;disp_err();Sja_1000_Init();display(a); /循环显示接受数据SJA1000 的初始化过程包括申请进入复位状态,设置总线波特率,设置输出方式,开放错误中断、接受和发送中断。在进行数据发送时数据包前两个字节 0Xaa、0X08为描述符,包括 11 位长的 ID(标志符)1 位 RT
7、R4 位描述数据长度的 DLC 共 16 位。BCAN_DATA_RECEIVE(rcv_data),为 89C51 对 SJA1000 的读数据函数其具体函数定义:bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf)unsigned char TempCount; SJA_BCANAdr = REG_STATUS; /访问地址指向状态寄存器if(*SJA_BCANAdrSJA_BCANAdr = REG_RxBuffer2; /访问地址指向接收缓冲区 2if(*SJA_BCANAdr /计算报文中数据的个数elseTempCount=2;SJA_B
8、CANAdr = REG_RxBuffer1; /访问地址指向接收缓冲区 1memcpy(RcvDataBuf, SJA_BCANAdr,TempCount);/读取接收缓冲区的报文return 0;此函数仅限于 CAN 控制器接受数据,返回值如果为 0 表示接受成功,如果为 1表示接受失败。BCAN_DATA_WRITE(send_data)函数是 89C51 对 SJA1000 的写数据函数其具体定义如下:bit BCAN_DATA_WRITE(unsigned char *SendDataBuf)unsigned char TempCount;SJA_BCANAdr = REG_STAT
9、US; /访问地址指向状态寄存器if(*SJA_BCANAdr if(*SJA_BCANAdr SJA_BCANAdr = REG_TxBuffer1; /访问地址指向发送缓冲区 1if(SendDataBuf1 /输入数据帧elseTempCount =2; /远程帧memcpy(SJA_BCANAdr,SendDataBuf,TempCount);return 0;此函数将待发送的特定帧各式的数据,送入 SJA1000 发送缓存区中,然后启动,函数返回 0 表示将数据成功的送至发送缓冲区,返回 1 表示上一次的数据正在发送。系统组网相对容易只需把各个节点挂在同一条双绞线上即可,启动上位机的
10、 CAN收发器,用来监视总线数据状态。每当启动一个下位机 CAN 收发器,上位机的测试软件就可以每隔一秒钟收到由同一 CAN 收发器发送的数据帧。实验结果显示当 3 台下位机 CAN 总线同时发数时数据接收端没有数据丢失和总线冲突现象。结语现场总线有着巨大的发展潜力,它将给自动控制领域的变革带来深远的影响。我们设计的 CAN 总线收发器具有通用性,在本系统设计的基础上只需要相应的修改数据传输协议即可应用于各个 CAN 总线的数传系统。参考文献:1 陈立元主编. Visual Basic 实现串并行通信技术. 清华大学出版社,20012 张学忠,王福成主编. Visual Basic 控件应用编程实例教程. 北京希望电子出版社,20023 马希荣主编. Visual Basic 6.0 程序设计. 机械工业出版社, 20044 彭禹皓. 基于单片机和 CAN 控制器的嵌入式系统. 微计算机信息,2007,4-2 : 33-35