基于Arduino的CAN通信模块的设计

2020-03-09 01:21黄菊花顾晓辉曹铭
南昌大学学报(工科版) 2020年4期
关键词:缓冲器寄存器字节

黄菊花,顾晓辉,曹铭

(南昌大学机电工程学院,江西 南昌 330031)

Arduino是一款便捷灵活、方便上手的基于微控制器的设计开发平台,具有低成本、易开发等特点[1]。CAN(controller area network,CAN)总线是国际上应用最广泛的现场总线之一,是一种有效支持分布式控制或实时控制的串行通信网络,其高性能和可靠性已被认同,并不再局限于汽车控制系统应用中,被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面[2]。因此,各类控制器在开发和应用时,CAN模块也起着越来越重要的角色。Mathworks开发基于Simulink开发环境下的硬件支持包(hardware support package),Simulink Support Package for Arduino Hardware提供了Arduino的基础驱动设备,通过采用Simulink的嵌入式控制系统的开发解决了传统开发周期长和效率低的问题,使得开发更加简单,成本低,操作方便[3]。

本文确立将如何开发基于Arduino的CAN驱动设备技术作为研究方向。研究中将选用Arduino系列中的Arduino Mega 2560控制器作为核心控制器,CAN总线节点采用CAN总线控制器MCP2515芯片和TJA1050收发器组合。

1 系统结构

本文设计的基于Arduino的CAN驱动设备技术由Arduino、MCP2515和CAN总线节点几部分组成。Arduino MEGA 2560单片机作为主控芯片,Arduino MEGA 2560采用USB接口与上位机PC机进行数据传输。Arduino MEGA 2560的处理器核心是ATmega2560,具有54路数字输入/输出口(其中16路可作为PWM输出),16路模拟输入,适合需要大量I/O接口的设计。Arduino系统对硬件底层的控制代码细节进行了封装,用户只需要使用Arduino系统封装好的接口就能高效地实现对硬件的控制[4]。

CAN总线节点的作用是通过CAN总线进行各节点之间的相互通信,通过CAN数据的传输以实现复杂的控制过程。CAN协议废除了传统的站地址编码,而是对通信数据进行编码,使网络内节点不仅在数量上不受限制,并且不同节点能够同时接收到相同的数据[5]。由于CAN总线具有较好的纠错能力,支持分布式控制,能够实时控制,从而保证了系统的高可靠性和高灵活性,而且CAN总线还采用非破坏性仲裁技术,当2个节点同时向网络上传输数据时,优先级低的节点会主动停止发送数据,而优先级高的节点可在不受影响的情况下继续传输数据,有效避免了总线的冲突[6]。

2 硬件电路设计

MCP2515是具有局域网络CAN协议的独立控制器,可通过收发器与CAN总线进行连接。MCP2515由CAN模块、SPI协议模块和用于配置该器件及其运行逻辑的控制器3部分构成[7]。Arduino MEGA 2560与MCP2515的连接如图1。

Arduino的ATmega2560芯片中由19号脚(SS)、20号脚(SCK)、21号脚(MOSI)、22号脚(MISO)组成的SPI接口与MCP2515的SPI协议模块进行对接,再与MCP2515的CAN模块进行通信[8]。采用MCP2515芯片作为CAN总线节点的CAN总线控制器,TJA1050作为CAN总线节点的CAN收发器。MCP2515芯片通过SPI接口和Arduino对接,Arduino和上位机进行原始数据传输,然后MCP2515的CAN模块会根据CAN协议把数据封装成报文形式,最后通过TJA1050收发器完成与CAN总线之间的数据传输[9]。

在整个平台上,Arduino控制器负责接收系统的应用数据,整个平台的数据由Arduino控制器首先接收,再通过Arduino控制器的SPI接口传输到MCP2515控制器,MCP2515控制器将封装的数据通过TJA1050收发器与CAN总线进行通信,完成整个数据传输。整个数据流过程如图2所示。

3 软件设计

3.1 CAN初始化

系统设计采用Simulink开发方式,将Simulink中实现的CAN驱动设备加载到Arduino控制器中,实现对CAN总线进行调试的功能,最终建立CAN通信。系统实现中的CAN应用层、驱动程序及操作系统共同实现应用层功能[10]。首先在Simulink中进行CAN的初始化配置,包括配置MCP2515的寄存器,以及其波特频率和振荡器频率的调整。通过配置CANCTRL控制寄存器配置好MCP2515的配置模式,由配置寄存器CNF1、CNF2、CNF3配置整个CAN通信过程的波特频率。MCP2515是通过SPI接口接收数据,同时也要配置好Arduino的SPI接口。CAN初始化模块如图3所示。

3.2 CAN发送模块

CAN数据的发送需要读取MCP2515控制器和Arduino控制器相应的发送状态,配置其相应的寄存器。MCP2515拥有3个发送缓冲器用于发送CAN报文,并且每个发送缓冲器都占用了14字节的SRAM。在报文写入发送缓冲器之前,需要确认TXBnCTRL寄存器的TXREQ位是否清零,只有当TXREQ位置为0,才表明发送缓冲器中没有等待发送的报文。MCP2515的3个发送缓冲器的优先级不一样,与CAN协议中的报文仲裁优先级不同,优先级高的发送缓冲器能够优先发送,若发送缓冲器拥有一样的优先级,则编号较高的报文会优先发送。需要配置TXBnSIDH、TXBnSIDL寄存器,来确定需要发送的报文的ID,其中TXBnSIDL的EXIDE位被置1表示报文要发送扩展标识符,置0表示报文要发送标准标识符。TXBnDLC寄存器控制发送缓冲器数据字节,0~3字节的DLC位设定要发送数据的长度,RTR位被置1表示要发送的报文是远程发送请求,置0表示要发送的报文是数据帧。另外,TXBnDm寄存器能将带有数据字节的报文完成数据装载,数据装载之后就能启动报文的发送。当器件确认发送缓冲器的TXBnCTRL寄存器中的TXREQ位被置1后,便开始启动报文发送。这里指的报文发送并不是报文就能立即发送出去,而是在发送缓冲器中将报文标为准备发送,只有当器件检测到CAN总线处于空闲状态,才能将报文发送出去。TXBnCTRL寄存器的TXREQ位在检测到报文发送成功后会自动置0,在检测到报文发送失败时,TXREQ位会继续保持置1,表明CAN总线没有空闲,需要等待发送。

