首先非常感谢秉火团队为我们提供学习STM32的丰富资料及详细教程,此笔记仅用作个人学习记录,以此加深记忆,如果读者也喜欢,请一同感谢并支持秉火团队。
1. CAN 的波特率及位同步
由于CAN 属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯,特别地,CAN 还会使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。位时序分解
为了实现位同步,CAN 协议把每一个数据位的时序分解成如下图 所示的SS 段、PTS 段、PBS1 段、PBS2 段,这四段的长度加起来即为一个CAN 数据位的长度。分解后最小的时间单位是Tq,而一个完整的位由8~25 个Tq 组成。为方便表示,图 42-5 中的高低电平直接代表信号逻辑0 或逻辑1(不是差分信号)。

该图中表示的CAN 通讯信号每一个数据位的长度为19Tq,其中SS 段占1Tq,PTS 段占6Tq,PBS1 段占5Tq,PBS2 段占7Tq。信号的采样点位于PBS1 段与PBS2 段之间,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样。

SS 段(SYNC SEG) SS 译为同步段,若通讯节点检测到总线上信号的跳变沿被包含在SS 段的范围之内,则表示节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。SS 段的大小固定为1Tq。
PTS 段(PROP SEG) PTS 译为传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS 段的大小可以为1~8Tq。
PBS1 段(PHASE SEG1) PBS1 译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBS1 段的初始大小可以为1~8Tq。
PBS2 段(PHASE SEG2) PBS2 这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。PBS2 段的初始大小可以为2~8Tq。

通讯的波特率
总线上的各个通讯节点只要约定好1 个Tq 的时间长度以及每一个数据位占据多少个Tq,就可以确定CAN 通讯的波特率。
例如,假设上图中的1Tq=1us,而每个数据位由19 个Tq 组成,则传输一位数据需要时间T1bit =19us,从而每秒可以传输的数据位个数为:
1x106/19 = 52631.6 (bps)
这个每秒可传输的数据位的个数即为通讯中的波特率。
同步过程分析
波特率只是约定了每个数据位的长度,数据同步还涉及到相位的细节,这个时候就
需要用到数据位内的SS、PTS、PBS1 及PBS2 段了。
根据对段的应用方式差异,CAN 的数据同步分为硬同步和重新同步。其中硬同步只是当存在“帧起始信号”时起作用,无法确保后续一连串的位时序都是同步的,而重新同步方式可解决该问题,这两种方式具体介绍如下:
(1) 硬同步
若某个CAN 节点通过总线发送数据时,它会发送一个表示通讯起始的信号(即帧起始信号),该信号是一个由高变低的下降沿。而挂载到CAN 总线上的通讯节点在不发送数据时,会时刻检测总线上的信号。
如下图可以看到当总线出现帧起始信号时,某节点检测到总线的帧起始信号不在节点内部时序的SS 段范围,所以判断它自己的内部时序与总线不同步,因而这个状态的采样点采集得的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的SS段平移至总线出现下降沿的部分,获得同步,同步后采样点就可以采集得正确数据了。

(2) 重新同步
前面的硬同步只是当存在帧起始信号时才起作用,如果在一帧很长的数据内,节点信号与总线信号相位有偏移时,这种同步方式就无能为力了。因而需要引入重新同步方式,它利用普通数据位的高至低电平的跳变沿来同步(帧起始信号是特殊的跳变沿)。重新同步与硬同步方式相似的地方是它们都使用SS 段来进行检测,同步的目的都是使节点内的SS段把跳变沿包含起来。
重新同步的方式分为超前和滞后两种情况,以总线跳变沿与SS 段的相对位置进行区分。第一种相位超前的情况如下图 ,节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前2Tq,这时控制器在下一个位时序中的PBS1 段增加2Tq 的时间长度,使得节点与总线时序重新同步。

2. CAN 的报文种类及结构
报文的种类
在原始数据段的前面加上传输起始标签、片选(识别)标签和控制标签,在数据的尾段加上CRC 校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同SPI 中各种通道上的信号,起到了协同传输的作用。
为了更有效地控制通讯,CAN 一共规定了5 种类型的帧。

帧类型 帧用途
数据帧 用于节点向外传输数据
遥控帧 用于向远端节点传输数据
错误帧 用于向远端节点通知校验错误,请求重新发送上一个数据
帧间隔 用于将数据帧及遥控帧与前面的帧分离开来

数据帧的结构
数据帧以一个显性位(逻辑0)开始,以7 个连续的隐性位(逻辑1)结束,在它们之间,分别有仲裁段、控制段、数据段、CRC 段和ACK 段。

