目录

超简单的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)即可

https://i-blog.csdnimg.cn/blog_migrate/16d664b148052de03eb1926089f2dbf3.png

二、CAN协议使用场景

CAN协议最广泛的使用场景,就在于汽车领域了,基本现在所有的汽车电子控制都是使用CAN协议的,CAN最早提出也是为了解决汽车领域复杂电子期间之间的通信,同时兼顾可靠性。下面放一个老图,汽车CAN网络勾想

https://i-blog.csdnimg.cn/blog_migrate/c25207e7ee9218df6378d53db9c5de22.png


三、CAN网络拓扑图

CAN网络中的控制器和收发器是两种不同的东西,CAN控制器不直接连接CAN网络,CAN网络上的电平分为 显式 和 隐式 两种,

CAN协议使用差分信号进行通信,两根线分别为CAN_L和CAN_H

控制器:与MCU连接

收发器:把TTL电平转成CAN信号,或者把CAN信号转成TTL电平

https://i-blog.csdnimg.cn/blog_migrate/c409473b126e6b01702a0223027dce6e.png

四、CAN网络硬件接线图

两种协议下的CAN硬件电路连接也不同,可以通过末端电阻来判断是哪种连接方式,第一种在网络末端并联两个120Ω的电阻(有点像485通信),第二种在CAN_L和CAN_H分别串联两个2.2k的电阻,也可以通过这种方式来区分出是使用什么协议。

https://i-blog.csdnimg.cn/blog_migrate/ef3903a3bb3d3b04023c47f02da02349.png

显性和隐性(这里注意黄色字体和认知中的显性对应1有点区别)

以常用高速CAN ISO11898说明:只需要记住典型值即可

  1. 典型电平是CAN_L = CAN_LOW = 2.5V
  2. 典型显性CAN_H -CAN_L = 0V ——————–》输出逻辑0
  3. 典型隐性CAN_H(3.5V) -CAN_L(1.5V) = 2V ——————–》输出逻辑1
CAN_HIGHCAN_LOWCAN_HIGH - CAN_LOW显隐性逻辑电平(CAN收发器上TXD或者RXD上电平)
2.5V2.5V0V显性0
3.5V1.5V2V隐性1

隐性代表无数据,显性代表有数据。总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”

五、协议分析

1.CAN协议帧的种类

• 数据帧

• 遥控帧

• 错误帧

• 过载帧

• 帧间隔

CAN协议分为这五种帧,就快速使用来说,我们需要关注数据帧即可。

为什么只关注数据帧,因为数据帧是控制器组包去主动发送的,而类似错误帧之类的是总线单元主动发出的,例如标准的UART协议实际上是10bit(1个起始位,7个数据位,1个校验位,1个结束位),但是我们串口实际上只组包了7bit的数据,校验终止都是UART单元去组包的,

这里同理。我们控制器组包需要对 数据帧 组包,错误帧遥控帧等其他帧等明白了数据帧组包CAN总线也理解差不多了,可以去看协议文档学习。

https://i-blog.csdnimg.cn/blog_migrate/7637c6e1834587b03612b9924e4c80c1.png

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协议

https://i-blog.csdnimg.cn/blog_migrate/e997e160ea13c4db70167d0d69a67f52.png

3.CAN协议的波特率计算

CAN协议是差分信号传输,不像I2C和SPI有单独的时钟总线,那么如何决定传输速率,如何判定1us内传输的是1bit还是1byte呢?

位时序

由发送单元在非同步的情况下每秒钟发送的位数称为位速率。一个位分为四段

tq

全程time Quantun,是最小时间单位,类似于I2C同步时钟里面的一个最小方波, tq = 1 / 波特率 ,每个段由不同数目的tq组成

• 同步段(SS)

• 传播时间段(PTS)

• 相位缓冲段 1(PBS1)

• 相位缓冲段 2(PBS2)

https://i-blog.csdnimg.cn/blog_migrate/0e9589d7a917ee1f3c840a494342f86f.png

波特率=时钟频率 / (分频系数 + 1)/ (时间段1+时间段2+同步跳转长度)

bps = Fpclk1/ ((tbs1+1+tbs2+1+1)*brp)

可以使用下面CAN波特率计算网站快速计算波特率


总结

下一篇会结合STM32的CAN控制器去逐步分析代码。。。