深入理解CAN报文的基本概念和原理

通信协议原理及应用

通信分类

根据数据传输方式可分为串行通信并行通信,根据接收端和发送端时钟频率的异同可以分为同步通信异步通信,根据通信双方的分工和信号传输方向可分为单工通信半双工通信全双工通信

串行通信、并行通信

串行通信:数据的各位在同一根数据线上逐位发送和接受;

并行通信:数据的各位同时在多根数据线上发送或接收

串行通信和并行通信

串行通信和并行通信的比较

同步通信、异步通信

同步通信:发送和接收端使用同一时钟,是一种连续传输数据的通信方式,一次通信传输多个字符数据;同步通信要在每帧信息的开始加上同步字符,在没有信息要传输时,要填上空字符;

异步通信:发送和接收端使用各自时钟,是一种不连续传输数据的通信方式,一次通信传输一个字符数据;异步通信由起始位、数据位、校验位以及停止位构成字符帧,接收端始终处于接收状态。

image.png

image.png

image.png

image.png

单工、半双工、双工通信

根据串行数据的传输方向,可以将通信分为单工、半双工、双工通信。

image.png

另外,要注意串行通信传输速率中比特率和波特率的区别:

比特率:每秒钟传送的二进制位数,单位bps;

波特率:每秒钟调制信号变化的次数,单位Baud。

串行通信常用波特率表示数据传输率,如9600 115200等

波特率与比特率的关系为:比特率 = 波特率 × 单个调制状态对应的二进制位数

单个调制状态对应1个二进制位时,或对于数字信号1或0直接用两种不同电压表示的基带传输,此时,比特率==波特率。

而在串行通信中,双方识别位的时间间隔要相同,所以通信双方的波特率必须一致

UART原理

串口通信与UART通信的区别

UART:通用异步接收/发送装置,两线(Rx、Tx)实现的异步、全双工通信方式;

串口:含义比UART广,包括了UART

嵌入式中说的串口,一般是UART口

由于串口通信没有时钟信号线,所以接收和发送方需要规定好相同的波特率,以此保证传输数据的正确性。

image.png

工作原理

image.png

发送端:空闲状态下,线路处于高电平;当接收到发送指令后,拉低线路的一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位,一帧数据发送完成。

接收端:空闲状态,线路处于高电平;当检测到线路的下降沿(高电平变为低电平)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备接收数据或存入缓冲区。

一主多从的基本工作原理

image.png

UART应用
  1. 单片机—电脑串口助手(发送数据,方便调试其他部分)
  2. 单片机—单片机(一主多从或一主一从)
  3. 单片机—蓝牙,单片机、手机、电脑等(最简单的无线数据传输)

SPI原理

SPI是串行外设接口,是一种高速的,全双工,同步的通信总线。

SPI以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上三根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。

image.png

CS:控制芯片是否被选中,也就是说只有片选信号位预先规定的使能信号时(高电平或低电平),对此芯片的操作才是有效的,这就允许在同一总线上连接多个SPI设备成为可能。

SDI/SDO/SCLK:通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI、SDO则基于此脉冲完成数据传输。数据输出通过SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取,完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

注意:SCK信号线只由主设备控制,从设备不能控制线号线。同样,在一个基于SPI的设备中,至少有一个主控设备

image.png

image.png

image.png

IIC原理

IIC总线是一种两线式串行总线,用于连接微控制器及其外围设备,半双工通信方式。它由数据线SDA和时钟SCL构成串行总线,可发送和接收数据。

IIC支持多主控,其中任何时候能够进行发送和接收的设备都可以成为主总线,一个主控能够控制信号的传输和时钟频率,当然,在任何时间点上都只能有一个主控。

image.png

image.png

空闲状态:当IIC总线的数据线SDA和时钟线SCL两条信号线同时处于高电平时,规定为总线的空闲状态。由两条信号线各自的上拉电阻把电平拉高。

起始信号:当时钟线SCL为高期间,数据线SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号;

停止信号:当时钟线SCL为高期间,数据线SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号;

应答信号:发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK),表示接受器已经成功接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接受器接受该字节没有成功。

image.png

数据有效性:
image.png

数据的传达和延边时间:
image.png

IIC通信流程:
image.png

CAN总线

