控制器区域网络(Controller Area Network,CAN)是一种高度可靠、实时性强的串行通信协议和总线系统,最初为汽车电子应用而设计,但已广泛应用于多个领域。其工作在物理层和数据链路层,CAN 通信采用点对点或总线拓扑结构,支持多种通信速率,使用帧格式传输数据。其强大的错误检测和冲突处理机制使其在恶劣环境下依然可靠。多级优先级机制确保实时通信需求得以满足。CAN 通信在汽车、工业控制、医疗设备和航空航天等领域得到广泛应用,为嵌入式系统提供了可靠的通信基础。
通过 CAN 总线传输数据是需要按照一定协议进行的,CAN 协议提供了 5 种帧格式来传输 数据:数据帧、遥控帧、错误帧、过载帧和帧间隔。其中数据帧和遥控帧有标准格式和扩展格
式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID)。
逻辑电平:
CAN 协议中对它使用的 CAN_High 及 CAN_Low 表示的差分信号做了规定,以高速 CAN 协议为例,当表示逻辑 1 时 (隐性电平) ,CAN_High 和 CAN_Low 线上的电压均为 2.5v,即它们的电压差 VH-V:-L=0V;而表示逻辑 0 时 (显性电平) ,CAN_High 的电平为 3.5V,CAN_Low 线的电平为 1.5V,即它们的电压差为 VH-V:-L=2V。
数据帧格式如下:
帧起始:
SOF 段 (Start OfFrame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平,它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。
仲裁域:
当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。
仲裁段的内容主要为本数据帧的 ID 信息 (标识符),数据帧具有标准格式和扩展格式两种,区别就在于 ID 信息的长度,标准格式的 ID
为 11 位,扩展格式的 ID 为 29 位,它在标准 ID 的基础上多出 18 位。在 CAN 协议中, ID 起着重要的作用,它决定着数据帧发送的优先级,也决定着其它节点是否会接收这个数据帧。CAN 协议不对挂载在它之上的节点分配优先级和地址,对总线的占有权是由信息的重要性决定的,即对于重要的信息,我们会给它打包上一个优先级高的 ID,使它能够及时地发送出去。也正因为它这样的优先级分配原则,使得 CAN 的扩展性大大加强,在总线上增加或减少节点并不影响其它设备。报文的优先级,是通过对 ID 的仲裁来确定的。根据前面对物理层的分析我们知道如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平,CAN 正是利用这个特性进行仲裁。
控制域:
在控制段中的 r1 和 r0 为保留位,默认设置为显性位。它最主要的是 DLC 段 (Data Length
Code),译为数据长度码,它由 4 个数据位组成,用于表示本报文中的数据段含有多少个字节, DLC 段表示的数字为 0~8
数据域:
数据段为数据帧的核心内容,它是节点要发送的原始信息,由 0~8 个字节组成,MSB 先行。
CRC域:
为了保证报文的正确传输,CAN 的报文包含了一段 15 位的 CRC 校验码,一旦接收节点算出的CRC 码跟接收到的 CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC 部分的计算一般由 CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。在 CRC 校验码之后,有一个 CRC 界定符,它为隐性位,主要作用是把 CRC 校验码与后面的 ACK段间隔起来。
应答域:
ACK 段包括一个 ACK 槽位,和 ACK 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。
帧结束:
ACK 段包括一个 ACK 槽位,和 ACK 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。
从ISO/OSI基本参照模型中can工作在物理层和数据链路层。
硬件原理图:
使用开发板与can分析仪连接:
本次使用socket编程的方式实现can的发送测试,打开套接字:
指定can设备,目前的我们的开发板是can0。可以通过开发终端进行查看:
将can0与socket套接字绑定:
设置发送数据:
编译代码生产可执行文件,将可执行文件拖入开发板,添加可执行权限,设置can0的通信波特率为1M,启动can0
接下来运行编译的can测试的可执行文件,查看canpro上位机里面接收到的数据,如下所示,在启动canpro软件时,选择的can通信端口波特率需要与开发板设置的波特率保持一致。
更多回帖