此外,如果需要中止发送报文,器件可通过将报文发送缓冲器的TXBnCTRL寄存器的TXREQ位置为0,也可通过将CANCRTL寄存器的ABAT位置为1,2种方式请求中止发送该发送缓冲器中等待发送的报文,但是只有尚未开始发送的报文才能够被中止。最后将这些模型封装成整体的CAN发送模块。CAN发送模块如图4。

3.3 CAN接收模块

CAN数据的接收要读取MCP2515控制器以及Arduino控制器相应的接收状态,配置相应的接收寄存器。MCP2515拥有2个全接收缓冲器用于接收CAN报文,MCP2515还配备了1个报文集成缓冲器(message assembly buffer,MAB)。MAB的作用是对符合验收过滤器条件的报文进行打包发送至2个全接收缓冲器内,并且MAB是唯一一个能随时接收CAN总线的下一条报文的接收缓冲器。当接收缓冲器接收到报文时,该接收缓冲器的CANINTF寄存器的RXnIF位将被置1,待该报文被缓冲器处理完毕,器件必须将RXnIF位置为0,以便缓冲器接收CAN总线的下一条CAN报文,而且CANINTF寄存器具有锁定功能,在器件没有处理完上一条CAN报文前,MCP2515的接收缓冲器不能被载入新的报文。MCP2515的2个接收缓冲器的优先级是不一样的,RXB0的优先级要大于RXB1的优先级,这是由于RXB0缓冲器只有2个验收过滤器而RXB1缓冲器却拥有4个验收过滤器,使得RXB0缓冲器接收报文匹配的条件更为严格。另外,RXB0缓冲器如果已经在处理一条有效CAN报文的情况下,接收到了下一条有效CAN报文,能通过配置RXB0CTRL寄存器将新的报文滚存至RXB1缓冲器内。

CAN接收模块的建立,需要先读取MCP2515相应引脚的接收状态,RXCAN引脚检测到CAN总线上有CAN报文,便会使SOF引脚触发起始帧信号。随后要对MCP2515的接收缓冲器的寄存器进行配置,通过查询器件的接收中断接收CAN总线上的CAN报文。在Simulink中的接收驱动模块将接收缓冲器以及其寄存器配置完成,接收中断配置、接收故障检测配置完成,最后将这些模块封装成整体的CAN接收模块。CAN接收模块如图5。

3.4 CAN中断

要在通信系统中及时地读取和处理来自CAN总线的状态,就必须清楚地知道相应的中断状态,做出及时的出错处理、接收数据处理、发送数据处理,这都依赖于MCP2515拥有8个中断源,具有灵活的中断处理能力。MCP2515拥有CANINTE中断使能寄存器和CANINTF中断标志寄存器,包含了所有的中断使能位和中断标志位。

4 实验验证

进行CAN通信仿真,首先根据电机控制器与整车控制器的CAN通讯协议通过CANdb++建立DBC文件。电机控制器与整车控制器的CAN通讯协议遵行SAE J1939标准,通信协议见表1和表2。将建立好的DBC文件加载到Simulink的CANpack模块中,并对模型进行对比修正,修改后的模型见图6。

实验说明:在Simulink中通过USB接口将建立好的CAN模块加载至Arduino MEGA 2560控制器中运行,设置好目标转速值、扭矩值、上电控制命令、模式控制命令、运行控制命令以及CAN帧数。其中上电控制命令由字节中的一位控制,0/1代表接触器断开/闭合;模式控制命令由字节中的一位控制,0/1代表转矩/转速模式;运行控制命令由字节中的2位控制,00代表停止、01代表正向、10代表反向、11代表空转。

实验采集设备:USBCAN-II。

实验分析软件:CANTEST。

实验结果:CAN通信建立完成后,通过CANTEST软件分析实现了CAN发送和CAN接收的功能,并且CANTEST可以加载DBC文件对报文进行解析,解析后的数据见图7。结果表明,采用Simulink进行嵌入式开发的基于Arduino控制器能够完成CAN通信功能。

表1 数据格式定义Tab.1 Data format definition

表2 报文协议Tab.2 Message protocol

5 结语

由于图形可视化的优点,更多的嵌入式开发选择模型设计的方式,采用Simulink作为开发工具也必将成为一种趋势。在嵌入式开发中,控制器的驱动开发技术不可缺少,本文基于Arduino控制器的CAN驱动设备在Simulink中实现了CAN通讯功能,不仅为Arduino控制器提供了更多的通讯方式,也为控制器更多的系统开发打下了基础,希望通过CAN驱动设备通信功能的实现,能够起到抛砖引玉的作用,实现基于Simulink的各类控制器的嵌入式开发。

猜你喜欢
缓冲器寄存器字节
更正
No.8 字节跳动将推出独立出口电商APP
8编组A型车缓冲器选型对比分析
Lite寄存器模型的设计与实现
机车用MT-3型缓冲器压装方式改进
常用电子测速法在某数字信号处理器中的应用*
No.10 “字节跳动手机”要来了?
移位寄存器及算术运算应用
可重复使用着陆缓冲器性能及其特点分析
人类进入“泽它时代”