上个介绍了CAN总线的物理层标准,也就是电气特性。现在介绍协议层也就是CAN通讯的通讯逻辑

CAN是异步通讯,是没有时钟信号信号线的。连接在同一个总线网络中每个节点会使用同一个波特率,就像串口的异步通讯那样。特别的CAN会使用未同步的模式来抗干扰。吸收误差。未同步是因为在网络传输时它是有延迟的,发送方与接收放的时钟也不可能完全相同。这种情况下如果接收端完全按照自己的节拍来接收这个比特流,那么无法保证正确性。为了解决这个问题,还是需要考虑一下未同步的问题,让接受方以正确的节拍来采集数据。有时候还会进行码型的变换,比如说归零码等。(不是我们要讲的重点)
位时序分解

为了实现位同步看协议它是把每个数据位时序分解成了ss段,pts段,pbs1段,pbs2段,这四段长度加起来就是CAN数据位的长度,那么分解为最小的时间单位为Tq。每款芯片CAN通讯的速率是不一样的,就可以最大速率运行。一个完整的位是由8~到25个tq组成
ss段:同步段。如果通讯节点检测到总线上,信号跳变沿被包含在ss段的范围之内,我们就表示这个节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平,就可以被确定为该位的电平ss段的大小是固定的。
pts段:传播时间段,这个时间段是用来做一个补偿的,补偿的是网络的物理延迟时间,是总线上输入比较延时和输出驱动器的延时总和的两倍,它的大小是1~8tq
bps1段:相位缓冲段。主要是用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。它的初始大小是1~8tq,后面可以加长的。
bps2段:另一个相位冲段。,主要是用来补偿边沿阶段误差的,它的时间长度在重新同步的时候是可以缩短的,与bps1相反。它的初始化大小是2~8tq
通讯的波特率

总线上各个通讯决定只要约定好一个tq的时间长度,以及每一个位占据多少个tq。就可以确定CAN通讯的波特速率。
举例

假设一个tq是1us(1微秒),那么这个数据位是19tq组成,传输一位就需要19us.那么每秒就可以传输数据位个数就是十的六次方除以19。这个每秒可传输的数据位的个数是通讯中的波特率。
同步过程

波特率只是约定了每个数据位的长度,数据长度它还涉及到一个相位的细节。CAN总线的数据同步分为硬同步和重同步,其中硬同步只是存在真起始信号时会起作用,它无法保证后续的一连串的位时序都是同步的。而重同步方式可以解决这个问题。
硬同步:如果某一个CAN节点通过总线发出数据的话,它会发送一个表示通讯起始的信号,那么这个通讯起始的信号
真起始信号是由高到低的一个下降沿,而挂载到CAN总线上的通讯节点在不发送数据时会时刻检测总线上的型号
重新同步
分 相位超前和相位滞后

硬同步是当存在真起始信号才起作用,如果在一帧很长的数据内节点信号与总线信号相位都有偏移,那么这种同步方式是硬同步没法纠正的。这个时候就要用重新同步方式。
重新同步方式利用普通数据位高至低的跳变沿来同步,真起始信号就是一种特别的跳变沿,重新同步与硬同步相似的地方是,都用ss段来检测。同步的目的是使节点内的ss段把跳变沿也包含进来。重新同步是以总线跳边缘与ss相对位置来区分超前和滞后


打包后我们称之为报文
CAN协议中的差分信号

在原始数据段上,会加一些传输起始的标签,有个识别标签(可以理解为片选,实际上是一个ID号),还有控制标签,在数据的尾端加上crc校验,硬打标签,传输结束标签,把这些特定的格式打包好,就可以用一个通道来表示各种信号了。各种各样的标签其实相当于SPI中各种通道上的信号。当整个数据包被传输到其他设备的时候,只要这些设备按格式去解读就能还原出原始代码。这样的报文就称为CAN的数据帧。为了更有效的控制通讯,CAN一共规定了5中类型的数据帧。他们的类型与用途就是上图的表
数据帧的格式(重点)增加一个节点增加一个ID

RTR:远程传输请求位,区分是数据帧0还是遥控帧1
IDE:是标识符扩展符,区分是标准格式0还是扩展格式1(标准扩展就是ID的位数不一样)
SRR:扩展模式有,来代替标准模式的RTR位。由于扩展中SRR位隐形位,RTR在数字中为显性位。所以当两个ID相同的标准格式报文与扩展模式报文,标准格式优先级会高一些
控制端:r1与r2是保留位,默认是显性电平,最主要的是dlc段是数据长度,它有4个位组成。用来表示本报文中数据段还有多少字节,数据段是数据帧的核心,它就是起点实践要发射的原始数据,有0~8个字节组成
CRC段:校验码,一旦接收到节点算出了CRC它跟接收到CRC不同,就会向发送的节点反馈一个出差信息,利用错误帧要求发送节点重新发送一下上一次没发成功的。CRC计算有控制器硬件完成。处理的结果是软件来控制最大的重复数的
界定符:隐形位,作用是把CRC校验与后面的ACK进行一个间隔
ACK:包含一个ACN卡槽和ACK界定符。比较像I2C总线了。在ACK槽位中发送的是隐形位,接收节点发送的显性位来表示应答。ac槽与帧结束之间有ACk界定符,可间隔看。
EOF段:帧结束。由发送节点连续发送7个隐形位来表示结束。
其他帧与数据帧类似,不过没有数据字段
根据仲裁段来决定优先级(优先级高的发,其他接收)
仲裁过程

它可以控制增加只是接收某些ID的报文
补充:波特率与比特率
波特率是单位时间内传输了多少 「符号」
比特率是单位时间内传输了多少位(比特)