CAN_studynote - aman396271/Flagchip_Study GitHub Wiki
Welcome to the Flagchip_Study wiki!
1 CAN基础学习
1.1 架构
1.1.1 高速CAN
ISO 11898-2,即高速CAN,在总线两端均接有120Ω特性阻抗。高速CAN在传输显性(0)信号时,会将CAN_H抬高至5V,将CAN_L拉低至0V(一般情况下,CAN_H≈3.5V,CAN_L≈1.5V,差分电压2V);在传输隐形(1)信号时,并不会驱动CAN_H或CAN_L,差分电压为0。显性信号(0)的共模电压需要在1.5V到3.5V之间。隐性信号(1)的共模电压需要在+/-12V。
1.1.2 低速CAN
ISO 11898-3 低速CAN/容错CAN,每个节点都有终端电阻,全局终端电阻不应低于100Ω。
低速/容错CAN信号在传输显性信号(0)时,驱动CANH端抬向5V,将CANL端降向0V。在传输隐性信号(1)时并不驱动CAN 总线的任何一端。在电源电压Vcc为5V时,显性信号差分电压需要大于2.3V,隐性信号的差分电压需要小于0.6V。CAN总线两端未被驱动时,终端电阻使CANL端回归到RTH电压(当电源电压Vcc为5V时,RTH电压至少为Vcc-0.3V=4.7V),同时使CANH端回归至RTL电压(RTL电压最大为0.3V)。两根线需要能够承受-27V至40V的电压而不被损坏。(from wikipedia)
1.1.3 特性
由于显性(0)信号是需要主动驱动的,而隐性(1)信号是由终端电阻网络自行回到2.5V平衡点(依赖RC回路的充放电),故隐性到显性要比显性到隐性更快,CAN的波形上升和下降边沿陡峭程度是不同的。
1.2 数据传输
1.2.1 CAN的仲裁法
显性是逻辑0(由发信器积极驱动通过电压)而隐性是逻辑1(被动地通过电阻返回到一个电压)。 闲置状态代表隐性的水平,也就是逻辑1。如果一个节点发送了显性位而另一个节点发送一个隐性位,那么总线上就有冲突,最终结果是显性位“获胜”。 逻辑0或1的确切电压取决于所使用的物理层,但CAN的基本原则要求每个节点监听CAN网络上的数据,包括发信节点本身。如果所有节点都在同时发送逻辑1,所有节点都会看到这个逻辑1信号,包括发信节点个接受节点。如果所有发信节点同时发送逻辑0信号,那么所有节点都会看到这个逻辑0信号。当一个或多个发信节点发送逻辑0信号,但是有一个或多个发信节点发送了逻辑1信号,所有节点包括发送逻辑1信号的节点也会看到逻辑0信号。当一个节点发送逻辑1信号但是看到一个逻辑0信号,它会意识到线上有争执并退出发射。通过这个过程,任何传送逻辑1的节点在其他节点传送逻辑0时退出或者失去仲裁。失去仲裁的节点会在稍后把信息重新加入队列,CAN帧的比特流保持没有故障继续进行直到只剩下一个发信节点。这意味着传送第一个逻辑1的节点丧失仲裁。由于所有节点在开始CAN帧时传输11位(或CAN 2.0B中是29位)标识符,拥有最低标识符的发信节点在起始处拥有更多0。那个节点赢得仲裁并且拥有最高优先级。(wikipedia)
flowchart TD
A[仲裁开始]-->B[根据标识符判断优先级]
B-->C[第0位标识符]
C-->|显性0|D[继续仲裁]
C-->|隐性1|E[退出发射]
E-->F[把信息重新加入队列]
D-->|重复仲裁过程...|G[第N位标识符]
G-->|显性0|H[赢得仲裁]
G-->|隐性1|I[退出发射]
I-->J[把信息重新加入队列]
H-->K[发送]
1.2.2 ID分配
ID在单条CAN总线上必须是唯一的
1.2.3 节点同步
CAN网络上的所有节点必须运行在相同的标称比特率下,但噪音、相移、振荡频率容差和振荡频率漂移导致实际的比特率可能与标称比特率不同。由于没有使用一个单独的时钟信号,需要一个同步节点方法。同步在仲裁机制中十分重要,因为仲裁中的节点需要能够同时看到它们传输数据的数据和其他节点的传输数据。 同步在确保节点间震荡时间不同时不发生错误上十分重要。总线闲置一段时间后,在第一个隐性信号向显性信号转换时(起始位) 进行硬同步。再次同步发生在传输帧期间的每次从隐性向显性转换时。(wikipedia)
CAN在隐性转显性时才进行同步,比如一个是 0xFF (1111 1111),一个是 0xFE (1111 1110),只有最后一位不同;此时才出现一个显性位用于仲裁。如果前面都没有同步边沿,时钟会不会因为漂移而导致采样点偏移,最终导致优先级误判?
**
不会,CAN通信有几个机制来应对这种极端情况的产生。
1.位填充
传输器会在相同极性的五个连续位之后插入一个相反的极性的位,以确保足够的转换来保持同步。这种做法被称为位填充,并且对于CAN这样的[不归零](NRZ)编码是必要的。填充的数据帧由接收器去掉填充。
除了CRC定界符,ACK字段和结束位这样固定字长的区域之外,帧中其他所有字段都会被填充,这些字段是固定大小且未被填充。在使用位填充的字段中,具有相同极性的六个连续位(111111或000000)被视为错误。
2.动态校准——比特时间
先引入一个概念Tq(Time Quantun,时间量子),Tq是CAN控制器内部最小的时钟单位,其时间由CAN的时钟频率及预分频值决定(CAN_Clk=16MHz,Prescaler=4,1Tq=4/16M=0.25us)
每一个时钟周期都由若干个Tq组成,划分为四个阶段:SYNC_SEG(同步段,固定长度 1 Tq,检测边沿对齐使用),PROP_SEG(传播段,补偿物理延迟(线缆、电路等)),PHASE_SEG1(相位段1,采样点之前,用来调节采样点提前),PHASE_SEG2(相位段2,采样点之后,用来调节采样点滞后),一般:采样点位于 PROP_SEG + PHASE_SEG1 之后
时钟的微调
采样点的计算为:Ts = SYNC_SEG+PROP_SEG+PHASE_SEG1,若Tbit=16Tq
在预期时刻之前或之后发生的过渡会促使控制器计算时间差,并根据计算所得的时间差延长相位段1或者缩短相位段2。这有效地改变接收器到发信器的时序,将它们同步在一起。这个重新同步过程不断地在每次隐性向显性过渡时进行已确保发信器和接收器保持同步。不断地重新同步降低了噪声产生的错误,让同步至已经失去仲裁的节点的接收节点重新同步到赢得仲裁的节点。(wikipedia)
个人的理解是:当发送端发出跳变沿,接收端根据当前所处Tq值,增大PHASE_SEG1或减小PHASE_SEG2,以实现采样点和发送端的同步,由于位填充机制的存在,不论发送内容如何,CAN发送端会一直有跳变沿的存在,保证了同步更新地足够快。
**
1.3 帧
基本帧格式
拓展帧
2 CANFD(CAN with Flexible Datarate)
相较于传统CAN,CANFD支持更高的传输速率,但不是一直保持高速率,一般仲裁过程速率较低,数据段较高,最高支持8M/s;数据长最大长度从传统CAN(8字节),到CANFD(64字节)。
CAN有标准帧和远程帧,而CANFD只支持标准帧,支持扩展帧
CANFD的数据长度与传统CAN的数据长度都是由DLC确定,不同的是0-8表示具体数据长度,而9-15则是以8递进
由于CANFD的数据长度是不确定的,其CRC与传统CAN也有不同
CANFD在CRC之前,补充了SBC(Stuff Bit Counter)统计从SOF到数据长结束的数据个数
#1