STM32 CAN位同步、错误处理
一、接收方数据采样
- CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长
- 发送方以约定的位时长每隔固定时间输出一个数据位
- 接收方以约定的位时长每隔固定时间采样总线的电平,输入一个数据位
- 理想状态下,接收方能依次采样到发送方发出的每个数据位,且采样点位于数据位中心附近
二、位时序
为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分,分为同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每个段又由若干个最小时间单位(Tq)构成
若是数据跳变沿正好出现在SS段(同步段),那就说明当前设备与波形达成同步。
PTS(传播时间段):用于吸收网络上的物理延时(发送单元的输出延时,总线上信号的传播延迟、接收单元的输入延迟)
PBS1、PBS2(相位缓冲段):确定采样点的位置,采样点会在这两个之间,通过调节这两个的长度(还有PTS),就可以调节采样点的位置。
三、硬同步
- 每个设备都有一个位时序计时周期,当某个设备(发送方)率先发送报文,其他所有设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方的位时序计时周期保持同步
- 硬同步只在帧的第一个下降沿(SOF下降沿)有效
- 经过硬同步后,若发送方和接收方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近
四、再同步
- 若发送方或接收方的时钟有误差,随着误差积累,数据位边沿逐渐偏离SS段,则此时接收方根据再同步补偿宽度值(SJW)通过加长PBS1段,或缩短PBS2段,以调整同步
- 再同步可以发生在第一个下降沿之后的每个数据位跳变边沿
注:SJW = 1~4Tq,SJW是补偿的最大限值,例如有2TQ的延迟,此时给SJW为3,则只会补偿给时序段两个,而不是SJW的3个。但是有3Tq的延迟,此时SJW为2,则只补偿2Tq
五、波特率的计算
六、资源分配原则
- CAN总线只有一对差分信号线,同一时间只能有一个设备操作总线发送数据,若多个设备同时有发送需求,该如何分配总线资源?
- 解决问题的思路:制定资源分配规则,依次满足多个设备的发送需求,确保同一时间只有一个设备操作总线
(1)资源分配规则1 - 先占先得
(2)资源分配规则2 - 非破坏性仲裁
注:回读机制,就是为了检测自己是否与 仲裁段的ID和RTR相同,仲裁失利后就等到下一次再发送。
(3)数据帧和遥控帧的优先级
当A设备想使用遥控帧请求C设备的数据,同时B设备想用数据帧对C传输数据时。
数据帧和遥控帧ID号一样时,数据帧的优先级高于遥控帧
(4)标准格式和扩展格式的优先级
标准格式11位ID号和扩展格式29位ID号的高11位一样时,标准格式的优先级高于扩展格式(SRR必须始终为1,以保证此要求)
七、错误处理
错误共有5种: 位错误、填充错误、CRC错误、格式错误、应答错误
位错误:六-(2)讲到的回读机制,但是在仲裁段的回读错误视为仲裁失利,而不是一个错误
(一)错误状态
在此之前先复习一下先前的 五-(三) 错误帧:CAN简介及帧格式
- 主动错误状态的设备正常参与通信并在检测到错误时发出主动错误帧,可以破坏别设备的数据,权力较大,若是频繁发出错误,则会转到下面的被动错误状态。主动错误状态是设备的初始状态,是比较可靠的状态
- 被动错误状态的设备正常参与通信但检测到错误时只能发出被动错误帧,不可以破坏别设备的通信,若是还是频繁,则转到下面总线关闭状态
- 总线关闭状态的设备不能参与通信
- 每个设备内部管理一个TEC和REC,根据TEC和REC的值确定自己处于上面三个当中的哪个状态
TEC:发送错误计数器,每发现一个错误,则增加一次,正常发送一次,则减小一次
REC:接收错误计数器,每接收一个错误,则增加一次,正常接收一次,则减小一次