一、CAN总线简介
CAN是控制器局域网络(Controller Area Network,CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,是国际上应用最广泛的现场总线之一。
CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,信号是以两线之间的“差分”电压形式出现,这点与RS485类似,但两者电平值不同。CAN总线电平分为显性电平和隐性电平。
CAN总线采用两种互补的逻辑数值“显性”和“隐性”。其中,“显性”数值表示逻辑“0”,而“隐性”表示逻辑“1”。
当总线上同时出现“显性”位和“隐性”位时,最终呈现在总线上的是“显性”位。 在“隐性”状态下,VCAN_H和VCAN_L被固定于平均电压电平,Vdiff近似为零,此时VCAN_H和VCAN_L的标称值为2.5V。“显性”位以大于最小阀值的差分电压表示,此时VCAN_H的标称值为3.5V,VCAN_L的标称值为1.5V,如下图所示:
二、CAN帧结构
CAN总线节点上的节点发送数据,是以报文的形式广播给网络中所有节点。收发器接收到数据就把数据传送给控制器,再由控制器检查判断是不是所需数据,不是则忽略。
● 网络上任何一个节点在任何时候都可以发送数据;
● 多个节点发送数据,优先级低主动退出发送;
● 短帧结构,每帧数据信息为0~8字节(具体用户定义),对数据编码而不是地址编码;
● CAN每帧都有CRC校验和其他检验措施,严重错误的情况下具有自动关闭输出的功能。
至于报文传输,则由以下5个不同的帧类型所表示和控制:
● 数据帧:数据帧携带数据从发送器至接收器。
● 远程帧:总线单元发出远程帧,请求发送具有同一识别符的数据帧。
● 错误帧:任何单元检测到总线错误就发出错误帧。
● 帧间隔:数据帧(或远程帧)通过帧间空间与前述的各帧分开。
● 过载帧:过载帧用以在先行的和后续的数据帧(或远程帧)之间提供附加的延时。
三、硬件设计
现在很多单片机中内置CAN总线协议控制器,只要外接总线驱动芯片和适当的抗干扰电路就可以很方便地建立一个CAN总线智能测控节点。
驱动芯片如下:
四、软件设计
这里以STM32L431单片机为例,建立STM32CubeMX工程,使能CAN接口,设置时钟及分配系数等参数,如下图所示:
STM32L431的系统时钟为80M,上图中设置的波特率为100kbps。计算方法如下:
CAN波特率为 = 系统时钟/Prescaler/ (SJW+BS1+BS2) = 80MHz/32/(1+16+8) = 100KHz
使能接收中断:
生成代码后,添加CAN滤波器配置函数,如下:
编写接收中断函数和发送数据函数:
在主函数中调用滤波器配置函数,启动CAN总线,使能接收中断,并循环发送测试数据:
通过USB转CAN的工具可以在电脑端查看数据是否成功。可以看到,数据可以正常发送。