STM32 CAN学习笔记 位时序

前言

本文将逐步更新,重点对我自己在使用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
在这里插入图片描述

波特率计算残留问题

  1. 为什么参考手册不说明一下他把PTS和PBS1合并了呢?
  2. 计算波特率的时候,为什么不计算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

这一步存疑,之前在队里的参数是如下
在这里插入图片描述

时间参数配置残留问题

  1. 将TBS1增加一点,TBS2减少一点,波特率不会变,只是采样的时间会有前后的推移,那么在保证他俩和一定的情况下,做这样的改变能不能正常通信呢?

过滤器配置

待更新

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值