can总线波特率参数调整
位时序就是说的can波特率.











第一步:
查看单片机中参数取值的范围.
stm32单片机中包含一下要设置的参数:
BRP:预分频值. (范围: 1-1024)
Ts1:包括Tps和Tpbs1. (范围: 1-16)
Ts2:包括Tpbs2. (范围: 1-8)
Sjw:用于设置Tpbs1和Tpbs2可以调节的节拍数. (范围: 1-4)

第二步:
首先看一个例子.如果要把can配置成500K波特率.
首先计算Q,它代表了一个位可以分成几个节拍,当然是越大越好.这样可以把节拍分的更细致一些.有个公式可以进行计算:
BRP=Fclk/(Q*Baudrate)
已知: Fclk就是stm32的APB上时钟 已知是42M=42 000 000
已知: 上面公式中Baudrate=500K=500 000
未知: BRP是分频系数,用于将APB的时钟分频到CAN时钟.
未知: Q,一个位分成Q份.
通过这已知的两个数,可以推出很多Q和BRP的组合,BRP=84/Q
所以,
84*1 (Q是84,最大,但是Q超过了stm32的设定范围)
42*2 (Q是84,最大,但是Q超过了stm32的设定范围)
21*4 (可以用, 即Q为21 BRP为4)
14*6
但是要求Q尽可能的大,所以BRP取值为4.
Q取值得到最大,为21.
波特率是500k,则每个位耗时2000ns,因为Q是21,所以被分成了21份.
每份耗时2000/21耗时95.2ns.
Q的参数就是越大越好.(但是不能超过stm32的设定范围)
Q就是一个bit,一个位所被分成的节拍数.
Q是总的节拍数,要分给各个段.
Q=Tss+Tps+Tpbs1+Tpbs2
Tss通常占一拍;
Tps和Tpbs1相加构成stm32单片机中的Ts1;
Tpbs2是stm32单片机中的Ts2;

第三步:
进行计算
Q是21,所以1位数据时长可以分成21份.
Q又由4个部分:
Q=Tss+Tps+Tps1+Tps2 (其中,在stm32中Tps和Tps1合并为一个参数了)
Tss:其值一般为1份;
Tps:是有设备性能和总线长度决定,通常情况下总线延迟可以按照5.5ns/m计算.
单个节点的收发延迟,可以按75ns计算.加入有线长1m,则Tps=2*(1*5.5+75)ns=161ns.
传播段时长Tps:信号在总线上来回传输所消耗的时间.
设一次单向传输的延时为Tdelay,包括:
1.发送节点从生产信号到把信号发送到总线上,Td1.
2.信号在总线上传输的时间Tbus.
3.接收节点从总线获取信号的时间Td2.
Tps>=2Tdelay=2*(Td1+Tbus+Td2)
根据Q的值,可以知道每个节拍耗时,然后用Tps除以每个节拍的时间,就知道Tps包含几个节拍了.(161/95.2约1.69个节拍,按2个计)
Tps1:一个位被分成Q个,Tss已知,Tps已知,那么剩下的个数被Tps1和Tps2瓜分.如果是奇数个,则Tps1比Tps2少1个. (21-1-2)/2=9 所以Tps1=9;Tps2=9;
SJW:它的值要取(Ts2-1)和4两个数小的那个.所以SJW=4.

第四步:
进行数据的分析
BRP=4; 预分频值. (在取值范围:1-1024内)
Ts1=2+9=11; 包括Tps和Tpbs1. (在取值范围:1-16内)
Ts2=9; 包括Tpbs2. (在取值范围:1-8内)
Sjw=4; 设Tpbs1和Tpbs2可以调节的节拍数. (在取值范围:1-4内)
然后判断一下,是否符合采样点规则:



BS1=Tps+Tpbs1
BS2=Tpbs2
(11+1)/(1+11+9)=12/21=57% 不太符合推荐值.
进行调整:
(16+1)/(1+16+4)=17/21=80.0% 还是不太符合.
继续调整:
(18+1)/(1+18+2)=17/21=85.7% 勉强符合,但会超出stm32范围Ts1>16了.所以选择上面的取值.
所以,最终定值为:
BRP=4; 预分频值. (1-1024)
Ts1=16; 包括Tps和Tpbs1. (1-16)
Ts2=4; 包括Tpbs2. (1-8)
Sjw=4; 设Tpbs1和Tpbs2可以调节的节拍数. (1-4)
程序中:

然后用500k的波特率,就可以接收:


最后放一个stm32手册上的图:
