由于STM32芯片本身不支持CAN线波特率自动识别,借助NXP的思想将STM32波特率自动识别经过一周时间研究出来了。
一、STM32位时间定义
● 同步段(SYNC_SEG):通常期望位的变化发生在该时间段内。其值固定为1
个时间单元(1 x tCAN)。
● 时间段1(BS1):定义采样点的位置。它包含CAN 标准里的 PROP_SEG 和
PHASE_SEG1。其值可以编程为1 到16 个时间单元,但也可以被自动延
长,以补偿因为网络中不同节点的频率差异所造成的相位的正向漂移。
● 时间段2(BS2) : 定义发送点的位置。它代表CAN 标准里的
PHASE_SEG2。其值可以编程为1 到8 个时间单元,但也可以被自动缩短
以补偿相位的负向漂移
BRP[9:0]: 波特率分频器
PCLK1 = 36M
bps = 36M/(BRP[9:0]*(BS1+BS2+SYNC_SEG))
其中SYNC_SEG固定为1个时间单元所以 bps = 36M/(BRP[9:0]*(BS1+BS2+1)),此时注意跟同步跳转宽度SJW没关系,尽管他也一直设置为1.
二、CAN采样点
采样点位于时间段1和时间段2之间。根据CIA推荐采样点,最好设置在85%~90%。
计算 (BS1+1)/(1+BS1+BS2),得出的结果就是BS1比较大而BS2比较小基本上为1.
三、自动识别原理
在我们不知道对方是扩展帧还是标准帧的情况我们是没有办法发送固定的帧ID并得到对方的回复,之前也想过尝试使用定时器计算帧长度来计算,但计算的误差比较大,放弃了。
这里分享一位博友的文章https://blog.csdn.net/chen441107/article/details/8632552。我也是从这篇文章得到的启发,虽然他用的是NXP的芯片,借助他的思想移植到STM32芯片来,识别率还是相当成功。
待更新......