CAN(低层或称硬件)协议仅仅定义了第 1 层(物理层)和第 2 层(数据链路层)
CAN总线简明易懂教程(讲得不错)
CAN总线简明易懂教程(一)
CAN总线简明易懂教程(二)
CAN总线简明易懂教程(三)
深入浅出、通俗易懂的讲解CAN bus(图文讲解比较通俗易懂)
CAN相关计算:
CAN总线-位时序、波特率、采样点
关于采样点和波特率的计算公式:
CAN波特率 = CAN时钟/( (1 + CAN_BS1 + CAN_BS2) * CAN_Prescaler)
sample = (1 + CAN_BS1) / (1 + CAN_BS1 + CAN_BS2)
如果 CAN时钟为8M,CAN_BS1 = 9,CAN_BS2 = 6,CAN_Prescaler = 5
那么 波特率=8M/(1+9+6)/5=100K
采样点=(1+9)/(1+9+6)=62.5%
由上面可以看出来,同一波特率条件下,BS1、BS2可以有不同的组合,不同的组合采样点不同。
例如,假设 FOSC = 20 MHz 时欲实现 125 kHz 的 CAN
波特率:
TOSC = 50 ns, 选择 BRP<5:0> = 04h, 则 TQ = 500 ns。欲达到 125 kHz,位时间应为 16 TQ。位的采样时刻取决于系统参数,通常应发生在位时间的60-70% 处。同时, TDELAY 典型值为 1-2 TQ。同步段 = 1 TQ,传播段 = 2 TQ,这种情况下设置相位缓冲段 PS1 = 7 TQ,将会在跳变之后的 10 TQ 时进行采样。此时相位缓冲段 PS2 长度为 6 TQ。由于相位缓冲段 PS2 长度为 6 TQ,根据规则, SJW 最大值为 4 TQ。然而通常状况下,只有当不同节点的时钟发生不够精确或不稳定 (如采用陶瓷谐振器)时,才需要较大的 SJW。一般情况下, SJW 取值 1 TQ 即可满足要求。
咱来理一理以上的内容:
首先晶振是20Mhz,那它的周期就为1/20MHz=50ns,如果BPR=4,则TQ=2*(4+1)50ns=500ns,那要实现125kHz也就是周期等于8us的一个标称位,那么就需要16TQ=8us/500ns。这16TQ需要按照编程要求对它们进行分布,首先同步段得1TQ,位采样时间要位于位的60%-70%处,那么这样算下来,采样的点也就PS1与PS2交点,PS1按照60%算的话也得9.6,即同步段1TQ,传播段2TQ,相位缓冲段PS1为7TQ,剩下PS2就剩6TQ。这样算下来是比较合适的。比较符合以上的要求。
那如果假设 FOSC = 8 MHz 时欲实现 1M 的 CAN的波特率:
TOSC = 0.125us, 选择 BRP<5:0> = 04h, 则 TQ =1.25us。欲达到 1MHz,位时间应为不到1 TQ。
晶振为8MHz,周期就为0.125us,如果BPR为4的话,则TQ=2(4+1)0.125us=1.25us,那要实现1Mhz的也就是周期为1us的标称位,只有不到1TQ的为时间,显然不可行。即使BPR为0,TQ=0.25us。所以1M的波特率需要4TQ,也不能实现。实现800Khz的1.25us,需要5TQ,显然也不适合。
对于要实现500Khz是,当BPR为0时,TQ=2(0+1)*0.125us=0.25us,要实现500KHz的波特率需要8TQ。这样来说还是可以满足时间段的要求的。
书籍:
《CAN总线轻松入门与实践》 李真花 崔健
《手把手教你学CAN总线》 来清民
《CAN总线嵌入式开发 从入门到实战》牛跃听 周立功
一个典型的CAN硬件电路
CAN应用层(高层)协议:
CAN协议和CANOpen协议是两套不同的协议。从软硬件层次来划分,CAN协议属于硬件协议,而CANOpen属于软件协议。
CANOpen系列教程