点对点通信和总线通信

image.png

image.png

CAN总线和ECU的结构

image.png

CAN总线寻址方式

点对点寻址、广播寻址:
image.png

广播寻址的接收过滤:
image.png

CAN总线访问机制

非破坏性仲裁机制:
image.png

线与机制、回读机制:
image.png

优先级:
image.png

CAN报文结构

数据帧结构:

image.png

帧起始帧结束:帧起始1位,为显性电平(为0),接收节点接收到帧起始会将时钟进行同步(硬同步);帧结束由7个连续的隐性位组成

注:显性电平和隐性电平是相对于CAN_H和CAN_L而言的差分信号电平,并非TTL电平上的高低电平,需要注意

仲裁场:包括帧ID和RTR位。帧ID为11位,高位在前发送;RTR位是远程帧标志,为显性电平(0)时是数据帧,为隐性电平(1)时是远程帧;

image.png

CAN控制器在发送数据的同时会监测数据线的电平是否与发送数据的对应电平相同,如果不同,则停止发送并作其他处理;

image.png

仲裁场可以解决总线竞争的问题,假设节点A、B和C都发送相同格式相同类型的帧,如标准格式数据帧,它们竞争总线的过程是(如图所示):

从该分析过程得出结论是:帧ID值越小,优先级越高;

对于同为扩展格式数据帧、标准格式远程帧和扩展格式远程帧的情况同理

控制场:标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成;扩展帧控制段则由IDE、r1、r0和DLC组成如图所示:

image.png

数据场

image.png

CRC场:CAN-bus使用CRC校验进行数据检错,CRC校验值存放于CRC段。 CRC校验段由15位CRC值和1位CRC界定符构成如图所示。

ACK场:当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平如图所示。

远程帧结构:

与数据帧相比,远程帧结构上无数据段,由6个段组成,同理分为标准格式和扩展格式,且RTR位为1(隐性电平)如图所示。

如下图所示由于数据帧的RTR位为显性电平,远程帧的RTR位为隐性电平。所以帧格式和帧ID都相同情况下,数据帧的优先级比远程帧优先级高如图所示:

数据帧与远程帧的区别

image.png

错误帧

尽管CAN-bus是可靠性很高的总线,但依然可能出现错误;CAN-bus的错误类型共有5种(如图所示)。

当出现5种错误类型之一时,发送或接收节点将发送错误帧,错误帧的结构如下,其中错误标识分为主动错误标识和被动错误标识如图所示。

为防止自身由于某些原因导致无法正常接收的节点一直发送错误帧,干扰其他节点通信,CAN-bus规定了节点的3种状态及其行为如图所示。

(注:这些错误处理的机制是由硬件自主完成的这样做的目的就是只要CAN在收到数据肯定是正确的数据)。

Bus Off状态时,允许软件干预退出/保持Bus Off的时间,如果软件不进行干预,则节点会在总线出现128次11个连续隐性位后退出Bus Off(不要求是128个连续的11隐性位)。

错误帧种类

错误帧包括位错误、填充错误、CRC错误、格式错误、ACK错误,如下表:

image.png

位填充是发送节点发送了5个连续的极性相同的位就插入一个相反位;

需要注意的是,仲裁场和ACK场不进行位错误的识别,另外,输出被动错误标志(6个连续的隐性位)时检测出显性电平,不视为位错误(可能是因为其他节点在输出主动错误标志,总线上覆盖了)。

除了CRC错误,其他错误都是在检测到错误的下一位立即发送错误帧,CRC错误会在ACK界定符的下一位发送错误帧。

错误标志的叠加

由于错误帧不遵循位填充规则,所以在发出之后可能引起其他节点的错误,此时其他节点会再发出错误标志,所以在错误标志之后还有0~6位的错误标志叠加,错误叠加最多发生一次,且接收节点中必须至少一个处于主动错误状态才可能引发错误叠加:

image.png

位错误:位错误在发送节点发出的第六位错误标志时,必然在所有接收节点产生填充错误,当接收节点不全为被动错误状态时两者叠加产生的错误帧为6位错误标志+6位叠加错误标志+错误界定符;当接收节点全部都是被动错误状态时,则不会叠加错误标志,前6位错误标志跟随发送节点的主动/被动状态。

image.png

