《STM32从零开始学习历程》——CAN通讯协议协议层

《STM32从零开始学习历程》@EnzoReventon

CAN通讯协议协议层

相关链接:

《STM32从零开始学习历程》——CAN通讯协议物理层
CAN-bus规范 V2.0版本
CAN总线入门
周立功-CAN协议中文版

参考资料:
[野火EmbedFire]《STM32库开发实战指南——基于野火霸天虎开发板》
[正点原子]STM32F4开发指南-库函数版本_V1.2
[ST]《STM32F4xx中文参考手册》
CAN-bus规范 V2.0版本
CAN总线入门
周立功-CAN协议中文版

CAN的波特率及位同步

由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯,特别地,CAN还会使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。

位时许分解

  • 为了实现位同步,CAN协议把每一个数据位的时序分解成SS段、PTS段、PBS1段、PBS2段
  • 这四段的长度加起来即为一个CAN数据位的长度。
  • 分解后最小的时间单位是Tq
  • 一个完整的位由8~25个Tq组成。
    《STM32从零开始学习历程》——CAN通讯协议协议层_第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。主要用来产生偏移来控制采样点,采样点一般控制在时许的70%左右即可。

PBS1段(PHASE SEG1):
PBS1译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBS1段的初始大小可以为1~8Tq。

PBS2段(PHASE SEG2):
PBS2这是另一个相位缓冲段也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。PBS2段的初始大小可以为2~8Tq。

通讯的波特率

  • 总线上的各个通讯节点只要约定好1个Tq的时间长度以及每一个数据位占据多少个Tq,就可以确定CAN通讯的波特率。
  • 例如,假设上图中的1Tq=1us,而每个数据位由19个Tq组成,则传输一
    位数据需要时间T 1bit =19us,从而每秒可以传输的数据位个数为:1x10^6/19 = 52631.6 (bps)
    这个每秒可传输的数据位的个数即为通讯中的波特率。

CAN的报文种类及结构

当使用CAN协议进行通讯时,需要对数据、操作命令(如读/写)以及同步信号进行打包,打包后的这些内容称为报文。

报文的种类

在原始数据段的前面加上传输起始标签、片选(识别)标签和控制标签,在数据的尾段加上CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号,各种各样的标签就如同SPI中各种通道上的信号,起到了协同传输的作用。当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为CAN的 “数据帧”

  • 为了更有效地控制通讯,CAN一共规定了5种类型的帧。
帧用途
数据帧 用于节点向外传送数据
遥控帧 用于向远端节点请求数据
错误帧 用于向远端节点通知校验错误,请求重新发送上一个数据
过载帧 用于通知远端节点:本节点尚未做好接收准备
帧间隔 用于将数据帧及遥控帧与前面的帧分离开来

数据帧的结构

数据帧结构图:
《STM32从零开始学习历程》——CAN通讯协议协议层_第2张图片

数据帧:

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

帧起始:

  • SOF段(Start Of Frame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平,它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步

仲裁段:

  • 当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。

  • 仲裁段的内容主要为本数据帧的ID信息(标识符),数据帧具有标准格式和扩展格式两种,区别就在于ID信息的长度,标准格式的ID为11位扩展格式的ID为29位,它在标准ID的基础上多出18位

  • 在CAN协议中,ID起着重要的作用,它决定着数据帧发送的优先级,也决定着其它节点是否会接收这个数据帧。CAN协议不对挂载在它之上的节点分配优先级和地址,对总线的占有权是由信息的重要性决定的,即对于重要的信息,可给它打包上一个优先级高的ID,使它能够及时地发送出去。

  • 也正因为它这样的优先级分配原则,使得CAN的扩展性大大加强,在总线上增加或减少节点并不影响其它设备。

  • 举一个例子来理解一下CAN总线仲裁:
    假设,在一辆汽车上,许多设备由CAN总线相互连接:
    在CAN总线上挂载着许多节点,例如:节点1挂载着温度传感器;节点2挂载着刹车;节点3挂载着车窗升降设备;节点四是车载电脑。按照正常的逻辑,刹车的优先级是最高的,那么在配置刹车报文ID时。某一时刻,车载电脑想要采集车内温度而与此同时刹车发来请求信号,CAN总线会根据优先级进行排序,优先级高的刹车命令首先执行。

《STM32从零开始学习历程》——CAN通讯协议协议层_第3张图片

  • 报文的优先级,是通过对ID的仲裁来确定的。根据前面对物理层的分析我们知道如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平,CAN正是利用这个特性进行仲裁。

  • 若两个节点同时竞争CAN总线的占有权,当它们发送报文时,若首先出现隐性电平,则会失去对总线的占有权,进入接收状态。在开始阶段,两个设备发送的电平一样,所以它们一直继续发送数据。到了图中箭头所指的时序处(黄色部分),节点单元1发送的为隐性电平,而此时节点单元2发送的为显性电平,由于总线的“线与”特性使它表达出显性电平,因此单元2竞争总线成功,这个报文得以被继续发送出去。

  • 仲裁段ID的优先级也影响着接收设备对报文的反应。因为在CAN总线上数据是以广播的形式发送的,所有连接在CAN总线的节点都会收到所有其它节点发出的有效数据,因而CAN控制器大多具有根据ID过滤报文的功能,它可以控制自己只接收某些ID的报文。

RTR、IDE、SRR位:

《STM32从零开始学习历程》——CAN通讯协议协议层_第4张图片

  • RTR位(Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧遥控帧的,当它为显性电平时表示数据帧(为0),隐性电平时表示遥控帧(为1)。数据帧优先于遥控帧。

  • IDE位(Identifier Extension Bit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平(为1)时表示标准格式,隐性电平(为0)时表示扩展格式,扩展帧主要是用来扩展报文ID号,这样子可以挂载更多设备。

  • SRR位(Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的RTR位。由于扩展帧中的SRR位为隐性位,RTR在数据帧为显性位,所以在两个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高,扩展帧的优先级较低

控制段:

  • 在控制段中的r1和r0为保留位,默认设置为显性位(为0)。它最主要的是DLC段(DataLength Code),译为数据长度码,它由4个数据位组成,用于表示本报文中的数据段含有多少个字节,DLC段表示的数字为0~8(字节)。

数据段:

  • 数据段为数据帧的核心内容,它是节点要发送的原始信息,由0~8个字节组成,MSB先行。

CRC段:

  • 为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收节点算出的CRC码跟接收到的CRC码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC部分的计算一般由CAN控制器硬件完成,出错时的处理则由软件控制最大重发数。
  • 在CRC校验码之后,有一个CRC界定符,它为隐性位,主要作用是把CRC校验码与后面的ACK段间隔起来。用来区分ACK,间隔。

ACK段:

  • ACK段包括一个ACK槽位,和ACK界定符位。类似I2C总线,在ACK槽位中,发送节点发送的是隐性位(为1),而接收节点则在这一位中发送显性位以示应答。在ACK槽和帧结束之间由ACK界定符间隔开。

帧结束:

  • EOF段(End Of Frame),译为帧结束,帧结束段由发送节点发送的7个隐性位表示结束。

你可能感兴趣的:(STM32,CAN通讯,ARM,嵌入式,单片机,stm32,can)