STM32 CAN 波特率自动识别---(1)波特率计算

由于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芯片来,识别率还是相当成功。

待更新......

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值