最近开始零基础学习CAN总线协议,想通过通俗易懂的方式来讲述一些相关的知识点,一部分是我自己的理解,另一部分是参考其他博主的文章,希望能对CAN总线协议有更深一步的理解和学习。
CAN总线基本概念
CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低功耗、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,在欧洲已是汽车网络的标准协议。
帮助理解:通信协议是在指两个节点或者两个对象想要完成数据交换必须遵守的规则,而CAN总线协议存在的意义就是为了去协调汽车中层出不穷的各个元件之间的通信
计算机通信方式 1.串行通信 串行通信是指数据一位一位地传输,每次传输一个位元的数据,并连续进行以上单词过程的通信方式,位与位之间没有联系,不会因为这位有错误,使下一位不能传输,串行总线只有一条链路,可以把频率做的很高,提高了传输速度,速度提高了就能弥补一次只能传输一个数据的缺陷 2.并行通信 并行通信是在串行端口上通过一次同时传输若干位数据的方式进行通信,多比特数据同时通过并行线进行传输,这样数据传送速度大大提高,但并行传送的线路长度收到限制,而且抗干扰能力差
CAN总线通信原理
如图,其数据流向为:CPU——CAN控制器——CAN收发器——连接器(双绞线) CPU:负责产生数据 CAN控制器:负责将CPU传输过来的数据加工成标准的数据格式,同时定义了数据传输的仲裁机制 CAN收发器:将CAN控制器传输过来的信息编码转为电平信号 连接器:CAN总线一般为双绞线,分CAN_L和CAN_H高低压线 高速CAN和低速CAN: 一个转化率高,一个转化率低,收到同样的信号编码,所转化的电平信号不一样,同样时间内高速CAN可以进行更多次的电平转化 具体流程: 发送时:CPU将二进制数据通过CAN控制器中定义好的接口发送给CAN控制器中的发送缓冲器(最多缓存3组数据),CAN核心模块会在发送缓冲器中拿取数据,对数据进行加工,生成CAN协议所规定的数据格式,之后将标准的数据格式发送给CAN收发器,CAN收发器会按照规定将接收到的二进制信息编码转为对应的电平信号 接收时:CAN收发器会受到CAN总线电平发送过来的电平信号,根据规定,将电平信号转化为二进制编码,然后传给CAN核心模块,CAN核心模块会对接收到的数据进行解析,将其中ID信息,数据信息解析出来,之后通过过滤器对ID进行过滤,过滤器中定义了允许通过的ID或ID组,之后将通过的ID所对应的数据传入FIFO(一个队列)中,先进先出,最先传进去的数据,最先被CPU拿进去处理
CAN信号表示
在CAN总线上,利用CAN_H和CAN_L两根线上的电位差来表示CAN信号。CAN总线上的电位差分为显性电平和隐性电平。其中显性电平为逻辑0,隐性电平为逻辑1。 ISO11898标准(125kbps ~ 1Mbps)和ISO11519标准(10kbps ~ 125kbps)中CAN信号的表示分别如下所示: 概括的讲:
发送方通过使总线电平发生变化,将其信息传递到CAN总线上。 接收方通过监听总线电平,将总线上的消息读入自己的接收器。
电平 就是指两点或者多个点在一样的阻抗下,它们之间电量的相对比值,通常指两功率或电压之比的对数
CAN总线电平 总线上的电平有显性电平和隐性电平两种 总线上执行逻辑上的线“与”时,显性电平的逻辑值位“0”,隐性电平为“1”,显性具有优先的意味,只要有一个单元输出显性电平,总线上即为显性电平,,只有所有的单元都输出隐性电平,总线上才为隐性电平
上升沿和下降沿 上升沿就是触发的那一瞬间,就是开关闭合的那一瞬间有效,由0变为1的那一下叫上升沿,反之由1变为0的瞬间叫下降沿,正常接通以后没有电平变化不起作用,下降沿是按键松开的那一瞬间才控制输出,如果按下按键一直不松开,那就没有动作 上升沿等于是接通的瞬间给个瞬发信号,相当于通电信号 下降沿等于是断开的瞬间给个瞬发信号,相当于断电信号
CAN总线协议的数据结构
CAN协议的五种帧类型
数据帧
所谓数据帧,就是包含了我们要传输的数据的帧,其作用当然也就是承载发送节点要传递给接收节点的数据 1.帧起始,SOF位 1位显性位,即逻辑0,标识一个数据帧的开始,用于同步 只有在总线空闲期间,节点才能够发送SOF
2.仲裁段,
ID:标识符,唯一确定一条报文 表明报文含义,可以包含报文源地址和目标地址 确定报文仲裁优先级,ID数值越小,优先级越高
RTR:传送帧类别,用来区分遥控帧和数据帧 当数据帧没有数据时,与遥控帧是一样的,通过RTR为进行区分, 数据帧的RTR位为显性0,遥控帧的RTR位为隐性1
3.控制段
IDE:用于区分标准帧和扩展帧 标准帧,IDE=0,扩展帧,IDE=1
FDF:用于区分普通CAN报文和CANFD报文 CAN报文,FDF=0 CANFD报文,FDF=1
DLC:表示数据场包含数据的字节数
4.数据段 Data Field:具有0-64个字节长度,由DLC确定 包含CAN数据帧发送的内容
5.CRC段 CRC:检查帧传输错误的帧,由15个位的CRC顺序和1个位的CRC界定符组成
DEL:CRC界定符,界定CRC序列.ACK段
ACK:用于确定报文被至少一个节点正确接收 发送单元在ACK段发送2个位的隐性位,接收到正确消息的单元在ACK位槽发 送显性位,通知发送单元正确接收
DEL:ACK界定符,固定格式,7个连续的隐性位
本文参考文章:https://blog.csdn.net/weixin_40528417/article/details/79476186 https://blog.csdn.net/weixin_50875614/article/details/119787978
|