飞思卡尔MC9S12XEP100 CAN学习总结(二) 波特率配置

飞思卡尔MC9S12XEP100 CAN学习总结(一) 概述

飞思卡尔MC9S12XEP100 CAN学习总结(二) 波特率配置

飞思卡尔MC9S12XEP100 CAN学习总结(三) 滤波器配置

波特率设置相关参数

在这里插入图片描述
在CAN的底层协议里将CAN数据的每一位时间(TBit)分为许多的时间段(Tscl),这些时间段包括:
A. 位同步时间(Tsync) 占用1个Tscl;

B. 时间段1(Tseg1)占用(Tseg1+1)个Tscl;

C. 时间段2(Tseg2)占用(Tseg2+1)个Tscl,

所以CAN控制器的位时间(TBit)就是:

*TBit=Tseg1+Tseg2+Tsync=(TSEG1+TSEG2+3)Tscl

那么CAN的波特率 (CANbps)就是:

CANbps=1/TBit

但是这样计算出的值是一个理论值。在实际的网络通信中由于存在传输的延时、不同节点的晶体的误差等因素,使得网络CAN的波特率的计算变得复杂起来。CAN在技术上便引入了重同步的概念,以更好的解决这些问题。这样重同步带来的结果就是要么时间段1(Tseg1)增加TSJW(同步跳转宽度SJW+1),要么时间段减少TSJW,因此CAN的波特率实际上有一个范围:1/(Tbit+Tsjw) ≤CANbps≤1/(Tbit-Tsjw)
CAN有波特率的值四以下几个元素决定:
A. 最小时间段Tscl;

B. 时间段1 TSEG1;

C. 时间段2 TSEG2;

D. 同步跳转宽度 SJW。
那么Tscl又是怎么计算的呢?这是总总线时序寄存器中的预分频寄存器BRP派上了用场,
Tscl=(BRP+1)/FVBP
FVBP为微处理器的外设时钟。

举例说明

例子1

总线时钟:fbus=32M,波特率 :CANbps=250K

注:本例中时钟使用总线时钟,若选择外设时钟,则外设时钟=晶振频率/2

比如,总线时钟fbus=32M,准备设定的波特率 CANbps=250K,则

位时间TBit=1/250k=4us.

*TBit=Tseg1+Tseg2+Tsync=(TSEG1+TSEG2+3)Tscl

一般 (TSEG1+TSEG2+3)的值取16(8~25之间),则

Tscl=4us/16=250ns

Tscl=(BRP+1)/fbus

fbus为微处理器的总线时钟。则

250ns=(BRP+1)/32M

计算之后BRP=7CAN0BTR0_BRP = 7

假设我们先不考虑BTR0中的SJW位和BTR1中的SAM位。那么,BTR0和BTR1就是2个分频系数寄存器;它们的乘积是一个扩展的分频系数。即:

BTR0×BTR1 = fbus/CANbps

BTR0*BTR1=32M/250K=128

BRP=7,其作为BTR0的组成部分,表示预分频值为8,则BTR1的预分频值为

BTR1 = 128/预分频值=128/8=16
(CAN规范中规定其取值在8~25之间)满足要求。

TSEG1和TESG2的值**(TSEG1+TSEG2+3)=16**,而根据CIA推荐:

75% when 波特率 > 800K
80% when 波特率 > 500K
87.5% when 波特率 <= 500K

CiA计算方式:

sample =(1+(TSEG1+1))/(1+(TSEG1+1)+(TSEG2+1))

sample = ( 1 + CAN_BS1) / (1 + CAN_BS1 + CAN_BS2)

在这里,CAN_BS1=TSEG1+1,CAN_BS2=TSEG2+1;

则CAN_BS1和CAN_BS2的取值要符合要求。

此处令CAN_BS1取13,CAN_BS2取2, 采样率=(1+13)/(1+13+2)=87.5% BTR1=0001 1100B

则CANBTR1的值为0x1c,即CAN0BTR1 = 0x1c

例子2

总线时钟:fbus=32M,波特率 :CANbps=100K

注:本例中时钟使用总线时钟,若选择外设时钟,则外设时钟=晶振频率/2

比如,总线时钟fbus=32M,准备设定的波特率 CANbps=100k,则

位时间TBit=1/100k=10us.

*TBit=Tseg1+Tseg2+Tsync=(TSEG1+TSEG2+3)Tscl

一般 (TSEG1+TSEG2+3)的值取20(8~25之间),则

Tscl=10us/20=500ns

Tscl=(BRP+1)/fbus

fbus为微处理器的总线时钟。则

500ns=(BRP+1)/32M

计算之后BRP=15CAN0BTR0_BRP = 0x0f

假设我们先不考虑BTR0中的SJW位和BTR1中的SAM位。那么,BTR0和BTR1就是2个分频系数寄存器;它们的乘积是一个扩展的分频系数。即:

BTR0×BTR1 = fbus/CANbps

BTR0*BTR1=32M/100K=32

BRP=15,其作为BTR0的组成部分,表示预分频值为16,则BTR1的预分频值为

BTR1 = 320/预分频值=320/16=20
(CAN规范中规定其取值在8~25之间)满足要求。

TSEG1和TESG2的值**(TSEG1+TSEG2+3)=20**,而根据CIA推荐:

75% when 波特率 > 800K
80% when 波特率 > 500K
87.5% when 波特率 <= 500K

CiA计算方式:

sample =(1+(TSEG1+1))/(1+(TSEG1+1)+(TSEG2+1))

sample = ( 1 + CAN_BS1) / (1 + CAN_BS1 + CAN_BS2)

在这里,CAN_BS1=TSEG1+1,CAN_BS2=TSEG2+1;

则CAN_BS1和CAN_BS2的取值要符合要求。

此处令CAN_BS1取15,CAN_BS2取2, 采样率=(1+15)/(1+15+2)=87.5% BTR1=0010 1111B

则CANBTR1的值为0x2f,即CAN0BTR1 = 0x2f

总之,BRP(BTR0的值)和CAN_BS1,CAN_BS2的值可以自定,但是要符合CIA推荐的标准,一般 (TSEG1+TSEG2+3)的值取20(8~25之间)此处为自己猜想,没有寻找依据

总体配置保持CAN_BS1>=CAN_BS2 , CAN_BS1>=1个CAN时钟周期 ,CAN_BS2>=2*SJW,

本例中,CAN_BS2=2,则SJW=1;即BRT0的bit7和bit6均为0

SAM的确定:低频时,选SAM=1,即采样3次。高频100K以上时,取SAM=0,即采样1次。

大部分内容依据作者:oO霹雳洋蛋Oo 的文章

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖茄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值