分享

STM32 CAN 波特率、采样点

 xingwangjy 2019-04-08

为了总结在STM32上设置CAN波特率和采样点,所以整理自己的理解如下:

一,CAN波特率

1.CAN位时序

2.公式推导

这里Tpclk理解成CAN时钟的周期(实际上CAN使用APB1时钟)

根据图中公式有:

(1)  正常的位时间(Tnbt) = (1+Tbs1 + Tbs2)*Tq

(2)  Tq = (BRP+1)*Tpclk 

设CAN时钟频率为Fpclk,则有

(3)  Tq = (BRP+1)/Fpclk

由(1),(3)有:

(4)  Tnbt =(1+Tbs1 + Tbs2)* (BRP+1) / Fpclk

由(4)知CAN输出波特率(Fcan = 1 / Tnbt )为:

Fcan = Fpclk / ( (1+Tbs1 + Tbs2)* (BRP[9:0]+1) )

3.程序配置

a.预备知识:

在stm32手册中BTR寄存器内容如下:

公式:Fcan = Fpclk / ( (1+Tbs1 + Tbs2)* (BRP[9:0]+1) )结合上表有:

Fcan = Fpclk  / ( (1 + (TS1[3:0] + 1) + (TS2[2:0] + 1) ) * (BRP[9:0]+1))

在 stm32f10x.h中有:

    /*******************  Bit definition for CAN_BTR register  ********************/

#define  CAN_BTR_BRP                         ((uint32_t)0x000003FF)        /*!< Baud Rate Prescaler */

#define  CAN_BTR_TS1                         ((uint32_t)0x000F0000)        /*!< Time Segment 1 */

#define  CAN_BTR_TS2                         ((uint32_t)0x00700000)        /*!< Time Segment 2 */

#define  CAN_BTR_SJW                         ((uint32_t)0x03000000)        /*!< Resynchronization Jump Width */

#define  CAN_BTR_LBKM                        ((uint32_t)0x40000000)        /*!< Loop Back Mode (Debug) */

#define  CAN_BTR_SILM                        ((uint32_t)0x80000000)        /*!< Silent Mode */

在stm32f10x_can.h中有:

#define CAN_BS1_1tq                 ((uint8_t)0x00)  /*!< 1 time quantum */

#define CAN_BS1_2tq                 ((uint8_t)0x01)  /*!< 2 time quantum */

...

#define CAN_BS2_1tq                 ((uint8_t)0x00)  /*!< 1 time quantum */

#define CAN_BS2_2tq                 ((uint8_t)0x01)  /*!< 2 time quantum */

...

由上可知表示值比实际值大1,Tbs1 = Tq*(TS1[3:0] + 1) 等价于 Tbs1 = Tq*CAN_BS1_xtq,CAN_BS1_xtq即为表示值

在stm32f10x_can.c中CAN_Init接口中设置BTR部分有:

        /* Set the bit timing register */

        CANx->BTR = ( uint32_t )(( uint32_t )CAN_InitStruct->CAN_Mode << 30 ) | \

                    (( uint32_t )CAN_InitStruct->CAN_SJW << 24 ) | \

                    (( uint32_t )CAN_InitStruct->CAN_BS1 << 16 ) | \

                    (( uint32_t )CAN_InitStruct->CAN_BS2 << 20 ) | \

                    (( uint32_t )CAN_InitStruct->CAN_Prescaler - 1 );

由上边代码可知BTR的BRP[9:0]的值为CAN_Prescaler - 1

从2中所推导的公式可知:

CAN波特率 = CAN时钟/( (1 + CAN_BS1 + CAN_BS2)  * CAN_Prescaler)

举个例子:

/* CAN cell init */

CAN_InitStructure.CAN_TTCM=DISABLE;

CAN_InitStructure.CAN_ABOM=DISABLE;

CAN_InitStructure.CAN_AWUM=DISABLE;

CAN_InitStructure.CAN_NART=DISABLE;

CAN_InitStructure.CAN_RFLM=DISABLE;

CAN_InitStructure.CAN_TXFP=DISABLE;

CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;

CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;

CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;

CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;

CAN_InitStructure.CAN_Prescaler=5;

CAN_Init(&CAN_InitStructure);100k

/* CAN cell init */CAN_Interrupt

CAN_InitStructure.CAN_TTCM=DISABLE;