格式错误:格式错误必然在全部节点同时产生错误,产生错误帧为6位错误标志+错误界定符。

image.png

CRC错误:处于主动错误状态的接收节点在CRC错误发生后于ACK界定符后下一位发送的错误标志的第一位会在其他全部节点上引起格式错误(ACK界定符后必须全为隐性位),因此在总线上形成6位错误标志+1位叠加错误标志+错误界定符的错误报文。

image.png

ACK错误:ACK错误等效于总线上只有一个发送节点而没有接收节点,所以没有错误标志叠加;

位填充错误:位填充错误时,接收节点如果同时产生位填充错误,错误标志叠加状态与格式错误时相同;接收节点如果分别产生了位填充错误,错误标志叠加状态则与位错误状态相同。

节点错误计数器的加减规则

image.png

过载帧

当某个接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点;过载帧由过载标志和过载帧界定符组成如所示图。

由于存在多个节点同时过载且过载帧发送有时间差问题,可能出现过载标志叠加后超过6个位的现象如所示图。

帧间隔

被动错误节点抢占总线的优先级低于主动错误节点,这是为了保证主动错误节点优先发送,避免因为被动错误节点的硬件故障影响整个网络通信。

image.png

位时间、同步

CAN属于异步通信,没有时钟信号线,节点之间会使用相同的波特率进行通讯,CAN通过使用位同步的方式来对抗干扰、吸收误差,确保通讯正常。

位时间

image.png

一个电平位时间包括以下四个段:

  • SS段(SYNC SEG;同步段):若通讯节点检测到总线上信号的跳变沿被包含在SS段的范围内,则表示节点与总线的时序是同步的;(固定1个Tq);
  • PTS段(PROP SEG;传播段):这个时间段是用于补偿网络的物理延时时间,是总线上输入比较器延时和输出驱动器延时综合的两倍;(长度可编程:1~8个Tq);
  • PBS1段(PHASE SEG1;相位缓冲段1):用于补偿节点间的晶振误差,允许通过重同步对该段加长,在这个时间段末端进行总线状态的采样;(长度可编程:1~8Tq);
  • PBS2段(PHASE SEG2;相位缓冲段2):用于补偿节点间的晶振误差,允许通过重同步方式对该段缩短; (长度可编程:1~8Tq)
  • 位同步

    波特率只是约定了每个数据位的长度,数据同步还涉及相位的细节,这个时候就需要用到数据位内的SS、PTS、PBS1、PBS2等段了。

    同步规则

  • 一个位时间内只允许一种同步方式;
  • 任何一个“隐性”到“显性”的跳变都可以用于同步;
  • 硬同步发生在SOF,让所有接收节点调整各自当前位的同步段,使其位于发送的SOF位内。且只是当存在“帧起始信号”时起作用,无法确保后续一连串的位时序都是同步的;
  • 重新同步发生在一个帧的其他位场内,当跳变沿跳变沿落在了同步段之外;
  • 在SOF到仲裁场有多个节点同时发送的情况下,发送节点对跳变沿不进行重新同步(仲裁阶段)。
  • 硬同步

    发生在SOF位让所有接收节点调整各自当前位的同步段,调整宽度不限。且只是当存在帧起始信号才起作用,如果在一帧很长的数据内,节点信号与总线信号相位有偏移时,这种同步方式就无能为力了。

    当某节点检测到总线的帧起始信号不在节点内部时序的SS段范围,会判断它自己的内部时序与总线不同步,因而这个状态的采样点采集到的数据是不正确的,所以节点通过硬同步的方式重新调整,把自己的位时序中的SS段平移至总线出现下降沿的部分,从而获得同步,同步后采样点既可以采集到正确的数据了。

    image.png

    重新同步

    当跳变沿与同步段的误差小于SJW(reSynchronization Jump Width;重新同步补偿宽度),重新同步会通过延长PTS1段或者缩短PTS2段,来保证采样点位置的正确;如限定SJW=4 Tq时,单词同步调整的时候不能增加或者减少超过4Tq的时间长度,若有需要,控制器会通过多次小幅度调整来实现同步。

    image.png

    image.png

    物联沃分享整理
    物联沃-IOTWORD物联网 » 深入理解CAN报文的基本概念和原理

    发表评论