stm32 有关CAN通信相关理解

目录

一、CAN是什么?

二、CAN通讯协议

CAN协议通过以下五种类型帧进行

数据帧

位时序

 有关bxCAN介绍

CAN发送流程

CAN接收流程

总结



本篇以stm32F103为例。参考STM32F1-HAL库手册,本篇图取自手册里的插图,
 


一、CAN是什么?

        CAN 是 Controller Area Network 的缩写(以下称为 CAN ),是 ISO 国际标准化的串行通信
协议。 在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种
各样的电子控制系统被开发了出来。 CAN 通过 ISO11898 ISO11519 进行了标准化,现在在欧
洲已是汽车网络的标准协议。
        CAN 协议经过 ISO 标准化后有两个标准: ISO11898 标准和 ISO11519-2 标准。其中 ISO11898 是针对通信速率为 125Kbps~1Mbps 的高速通信标准,而 ISO11519-2 是针对通信速率为 125Kbps以下的低速通信标准。

二、CAN通讯协议

CAN协议通过以下五种类型帧进行

帧类型         帧用途
数据帧         用于发送单元向接收单元传送数据的帧        
遥控帧         用于接收单元向具有相同 ID 的发送单元请求数据的帧
错误帧         用于当检测出错误时向其它单元通知错误的帧
过载帧         用于接收单元通知其尚未做好接收准备的帧
间隔帧         用于将数据帧及遥控帧与前面的帧分离开来的帧
  1. 数据帧

    stm32 有关CAN通信相关理解_第1张图片

数据帧一般由七个部分组成

1)帧起始:表示数据帧开始的段。标准帧和拓展帧都是由1个位的显性电平表示帧起始

2)仲裁段:表示该帧优先级的段。

stm32 有关CAN通信相关理解_第2张图片

   1.标准帧

ID有11位。从ID28到ID11被依次发送。禁止高七位都为隐形(ID=1111111XXXX)

     2.拓展帧

ID有29位。基本ID从ID28到ID18,拓展ID由ID17到ID0。禁止高七位都为(ID=1111111XXXX)。

RTR:用于标识是否是远程帧(0:数据帧;1:远程帧)

SRR:代替了标准帧中的RTR位,代替远程请求位,为隐形位。

拓展格式里出现)IDE:标识符选择位(0:使用标准标识符;1:使用扩展标识符)

3)控制段 :由 6 个位构成,表示数据段的字节数。标准帧和扩展帧的控制段稍有不同

stm32 有关CAN通信相关理解_第3张图片

(D、R此处代表高、低电平)

r0,r1:必须全部以显性电平发送,但是接收端可以接收显性、隐性及 任意组合的电平。

DLC:数据长度表示段,高位在前,有效值为0~8,但接收方收到9~15也并不报错。

 4)数据段:该段可包含0~8字节数据。标准帧和扩展帧在 这个段的定义都是一样。

5)CRC段:用于检查帧传输错误。由15个位的CRC顺序和1个位的CRC界定符(用于分隔的位)组成,标准帧和扩展帧在这个段的格式也是相同的。

stm32 有关CAN通信相关理解_第4张图片

在CRC中有位填充。是为防止突发错误而设定的功能,当同样电平持续5位时则添加一个位的反型数据。

6)ACK段:此段用来确认是否正常接收。

 stm32 有关CAN通信相关理解_第5张图片

        发送单元 的ACK段:发送单元在 ACK 段发送 2 个位的隐性位。

        接收单元的ACK段:接收到正确消息的单元在 ACK (ACK Slot)发送显性位,通知发送单元正常接收结束。这称作ACK”或者返回 ACK”

         发送 ACK 的是 在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元 不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。

7)帧结束:由 7 个位的隐性位组成。

位时序

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

stm32 有关CAN通信相关理解_第6张图片


 有关bxCAN介绍

STM32F1 自带的是 bxCAN,即基本扩展 CAN。它支持 CAN 协议 2.0A 和 2.0B。

CAN发送流程

stm32 有关CAN通信相关理解_第7张图片

程序选择一个空置邮箱(TME=1)→设置好ID,DLC与发送的数据→设置 CAN_TIxR 的 TXRQ 位为 1,请求发送→邮箱挂号(等待成为最高优先级)→ 预定发送(等待总线空闲)→发送→邮箱空置。

CAN接收流程

stm32 有关CAN通信相关理解_第8张图片

CAN 接收到的有效报文,被存储在 3 级邮箱深度的 FIFO(由硬件控制) 中。应用程序只能通过读取 FIFO 输出邮箱,来读取 FIFO 中最先收到的报文。

CAN 接收流程为:FIFO 空→收到有效报文→挂号_1(存入 FIFO 的一个邮箱,这个由硬件 控制)→收到有效报文→挂号_2→收到有效报文→挂号_3→收到有效报文→ 溢出。

值得注意的是,我们必须在FIFO溢出之前读出至少1个报文,否则FIFO溢出,报文丢失。每读一个报文,相应挂号就减一,直至FIFO空


总结

本篇写了一些本人觉得CAN里需要部分理解的概念,初学者可能有写地方理解不对,欢迎指正。

你可能感兴趣的:(单片机,stm32)