CAN通信协议
1. CAN协议简介
CAN(控制器局域网)总线是一种为可靠、高效、实时通信而生的串行通信协议。它最初由博世公司于1980年代为汽车开发,旨在减少车辆内复杂的线束,因此被誉为车辆的"神经系统"。
1991年CAN总线技术规范(Version2.0)制定并发布。这份技术规范分A/B两部分,A部分规定了CAN报文标准格式,B则给出了标准和扩展两种格式。
CAN总线协议是一种ISO 国际标准化的串行通信协议,有 ISO-11898 和 ISO-11519两个系列。
- ISO-11898 是高速CAN总线协议,速率
125 kbps~1Mbps,最高1Mps,总线长度较短,≤40m,属于闭环总线。
- ISO-11519则是一种低速CAN总线协议。速率
10~125 kbps,总线长度较长,可达1000m,属于开环总线。
两种都是双线通信。
其实还存在一种单线CAN标准,适用于33.3 kbps~83.3 kbps的通信设备,它就是SAE J2411。通常,需要在信号线与地之间接9kΩ电阻。它是一种车载标准,市面上用的最多的就是通用汽车GM-LAN。
并不是高速CAN降速之后就能变成低速CAN,这两种标准的电气特性就不一样。
不是坏了一根线的CAN就可以变成单线CAN,刚刚也说了单线CAN是一种标准,它有自己的电气特性。
不是所有的CAN transceiver IC都可以支持网络唤醒和睡眠功能。
CAN通信就像一个电话会议。你也可以理解为一个X讯会议或者X书会议。
这个会议会有这些情况:
- 一个人说,其他人听。
- 两个人要说,但是一个人让另一人先说,其他人听。
- 一个人要求另一个人回答。
- 有人掉线了。
- 都不说话。
- ...
两种速率下的CAN标准都遵循双线结构,也就是传输差分信号CAN_H以及CAN_L,这两条线通常以双绞线的形式缠绕。
每个节点都有CAN收发器(transceiver)和CAN控制器(controller)。集成到芯片里或者独立芯片都存在。
| 物理层 | ISO 11898 (High speed) | ISO 11519-2 (Low speed) |
|---|---|---|
| 通信速度*1** | 最高 1Mbps | 最高 125kbps |
| 总线最大长度*2** | 40m / 1Mbps | 1km / 40kbps |
| 连接单元数 | 最大 30 | 最大 20 |
| 总线拓扑*3** | 闭环总线 | 开环总线 |
| 电气特性 | 隐性 | 显性 |
| Min | Nom | |
| CAN_High (V) | 2.00 | 2.50 |
| CAN_Low (V) | 2.00 | 2.50 |
| 电位差 (H-L) (V) | -0.5 | 0 |
| 传输介质 | 双绞线(屏蔽/非屏蔽) | 双绞线(屏蔽/非屏蔽) |
| 电缆参数 | 阻抗 (Z): 120Ω (Min. 85Ω Max. 130Ω) 总线电阻率 (r): 70mΩ/m 总线延迟时间: 5ns/m | 阻抗 (Z): 120Ω (Min. 85Ω Max. 130Ω) 总线电阻率 (r): 90mΩ/m 总线延迟时间: 5ns/m |
| 终端电阻 | 120Ω (Min. 85Ω Max. 130Ω) | 2.20kΩ (Min. 2.09kΩ Max. 2.31kΩ) |
| 对地电容 | CAN_L与GND间静电容量 30pF/m | CAN_L与GND间静电容量 30pF/m CAN_H与GND间静电容量 30pF/m |
CAN的优势:
- 多主通信。总线上的任何节点都可以主动发起通信,无需中央控制器。
- 工业级的可靠性。使用差分信号(CAN_H和CAN_L双绞线)传输,抗电磁干扰能力极强,非常适合 noisy 的车载和工业环境。
- 高效的仲裁机制。当多个节点同时发送数据时,优先级最高的报文(标识符ID数值最小)能继续发送,而其他节点会自动退出发送并转为接收,整个过程不破坏数据也不浪费带宽。
2. CAN信号
2.1 CAN信号传输
CAN_L和CAN_H是CAN总线中的两根信号线,它们通过差分信号传输数据,是以电压差形式表现的,分为显性电平(dominant)和隐性电平(recessive)。显性电平规定为逻辑0,隐性电平规定为逻辑1。
-
高速CAN中,电压差为0V时表示逻辑1(隐性电平),电压差为2V时表示逻辑0(显性电平)。
-
低速CAN中,电压差为-1.5V时表示逻辑1(隐性电平),电压差为3V时表示逻辑0(显性电平)。
我们就这张图讲一讲,首先当CAN_H和CAN_L的电压均为2.5V时,电压差为0,规定信号为隐性电平;当CAN_H的电压为3.5V,而CAN_L的电压为1.5V时,电压差为2V,规定信号为显性电平。
电压差满足定义的一定范围,就可以认为是显性电平或者隐性电平。
在网上找了一张图,读者可以看一下CAN的真实波形。
我们来了解一下发送过程。控制器需要把CPU传来的信号转换为逻辑电平,收发器接收逻辑电平后,再转为差分电平输出到总线。
在接收过程中,接收器需要把总线上的差分信号转换为逻辑电平,控制器接收逻辑电平后,再转为CPU信号。
可以看出,差分电平是由CAN收发器实现的。
不妨看看CAN收发器的内部结构。
Details
-
接收器 (Receiver)
位置:连接在 CANH、CANL 和 RXD 之间。
作用:差分信号接收器。
原理:实时监测 CANH 和 CANL 上的电压差。
如果差压在 0.9V 到 5V 之间(显性),比较器翻转,RXD 输出低电平(0)。
如果差压在 -1V 到 0.5V 之间(隐性),RXD 输出高电平(1)。
抗干扰:因为读取的是两者的差值,所以外部的电磁干扰(同时影响两根线)会被抵消掉。
-
驱动器 (Driver)
位置:连接在 TXD 和 CANH/CANL 之间。
作用:将 TXD 的逻辑信号转换成差分电压。
原理:
隐性 (TXD = 1):驱动器的输出级被关闭(或处于高阻态),两个 25 kΩ 的内部电阻将 CANH 和 CANL 都拉到 0.5 * VCC(约 2.5V)。此时 CANH 和 CANL 电压几乎相等,差分电压为 0V。
显性 (TXD = 0):驱动器内部的晶体管打开,将 CANH 拉到约 3.5V(或更高),CANL 拉到约 1.5V(或更低),形成约 2V 的差分电压。
-
显性超时定时器 (Dominant Time-out Timer)
位置:串联在 TXD 路径上。
作用:这是TJA1050的一个保护机制。
原理:如果由于硬件或软件故障,TXD 引脚长时间保持低电平(显性状态),总线会一直处于显性状态,导致通信瘫痪(占用总线)。如果这个低电平持续时间超过了规定的阈值(通常约 1ms 到 2ms),定时器会强制禁用驱动器,释放总线,让它回到隐性状态。这可以防止某个故障节点卡死整个网络。
-
斜 率控制 (S)
位置:引脚8旁边的 S(实际上标准TJA1050的引脚8是 S,用于选择高速模式或静音模式)。
作用:控制输出级的上升和下降斜率。在低速率或对电磁兼容性要求高的场合,可以降低斜率来减少EMI(电磁干扰)。
-
参考电压 (Reference Voltage) 和 偏置电阻 (25kΩ)
位置:两个 25 kΩ 精密电阻分压出 0.5 * VCC。
作用:
为接收器和驱动器提供稳定的中点参考电压。
在隐性状态时,通过这两个电阻将 CAN 总线稳定在 2.5V 的共模电压上,确保总线空闲时处于确定状态,并准备被拉低或拉高。
它的工作流程:
2.2 CAN报文解析
首先我们要了解到,CAN的一大特点是多主通信。实际上,多主通信的实现依赖于非破坏性逐位仲裁(Non-Destructive Bitwise Arbitration)技术和CAN收发器的特殊电气特性。
只要总线处于空闲状态,那么任意节点都可以往总线上发消息。
但是总线只有一条,如何做到可靠的传输?
最先发送消息的那个节点获得总线的发送权,而优先级越高的节点,就越快获得总线的发送权。
比如,节点1发送消息,节点2和节点3没有发送消息,那么节点1就获得总线的发送权。节点1和节点4同时要发送消息,此时如果节点4优先级高于节点1,那么节点4就获得总线的发送权。
如何判断优先级大小?
2.3 非破坏性仲裁机制
这是一种既不会造成已发送数据的延迟,也不会破坏已经发送的数据的仲裁机制,依赖线与机制、载波监听以及与帧结构有关的仲裁域。
“线与”逻辑:显性位(逻辑0)可以覆盖隐性位(逻辑1)。任何节点只要输出显性位,总线就呈现显性;只有当所有节点都输出隐性位时,总线才呈现隐性。这一特性是由收发器的开漏/推挽输出结构决定的。
也就是说,只有当所有输出都是高电平(逻辑1)时,总线上才会呈现高电平;只要有一个输出是低电平(逻辑0),总线就被拉低为低电平。
CAN的线与与I²C的线与在原理上类似,但有两点重要区别:
-
I²C:使用单线(SDA、SCL)开漏输出,靠外部上拉电阻实现线与,速率较低。
-
CAN:使用差分双线(CAN_H、CAN_L),隐性时内部偏置电阻使两线等电位,显性时强力驱动差分电压,既能实现线与,又能提供高抗干扰能力和高速传输。
每个CAN节点在发送每一位的同时,都会通过接收器实时读取总线上的实际电平。发送器将发送的位与读取的位进行比较:
-
如果两者一致,节点继续发送下一位。
-
如果节点发送的是隐性位(1),但读取到的是显性位(0),则说明有其他节点发送了显性位,即存在更高优先级的报文。该节点立即失去仲裁,停止发送,转为接收模式,同时不再干扰总线。
-
如果节点发送的是显性位(0),即使读取到显性位(0),也可能有其他节点也发送显性位,此时所有发送显性位的节点继续参与下一位的仲裁。
仲裁只发生在帧起始(SOF)和标识符(ID)(以及扩展帧中的SRR、IDE位,远程帧的RTR位)期间。一旦某节点赢得仲裁并开始发送控制段和数据段,其他节点就不再尝试竞争,直到下一次总线空闲。
仲裁例子:两个节点同时发送
假设一个CAN网络中,节点A和节点B同时开始发送数据帧,它们的11位标准标识符(ID)分别为:
-
节点A ID:0x7A0(二进制:111 1010 0000)
-
节点B ID:0x7E8(二进制:111 1110 1000)
按照CAN协议,ID值越小,优先级越高。这里节点A的ID(0x7A0)小于节点B的ID(0x7E8),因此节点A应该赢得仲裁。让我们逐位分析仲裁过程。
| 位序 | 节点A发送位 | 节点B发送位 | 总线实际状态 | 节点A读回 | 节点B读回 | 仲裁结果 |
|---|---|---|---|---|---|---|
| SOF | 0 (显性) | 0 (显性) | 0 | 一致 | 一致 | 继续 |
| ID10 | 1 (隐性) | 1 (隐性) | 1 | 一致 | 一致 | 继续 |
| ID9 | 1 (隐性) | 1 (隐性) | 1 | 一致 | 一致 | 继续 |
| ID8 | 1 (隐性) | 1 (隐性) | 1 | 一致 | 一致 | 继续 |
| ID7 | 1 (隐性) | 1 (隐性) | 1 | 一致 | 一致 | 继续 |
| ID6 | 1 (隐性) | 1 (隐性) | 1 | 一致 | 一致 | 继续 |
| ID5 | 0 (显性) | 1 (隐性) | 0 (显性) | 一致 (发送0读回0) | 发送1读回0 → 失去仲裁 | 节点B退出,节点A继续 |
- 从SOF到ID6,所有位相同,总线状态一致,两节点继续。
- 在ID5位,节点A发送显性0,节点B发送隐性1。总线被节点A拉为显性0。节点B发送1却读到0,判定自己失去仲裁,立即停止发送并转为接收。节点A发送0读到0,继续发送剩余位。
节点A赢得总线后,继续发送控制段、数据段、CRC、ACK等,完整地发送其数据帧。节点B在检测到总线空闲后(节点A发送结束),会重新尝试发送。
因为ID越小,其二进制表示中在高位出现0的位置越靠前。在逐位仲裁中,第一个输出0的节点会赢得总线。所以:
ID = 0x100(二进制 0001 0000 0000) vs ID = 0x200(0010 0000 0000)
比较最高位(ID10):第一个是0,第二个是1 → 第一个获胜。
这正好符合直觉:数字越小,优先级越高。
仲裁过程中,赢家并没有从头开始重新发送,而是:
从帧起始(SOF)到仲裁场的最后一位相同位(ID6),总线信号由两个节点共同塑造(数据一致所以无冲突);从出现差异的第一位(ID5)开始,总线信号完全由赢家(节点A)塑造。整个帧是“共同开头 + 赢家独续”的连续数据流,中间没有任何断裂或重发。
扩展帧与远程帧的仲裁
扩展帧中的额外位: 对于29位扩展ID的帧,仲裁过程还包括SRR位和IDE位。扩展帧的SRR位在标准帧的RTR位位置,为隐性;而标 准帧的RTR位在数据帧中为显性。因此,如果同时发送标准帧和扩展帧且ID基相同,标准帧会因RTR显性而赢得仲裁。
远程帧的RTR位: 远程帧的RTR位为隐性,数据帧的RTR位为显性。因此,具有相同ID的数据帧和远程帧同时发送时,数据帧总是赢得仲裁。这个设计使得数据帧总是比远程帧优先。
系统的“柔软性”
这里要说说CAN通信系统的“柔软性”———它既能在物理层容忍一定的故障,又能在应用层灵活地扩展节点。
首先,CAN总线上的节点是即插即用的。任何节点在任何时刻都可以尝试发送数据,不需要主机轮询。这使得新节点可以随时加入网络,并主动上报信息。节点可以设置为只接收感兴趣的ID。即使总线上有很多新节点加入发送新ID的数据,原本不关心这些ID的节点完全不受影响,它们的硬件过滤器会直接忽略这些数据,CPU负载不会增加。如果要在总线上增加一个新功能(例如增加一个电池管理系统),只需要确认新节点的ID不与现有节点冲突即可,无需修改其他节点的硬件。
总线会根据ID的大小自动分配使用权。如果系统中突然出现紧急事件(如安全气囊触发),对应的节点可以设置很小的ID(高优先级)。它不需要等当前低速的报文发送完,只需要等当前帧结束(或者直接在下一帧仲裁中获胜)。这种特性让系统在面对突发事件时表现出极高的反应柔软性。
由于错误计数器和错误帧的存在,CAN系统不会因为一个节点坏了就导致全网瘫痪,它有一套自我疗愈的机制。
通过发送错误计数器(TEC)和接收错误计数 器(REC),CAN控制器能判断自身是否经常出错。
-
当计数器值在127以下时,节点是“主动错误”状态,可以正常通信,出错时发主动错误帧(显性)。
-
当计数器值在128到255之间时,节点进入“被动错误”状态。它虽然还能收发数据,但当它检测到错误时,只能发送隐性的错误标志(不会干扰总线)。这就像一个人生病了,自己悄悄咳嗽,但不影响大家开会。
-
当计数器值超过255时,节点自动进入“总线关闭”状态。它会把自己从总线上完全隔离,不再进行任何通信,既不发数据也不收数据。这防止了一个彻底坏掉的节点持续占用总线,发出大量垃圾数据。
2.4 CAN总线帧结构
| 帧类型 | 作用 | 关键特征 | 结构/长度概要 |
|---|---|---|---|
| 数据帧 | 从发送节点向其他节点传输数据 | 携带0~8字节数据;具有标识符决定优先级;分为标准帧(11位ID)和扩展帧(29位ID) | SOF + 仲裁场 + 控制场 + 数据场 + CRC场 + ACK场 + EOF (共44~108位+填充) |
| 远程帧(遥控帧) | 请求其他节点发送具有相同ID的数据帧 | 无数据场;RTR位为隐性(1),因此优先级低于相同ID的数据帧;标识符指定所需数据 | SOF + 仲裁场 + 控制场 + CRC场 + ACK场 + EOF (无数据场,长度固定) |
| 错误帧 | 检测到总线错误的节点主动通知所有节点发生错误 | 由错误标志(6个相同位,主动错误为显性,被动错误为隐性 )和错误界定符(8个隐性)组成 | 错误标志(6位) + 错误界定符(8位) (总14位) |
| 过载帧 | 接收节点未准备好接收下一帧时请求延迟 | 结构与错误帧类似,但由过载标志(6个显性)和过载界定符(8个隐性)组成 | 过载标志(6位) + 过载界定符(8位) (总14位) |
| 帧间空间 | 分隔数据帧/远程帧与后续帧,使总线恢复空闲并允许节点执行内部处理 | 由间歇场(3个隐性位)和总线空闲(任意长隐性)组成;错误帧和过载帧前无帧间空间 | 间歇场(3位隐性) + 总线空闲(任意长度) |
2.5 CAN同步机制
2.5.1 位速率(比特率)
位速率也称为比特率,表示单位时间内总线上传输的信息量,即每秒能够传输的二进制位的数量,,单位是bps(比特每秒)。位速率越高,通信速度越快。
位速率和波特率是两个不同的概念,位速率是单位时间内总线上传输的二进制位的数量,波特率是单位时间内总线上传输的符号的数量,符号是二进制位的一种表示方式,可以是1个或多个二进制位。
什么时候位速率会等于波特率?当一个符号只包含两种可能,即一个事件两种可能,那么 此时1baud=1bit。
如果一个事件有2+种可能,那么此时1baud>1bit。比如一个事件有4种可能,一个符号中包含四个电平,那么此时1baud=2bit。
2.5.2 位时序
一帧数据由多个位组成,每个位由一个时钟周期组成,时钟周期由位速率决定。如何使得接收方能够准确接收数据?这就需要位时序。
实际上,数据的接收是逐位进行的。
将一个位分为4段时间,分别是:同步段、传播段、相位缓冲段1、相位缓冲段2。
每个段又由若干个Tq构成,这称为位时序。tq是Time Quantum的缩写,表示时间量子,即最小的时间单位。
位时序可以被任意设定。通过设定位时序,可以使得多个单元同时采样。采样点也是可以任意设定的。
采样点是读取总线电平,并将读到的电平作为位值的点。一般设置在PBS1段结束点。
-
同步段(SS): 多个连接在总线上的单元通过此段实现时序调整,同步进行接收和发送的工作。由隐性电平到显性电平的边沿或由显性电平到隐性电平边沿最好出现在此段中。
-
传播时间段(PTS): 用于吸收网络上的物理延迟。所谓网络物理延迟指发送单元的输出延迟、总线上信号的传播延迟、接收单元的输入延迟 。这个段的时间为以上各延迟时间的和的两倍。
-
相位缓冲段 1(PBS1): 当信号边沿不能被包含于 SS 段中时,可在此段进行补偿。
-
相位缓冲段 2(PBS2): 由于各单元以各自独立的时钟工作,细微的时钟误差会累积起来,PBS 段可用于吸收此误差。通过对相位缓冲段加减 SJW 吸收误差。SJW 加大后允许误差加大,但通信速度下降。
-
再同步补偿宽度(SJW): 因时钟频率偏差、传送延迟等,各单元有同步误差。SJW 为补偿此误差的最大值。
CAN各个位都没有附加同步信息,是靠位时序同步的(NRZ)。接收单元以总线上电平的变化进行同步,进行接收。发送单元和接收单元存在的时钟频率误差及传输路径上的(电缆/驱动器等)相位延迟会引起同步偏差,因此接收单元通过硬件同步或者再同步的方法调整时序进行接收。
2.5.3 位填充
这里要补充一下位填充的概念。
位填充是指在 CAN 帧的某些字段中,当发送器连续发送 5 个相同极性(全 0 或全 1)的位时,自动在 第 5 位之后插入一个相反极性的位。接收器在接收到时会自动将其删除。
仅在帧的特定位置有效(从 SOF 到 CRC 段,不包括 CRC 界定符、ACK 段和帧结束)。
如果数据中包含连续多个相同电平,长时间没有跳变沿,接收器的时钟漂移会导致采样点偏移,造成位错误。位填充可以解决这个问题。通过强制插入相反电平,这 样总线上最多只有 5 个相同位,从而提供足够的边沿用于同步。
如果接收器检测到 连续 6 个相同位(即违反填充规则),则认为发生了填充错误,会立即发出错误帧。状态寄存器的TEC计数器会存储填充错误。
2.5.4 位同步(硬同步)
我们以一次检测为例。空闲状态下,接收节点检测出帧起始(SOF位)时,会调整当前位的同步段,调整宽度不限。假设这时检测的是SOF位。
节点A的下降沿在SS段,节点B接收发现当前位的SS段和发送的SS段不同步,于是立即重置位时间计数器,强制将自己当前位的SS段拉到与SOF位的SS段同步。
2.5.5 位采样
在 CAN 协议中,位采样 是指接收节点在一个位时间内的某个时刻对总线电平进行读取,以确定该位的逻辑值(显性 0 或隐性 1)。采样点(Sampling Point)的选择直接影响通信的可靠性和抗干扰能力。
采样点通常位于相位缓冲段 1(PBS1) 的末尾和 相位缓冲段 2(PBS2) 的开始处。
推荐采样点范围:75%~85% 的位时间。
太靠前(<70%):可能无法容忍振荡器误差和传输延迟。
太靠后(>90%):可能没有足够时间完成 PBS2 的处理,导致下一个位采样偏差。
CAN 控制器通常支持两种采样模式:单次采样 和 三次采样。STM32中也是支持的,推荐选用三次采样。
-
单次采样:在采样点读取一次总线电平,确定该位的逻辑值。优点:快速,对边沿抖动不敏感,适合高波特率。缺点:抗瞬时干扰能力较弱(若采样瞬间有尖峰,可能导致误判)。
-
三次采样:在一个位时间中,连续采样三次(通常以采样点为中心,间隔一个 tq 或一定时间 ),然后通过 多数表决(3 取 2)确定最终电平。优点:给总线去毛刺,增强抗噪声能力,适合低波特率或干扰严重的环境。缺点:会轻微增加延迟,且对边沿位置更敏感(需要边沿稳定在采样窗口内)。
位时序寄存器 CAN_BTR:
BRP:预分频器(决定 tq 长度)。
TS1:时间段 1(包含 PTS + PBS1,值 = 实际 tq 数 - 1)。
TS2:时间段 2(PBS2,值 = 实际 tq 数 - 1)。
SJW:再同步跳转宽度。
采样点位置计算公式:
其中分子分母均为 tq 数。例如,,,则采样点 = 。
接收器通过 硬同步(SOF 边沿)和 重同步(帧内边沿)调整采样点位置。每次重同步会根据边沿相位误差,在 SJW 范围内增减 PBS1 或 PBS2 的长度。
2.5.6 再同步(重同步)
再同步(Resynchronization)是 CAN 协议中用于在帧传输过程中保持节点与总线位流同步的机制。它不同于硬同步(仅在 SOF 边沿发生),而是在帧内的每个边沿都可能触发,通过微调位时间计数器来补偿时钟漂移和传播延迟,确保采样点始终位于正确位置。
CAN 总线没有独立的时钟线,每个节点使用自己的晶振工作,晶振频率存在微小误差(如 ±0.3%)。同时,信号在总线上传播也有延迟。如果不做再同步,随着时间累积,节点的位边界会逐渐偏离总线实际位流,导致采样点错位,引发位错误。
再同步的作用就是在帧内检测到边沿时,根据该边沿相对于预期位置的偏移量,动态调整相位缓冲段的长度,使采样点重新对齐。
再同步由 总线上的隐性到显性边沿 或 显性到隐性边沿 触发。但并不是每个边沿都会引起调整,而是根据边沿与预期位置的关系决定。
CAN 协议定义每个位时间内的 同步段(SS) 是理想的边沿位置。如果检测到的边沿出现在 SS 之后(即迟于预期),说明节点时钟较慢,需要 缩短 PBS1 或 延长 PBS2;如果边沿出现在 SS 之前(即早于预期),说明节点时钟较快,需要 缩短 PBS2 或 延长 PBS1。具体调整量受 再同步跳转宽度(SJW) 限制。
SJW(再同步跳转宽度)是一个可配置参数(通常 1~4 tq)。它决定了节点容忍时钟漂移和传播延迟的能力:
-
SJW 越大,节点能补偿的误差越大,对振荡器精度要求越低,但会牺牲抗噪声能力(因为允许的调整幅度大,可能使采样点偏离最优位置)。
-
SJW 越小,节点同步更精确,但对时钟精度要求更高。
配置SJW需满足以下两个条件:
-
SJW必须小于PBS1和PBS2的最小值;
-
SJW最大值不能超过4。
再同步分为两种情况:
- PSB1段加长
这种情况是接收节点的SS段在发送节点的SS段前产生,也就是发晚了,收早了。
这个时候需要加长PBS1段,使接收节点的SS段和发送节点的SS段对齐。接收节点加长PBS1段2个tq。
此时即可同步。
- PBS2段缩短
这种情况是接收节点的SS段在发送节点的SS段后产生,也就是发早了,收晚了。
这个时候需要缩短PBS2段,使接收节点的SS段和发送节点的SS段对齐。接收节点缩短PBS2段2个tq。
此时即可同步。
2.5.7 位时间计算设置
假设需要设置波特率500Kbps,时钟频率170MHz。
时钟频率转换为时间表示:,NBT=16(1个位16个tq)。
波特率换算成时间表示:。传输一个位的时间是2000ns.16个tq就等于2000ns,即tq=125ns。
又因为:
DIV8:时钟分频因子为 8
STM32F4xx 系列中,CAN1 和 CAN2 的时钟源可以选择 PCLK1 直接 或 PCLK1 / 8,这个选择通过 RCC 时钟配置寄存器(如 RCC_DCKCFGR)的某一位控制,该位通常命名为 CAN1SEL 或类似。当这一位设置为 1 时,CAN 的输入时钟就是 PCLK1 / 8,即 DIV8 生效。
因为BRP只能为整数,所以取DIV8=0,BRP=20。
假设我们采样点取在50%处: