超简单的CAN通信原理讲解一
超简单的CAN通信原理讲解(一)
MCU常用协议讲解
超简单的CAN通信原理讲解(一)
文章目录
前言
参考文件 :
<瑞萨电子can入门教程> ,可以在瑞萨官网下载到,讲的很细,想深究CAN协议的可以去好好研究。
🤦♂️想看完协议写出CAN的代码还是很难的,很多具体的操作需要结合CAN控制器去说明,CAN的协议文档我看了10多遍但是让我写出CAN的
通信代码我觉得还是很困难,只能做到给我一份CAN的代码我理解他的意思。所以我分两篇去讲解CAN协议,第一篇根据 CAN手册 去分析CAN协议具体的规范和格式,第二篇结合具体 CAN控制器 和CAN收发器去跟着理解CAN代码,笔者是一个理解能力一般的人😒,所以我会写文档一般都会很细致,如果别人看了我的文档能理解CAN写出CAN代码说明我才真正掌握CAN了🤣。
一、CAN协议是什么?
CAN协议是 Controller Area Network的缩写,全称控制器局域网络,是 ISO 国际标准化的串行通信协议。由德国电气商博世公司提出,并
通过了 ISO11898 和 ISO11519 进行了标准化,所以CAN协议也就有了两种执行标准,两种数据定义。
所以ISO11898也叫高速CAN(经典CAN),ISO 11519-2也叫容错CAN,高速很好理解,容错的话见后面, 汽车上常用的是高速CAN
下面放出两种协议对比,显性隐性不需要强记,知道总线电平等于他们的电位差(CAN_HIGH-CAN_LOW)即可
二、CAN协议使用场景
CAN协议最广泛的使用场景,就在于汽车领域了,基本现在所有的汽车电子控制都是使用CAN协议的,CAN最早提出也是为了解决汽车领域复杂电子期间之间的通信,同时兼顾可靠性。下面放一个老图,汽车CAN网络勾想
三、CAN网络拓扑图
CAN网络中的控制器和收发器是两种不同的东西,CAN控制器不直接连接CAN网络,CAN网络上的电平分为 显式 和 隐式 两种,
CAN协议使用差分信号进行通信,两根线分别为CAN_L和CAN_H
控制器:与MCU连接
收发器:把TTL电平转成CAN信号,或者把CAN信号转成TTL电平
四、CAN网络硬件接线图
两种协议下的CAN硬件电路连接也不同,可以通过末端电阻来判断是哪种连接方式,第一种在网络末端并联两个120Ω的电阻(有点像485通信),第二种在CAN_L和CAN_H分别串联两个2.2k的电阻,也可以通过这种方式来区分出是使用什么协议。
显性和隐性(这里注意黄色字体和认知中的显性对应1有点区别)
以常用高速CAN ISO11898说明:只需要记住典型值即可
- 典型电平是CAN_L = CAN_LOW = 2.5V
- 典型显性CAN_H -CAN_L = 0V ——————–》输出逻辑0
- 典型隐性CAN_H(3.5V) -CAN_L(1.5V) = 2V ——————–》输出逻辑1
CAN_HIGH | CAN_LOW | CAN_HIGH - CAN_LOW | 显隐性 | 逻辑电平(CAN收发器上TXD或者RXD上电平) |
---|---|---|---|---|
2.5V | 2.5V | 0V | 显性 | 0 |
3.5V | 1.5V | 2V | 隐性 | 1 |
隐性代表无数据,显性代表有数据。总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”
五、协议分析
1.CAN协议帧的种类
• 数据帧
• 遥控帧
• 错误帧
• 过载帧
• 帧间隔
CAN协议分为这五种帧,就快速使用来说,我们需要关注数据帧即可。
为什么只关注数据帧,因为数据帧是控制器组包去主动发送的,而类似错误帧之类的是总线单元主动发出的,例如标准的UART协议实际上是10bit(1个起始位,7个数据位,1个校验位,1个结束位),但是我们串口实际上只组包了7bit的数据,校验终止都是UART单元去组包的,
这里同理。我们控制器组包需要对 数据帧 组包,错误帧遥控帧等其他帧等明白了数据帧组包CAN总线也理解差不多了,可以去看协议文档学习。
2.CAN协议数据帧
数据帧由 7 个段构成。
(1) 帧起始
表示数据帧开始的段。 1bit低电平(显性)
(2) 仲裁段
表示该帧优先级的段。 11bit或者29bit的ID,29bit为扩展格式,大部分都是11bit标准格式
(3) 控制段
表示数据的字节数及保留位的段。 6bit表示数据的长度(可设置为0-8字节)
(4) 数据段
数据的内容,可发送 0~8 个字节的数据。 最大8byte
(5) CRC 段
检查帧的传输错误的段。 16bit(15bit的CRC和1bit的分隔符)
(6) ACK 段
表示确认正常接收的段。 2bit(ACK槽+ACK界定符)
(7) 帧结束
表示数据帧结束的段。 7bit高电平(隐性位)
数据帧格式如下:其中标准模式为常用模式,遵循ISO11898协议
3.CAN协议的波特率计算
CAN协议是差分信号传输,不像I2C和SPI有单独的时钟总线,那么如何决定传输速率,如何判定1us内传输的是1bit还是1byte呢?
位时序
由发送单元在非同步的情况下每秒钟发送的位数称为位速率。一个位分为四段
tq
全程time Quantun,是最小时间单位,类似于I2C同步时钟里面的一个最小方波, tq = 1 / 波特率 ,每个段由不同数目的tq组成
• 同步段(SS)
• 传播时间段(PTS)
• 相位缓冲段 1(PBS1)
• 相位缓冲段 2(PBS2)
波特率=时钟频率 / (分频系数 + 1)/ (时间段1+时间段2+同步跳转长度)
bps = Fpclk1/ ((tbs1+1+tbs2+1+1)*brp)
可以使用下面CAN波特率计算网站快速计算波特率
总结
下一篇会结合STM32的CAN控制器去逐步分析代码。。。