第37讲-CAN通讯实验2(协议层)

文章介绍了CAN总线的通讯逻辑,包括其异步通讯特性、位时序的分解(ss,pts,pbs1,pbs2段),波特率的确定方法,以及同步过程中的硬同步和重同步。此外,还详细阐述了CAN数据帧的结构,如RTR、IDE、SRR位,以及仲裁过程如何决定优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上个介绍了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的报文

补充:波特率与比特率

波特率是单位时间内传输了多少 「符号」

比特率是单位时间内传输了多少位(比特)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小C学Python青春版

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值