适合初学者的STM32 CAN协议理解总结( ISO11898 标准)

暑假学习的时候看到了CAN总线,几个小伙伴好像看的都比较苦恼。是的,对于大量的说明难免有些不想看,看不懂为什么要把TIM这些东西设为1,很多字符又代表什么意思......但对知识的畏惧是无法向前的。静下心来慢慢看就好了!我在这里记录一些我学习CAN协议过程中的理解总结,希望能帮到一些初学者。

CAN的组成框图

下图为互联网型的双CAN框图:

我使用的F103ZET6只有一个串口,其中3个发送邮箱3个FIFO0与FIFO1接受是十分重要的部分,左边的是一些相关状态或控制寄存器。先眼熟一下,接下来会用到他们。(大量的寄存器字符就是左边那些要用到的)

CAN的发送流程

CAN 发送流程为:程序选择 1 个空置的邮箱(TME=1)→设置标识符(ID),数据长度和发送数据→设置 CAN_TIxR 的 TXRQ 位为 1,请求发送邮箱挂号(等待成为最高优先级)→预定发送(等待总线空闲)→发送邮箱空置

可以理解为CAN发送数据时找到一个空置的邮箱然后给他取个名字并向他塞了一些邮件,现在这个邮箱只需要等其它邮箱发完邮件自己就能发邮件了。

CAN的接受流程

CAN 接收流程为: FIFO 空→收到有效报文挂号-1(存入 FIFO 的一个邮箱,这个由硬件
控制,我们不需要理会) →收到有效报文挂号-2→收到有效报文→挂号-3→收到有效报文
溢出

先把大致流程看一遍,相比最初是不是有了一个稍微清晰一点的认识呢。当然问题也是更多的,比如为什么要把TIM这些东西设为1,这些字母又代表什么意思,CAN的数据是怎么发送的等等。现在就要来学基础知识填补空白了!

CAN物理层特征

对于CAN的信号逻辑1和0的产生:

当CAN_High 为3.5V CAN_Low 为 1.5V 差值为2V左右时为显性电平表示,而两者相等时为隐性电平表示1。

5种帧

CAN 协议是通过以下 5 种类型的帧进行的:

帧类型

帧用途

数据帧

用于发送单元向接收单元传送数据的帧

遥控帧

用于接收单元向具有相同 ID 的发送单元请求数据的帧

错误帧

用于当检测出错误时向其它单元通知错误的帧

过载帧

用于接收单元通知其尚未做好接收准备的帧

间隔帧

用于将数据帧及遥控帧与前面的帧分离开来的帧

https://blog.csdn.net/qq_34392093/article/details/52141952这篇博客有详细介绍,写的挺不错的大家可以看看。

数据帧

数据帧一般由 7 个段构成(可对应下图各端),即:
(1) 帧起始。表示数据帧开始的段。
(2) 仲裁段。表示该帧优先级的段。
(3) 控制段。表示数据的字节数及保留位的段。
(4) 数据段。数据的内容,一帧可发送 0~8 个字节的数据。
(5) CRC 段。检查帧的传输错误的段。
(6) ACK 段。表示确认正常接收的段。 

这里不细讲各个段了,可在提到的另一篇博客或CAN的相关说明中找到

可以 当成时序图来看吧,差不多的感觉

图中 D 表示显性电平, R 表示隐形电平(下同)。而紫色的那部分为什么D/R都行呢嗯?因为那些数据并不是特定的,像是不同的ID。不同的数据就会有不同的电平。

帧起始,这个比较简单,标准帧和扩展帧都是由 1 个位的显性电平表示帧起始。

仲裁段,表示数据优先级的段,标准帧和扩展帧格式在本段有所区别

位时序

这里的知识有什么用呢?我先打个比方,某个魔法石需要咒语开启,但需要特定的时间说特定的话才能让它实现功能。如果没在特定的时间念咒语,那么是无法正确实现功能的。我们的CAN需要从机的采样时间如何和主机一致,这样才能使其正常的工作。这个问题是通讯双方通过约定波特率实现同步解决的。 
在CAN通讯中,非同步状态下每秒发送的位数称为位数率,依据时间片的概念将1个bit的时间分为四个部分 
1.同步段(SS) 
2.传播时间段(PTS) 
3.相位缓冲段1(PBS1) 
4.相位缓冲段2(PBS2) 

这些又由可称为Time Quantum(以下称为Tq)的最小时间单位构成。1 位分为4 个段,每个段又由若干个Tq 构成,这称为位时序。位时间=1/波特率,因此,知道位时间,我们就可以知道波特率。1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。

下图对几个时间段的作用进行了分析解释 

猜你喜欢

转载自blog.csdn.net/qq_40589292/article/details/81066193