帧起始 SOF 段(Start Of Frame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平,它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。
仲裁段 当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。 仲裁段的内容主要为本数据帧的ID 信息(标识符),数据帧具有标准格式和扩展格式两种,区别就在于ID 信息的长度,标准格式的ID 为11 位,扩展格式的ID 为29 位,它在标准ID 的基础上多出18 位
RTR位 位(Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。
IDE 位 (Identifier Extension Bit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。
SRR 位 (Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的RTR 位。由于扩展帧中的SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。
控制段 在控制段中的r1 和r0 为保留位,默认设置为显性位。它最主要的是DLC 段(DataLength Code),译为数据长度码,它由4 个数据位组成,用于表示本报文中的数据段含有多少个字节,DLC 段表示的数字为0~8。
数据段 数据段为数据帧的核心内容,它是节点要发送的原始信息,由0~8 个字节组成,MSB先行。
CRC 段 为了保证报文的正确传输,CAN 的报文包含了一段15 位的CRC 校验码,一旦接收节点算出的CRC 码跟接收到的CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC 部分的计算一般由CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。在CRC 校验码之后,有一个CRC 界定符,它为隐性位,主要作用是把CRC 校验码与后面的ACK 段间隔起来。
帧结束 EOF 段(End Of Frame),译为帧结束,帧结束段由发送节点发送的7 个隐性位表示结束。

关于其它的CAN 报文结构如下表

CAN通讯协议层--秉火STM32学习笔记相关推荐

  1. CAN通讯方式--秉火STM32学习笔记

    首先非常感谢秉火团队为我们提供学习STM32的丰富资料及详细教程.本笔记仅用作个人学习记录,以此加深记忆,如感觉有帮助,可感谢支持秉火团队. CAN 协议简介 CAN 是控制器局域网络(Control ...

  2. 嵌入式设备的通讯--秉火STM32学习笔记

    首先非常感谢秉火团队为我们提供学习STM32的丰富资料及详细教程. 在计算机设备与设备之间或集成电路之间常常需要进行数据传输,数据传输的实现方式总结如下. 串行通讯与并行通讯 按数据传送的方式,通讯可 ...

  3. STM32学习笔记(十) CAN通讯测试(环回模式)

    1.CAN通讯的理解 想学习CAN通讯,那么要对通讯协议有一定的认知.通讯协议是指通信双方对数据传送控制的一种约定.约定中包括对数据格式,同步方式,传输速度,传送步骤,检纠错方式以及控制字符定义等问题 ...

  4. STM32学习笔记(15)——SPI协议

    STM32学习笔记(15)--SPI协议 一.SPI协议简介 1. 物理层 2. 协议层 (1) 通讯的开始与停止 (2)时钟极性CPOL.时钟相位CPHA 二.STM32的SPI外设 1. 通讯引脚 ...

  5. STM32学习笔记(9)——(I2C续)读写EEPROM

    STM32学习笔记(9)--(I2C续)读写EEPROM 一.概述 1. 背景介绍 2. EEPROM简介 二.AT24C02--常用的EEPROM 1. 电路原理图 2. 写操作 (1)按字节写操作 ...

  6. stm32学习笔记---ADC电压采集

    1.  ①电压输入范围 ADC 输入范围为:VREF- ≤ VIN ≤ VREF+.由 VREF-.VREF+ .VDDA .VSSA.这四个外部 引脚决定. 我们在设计原理图的时候一般把 VSSA ...

  7. 《STM32学习笔记》4——核心功能电路与编程(下)

    接上文,文中的图片,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.蜂鸣器驱动 1.蜂鸣器介绍 2.蜂鸣器电路 3.蜂鸣器程序 二. MIDI 音乐 ...

  8. LoRaWan协议1.1 ClassB部分学习笔记

    LoRaWan协议1.1 ClassB部分学习笔记 目录 8.对Class B的介绍 9.同步网络发起下行的原理(class b独有) 10.Class B上行帧 11. 下行ping包格式(clas ...

  9. STM32学习笔记 | CAN总线收发数据常见问题分析

    关注+星标公众号,不错过精彩内容 CAN,Controller Area Network(控制器局域网络),在汽车电子.工业控制领域的应用比较多,通常用于局域组网. CAN总线和UART.I2C.SP ...

最新文章

  1. ACdream 1099——瑶瑶的第K大——————【快排舍半,输入外挂】
  2. 非MFC工程中使用MFC库
  3. Oracle查询慢的原因总结
  4. 谷歌与军方合作新料:决定AI不用于武器前,还想帮军方搜集情报
  5. Centos 进入单入口模式
  6. Struts2中的校验器
  7. oracle启动数据库错误
  8. 1计算机组成及作用是什么,如何理解计算机组成和计算机体系结构?
  9. DevExpress Office文件API打印 PDF 文档
  10. 数据结构实验三 线性表的链式存储结构及实现
  11. ajax传参无法传中文,IE浏览器 ajax传参数值为中文时出现乱码的解决方案
  12. .net编程的十大技巧 转载之Jeffery.Sun
  13. 使用ping检测MTU值
  14. 快消行业巨量引擎营销攻略
  15. 重温C语言三之----指针的认识
  16. [Python] 随机抽样
  17. only buildscript {} and other plugins {} script blocks are allowed before plugins {} blocks...
  18. 影响GPS定位精度的基本概念
  19. GBDT(梯度提升树)算法概述
  20. 【Unity】3D坦克大战入门级别开发

热门文章

  1. 国外邮箱哪家好?好用的公司邮箱怎么申请?
  2. UBUNTU12下pyv8 的安装部骤
  3. Zotero——一款文献管理工具
  4. 网页标签中description是什么意思
  5. the jar file has no source attachment解决方法
  6. 如何练习打字/盲打(作者的感想与建议)
  7. python批量修改列名_pandas修改DataFrame列名的实现方法
  8. 极路由——彻底凉了,云插件服务都关闭了,还没root的抓紧了
  9. M1 Mac使用Kitty script入库标准音源到Kontakt6
  10. python爬取天猫,python如何爬取天猫店铺商品链接?