前言
本文将逐步更新,重点对我自己在使用CAN外设时候产生的疑问进行解答。
位时序
本部分主要介绍正向波特率计算(已知tq, tbs1, tbs2等,求通信波特率)以及反向时间参数配置(已知通信波特率,求tq, tbs1, tbs2等)
波特率计算
在STM32F4 Reference Manual里找到如下图。
然后再对比标准的CAN协议中位时序
发现STM32定义的位时序缺少了PTS段,查找资料可以找到下图中关于各段的作用的说明。
发现缺少的PTS段是用来吸收物理延迟的,所以从功能上来讲,完全可以把PTS段和PBS1段合并到一起。而在STM32CUBEMX中也可以看出,STM32中的PBS1段的取值范围是1~16,正好是这个图中的两个8加起来,所以印证了我的想法。
在STM32参考手册中,找到Table 1. STM32F4xx register boundary addresses,里面可以查到外设的时钟。如CAN1就是APB1。
这里有小问题:
APB1 perpherial是42Mhz。为什么1/42M3 = 71ns?不是应该1/42M4吗?
需要注意的细节其实是:Prescaler并不等于BRP[9:0]。阅读HAL库源码中HAL_CAN_Init函数。发现:
即设置寄存器的时候是用的Prescaler-1,而参考手册给出的是直接的寄存器的值,所以这个地方会有一个1的差别。
于是可以通过下式计算tq
波特率计算残留问题
- 为什么参考手册不说明一下他把PTS和PBS1合并了呢?
- 计算波特率的时候,为什么不计算SJW?时序图里也没有SJW,是为什么呢?
时间参数配置
根据以上波特率计算,反过来我们已知某设备的通信波特率(以1Mbps为例),现要进行STM32的CAN参数配置。我们需要做的配置分两步
计算NorminalBitTime
例如已知BaudRate=1Mhz,则NorminalBitTime=1000ns
计算APB1的时钟周期T_APB1
例如APB1频率42Mhz,则T_APB1=1000/42 ns
把NorminalBitTime分成N个tq
这里要注意,tq即要是T_APB1的倍数,也要是NorminalBitTime的因数,这是一个比较好的整除关系,不妨表达成
这里的实际一点的操作可以是这样
先计算出这个数,如本例中是42,于是可以对42做分解,得到42=327。于是就取N=2*7=14,Prescaler=3。
把N分配给各个SEGMENT
这一步存疑,之前在队里的参数是如下
时间参数配置残留问题
- 将TBS1增加一点,TBS2减少一点,波特率不会变,只是采样的时间会有前后的推移,那么在保证他俩和一定的情况下,做这样的改变能不能正常通信呢?
过滤器配置
待更新