CAN_InitStructure.CAN_ABOM=DISABLE;

CAN_InitStructure.CAN_AWUM=DISABLE;

CAN_InitStructure.CAN_NART=DISABLE;

CAN_InitStructure.CAN_RFLM=DISABLE;

CAN_InitStructure.CAN_TXFP=DISABLE;

CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;

CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;

CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;

CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;

CAN_InitStructure.CAN_Prescaler=1;

CAN_Init(&CAN_InitStructure);//500k

如果CAN时钟为8M, CAN_BS1 = 8,CAN_BS2 = 7,CAN_Prescaler = 5

那么波特率就是=8M/(1+8+7)/5=100K

二,CAN采样点

有上面可知得到相同的波特率  CAN_BS1,CAN_BS2会有多种组合,而采样点由这2个参数确定,计算公式为:

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


原文:https://blog.csdn.net/ppdyhappy/article/details/71473672 

采样点原理::::::::::;

采样点是接收节点判断信号逻辑的位置,采样点对CAN总线来说极其重要,尤其是在组网的时候,多个节点尽量保持同一个采样点,若网络中节点采样点不一致会导致同样的采样频率出现采样错误,进而会使整个网络出现故障。

一、采样点的规则及原理

CAN 协议里将一个位时间分为同步段、传播段、相位缓冲段 1 和相位缓冲段 2。这些段又由称之为Time Quantum(以下称为Tq)的最小时间单位构成。1位由多少个Tq构成、每个段由多少个Tq构成等是可以设定的。通过设置bit时序,使得可以设定一个采样点以使总线上多个单元可同时采样,所谓采样点就是在这一时刻总线上的电平被锁存,这个锁存的电平作为位的值。采样点的位置在相位缓冲段1(PBS1)的结束处。

图1  CAN 位时间结构图

l 同步段(SS):多个连接在总线上的单元通过此段实现时序调整,同步进行接收和发送工作,边沿包含在此段中;

l 传播时间段(PTS):用于补偿网络上所有的物理延迟;

l 相位缓冲段1(PBS1)和相位缓冲段2(PBS2):当信号不能被包换于(SS)段中时,可在此段进行补偿;

l 采样点:读取并解释总线上各位值的一个时间点。

采样点位置如图1所示,它是读取总线电平,并将读到的电平作为位值的点,所以从一个位的开始到采样点的时间占一个完整位的总时间的百分比就是所求的采样点的值:sample =(1+TSEG1)/(1+TSEG1+TSEG2)。

二、 采样点测试原理

测试原理:波特率采样点是CAN节点判断位逻辑值的判断点。采用干扰的手段,将采样点位置的逻辑电平破坏,则这个CAN报文将出现错误。以此就可以确定干扰的位置为采样点位置。如图2所示,使用我们的CANScope-Pro的错误与干扰功能,可以调整需要翻转的位偏移时间与持续时间,发送此错误的报文给DUT。通过递进式移动干扰位置,查看总线出现错误帧的情况,则出现错误帧的偏移时间(图中红色箭头)为采样点位置。

图2  采样点测试原理

本测试使用CANScope-Pro和CANScope-StressZ。需要DUT上电后,初始化控制器后,不发送CAN报文,方便进行测试。CANScope可以勾选总线应答。如图所示,进行测试连接。使能CANScope-StressZ的RHL为60欧。

图3  采样点测试连接

执行CANScope-Pro的“采样点测试”功能,如图4所示。点击开始测试后。

图4 采样点测试

稍等片刻,即可出现测试结果,如图5所示,测试出来的采样点结果为85%~95%。

图5  采样点测试结果

三、 常规采样点的设计

采样点对CAN总线来说非常重要,在组网的时候,多个节点应尽量保持同一个采样点,且最好在但不超过7/8位时间点上,标准中也给了如下几个例子。

关于采样点的计算,sample =(1+TSEG1)/(1+TSEG1+TSEG2).

例如上面的计算举例:晶振时钟频率16M, SJW为1个Tq, TSEG1 为13, TSEG2为2,则采样点计算带入上面的公式,sample =(1+13)/(1+13+2)=87.5%.

最后建议大家尽可能的把采样点设置为 CiA 推荐的值:当波特率 > 800K采样点75%,当波特率 > 500K采样点80%, 当波特率 <= 500K采样点87.5% 。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多