打印
[STM32F4]

【转】STM32之CAN---配置波特率

[复制链接]
1214|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一坨代码|  楼主 | 2016-9-10 22:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1 位时间特性
                    为了掌握如何设置STM32 CAN的波特率,首先我们得先了解一下位时间特性。
                     位时间特性逻辑通过采样来监视串行的CAN总线,并且通过跟帧起始位的边沿进行同步,及通过跟后面的边沿进行重新同步,来调整其采样点。
它的操作可以简单解释为,如下所述把名义上的每位的时间分为3段:
● 同步段(SYNC_SEG):通常期望位的变化发生在该时间段内。其值固定为1个时间单元(1 x tCAN)。
● 时间段1(BS1):定义采样点的位置。它包含CAN标准里的PROP_SEG和PHASE_SEG1。其值可以编程为1到16个时间单元,但也可以被自动延长,以补偿因为网络中不同节点的频率差异所造成的相位的正向漂移。
● 时间段2(BS2):定义发送点的位置。它代表CAN标准里的PHASE_SEG2。其值可以编程为1到8个时间单元,但也可以被自动缩短以补偿相位的负向漂移。

● 重新同步跳跃宽度(SJW):定义了在每位中可以延长或缩短多少个时间单元的上限。其值可以编程为1到4个时间单元。
● 有效跳变:被定义为,当bxCAN自己没有发送隐性位时,从显性位到隐性位的第1次转变。
如果在时间段1(BS1)而不是在同步段(SYNC_SEG)检测到有效跳变,那么BS1的时间就被延长最多SJW那么长,从而采样点被延迟了。相反如果在时间段2(BS2)而不是在SYNC_SEG检测到有效跳变,那么BS2的时间就被缩短最多SJW那么长,从而采样点被提前了。为了避免软件的编程错误,对位时间特性寄存器(CAN_BTR)的设置,只能在bxCAN处于初始化状态下进行。
注: 关于CAN位时间特性和重同步机制的详细信息,请参考ISO11898标准。

                                                              图1
特别注意上图下方的几个公式.可以得出的结论是:
CAN波特率=APB总线频率/BRP分频器/(1+tBS1+tBS2)

2 与CAN波特率有关的寄存器CAN位时间特性寄存器 (CAN_BTR)
地址偏移量: 0x1C
复位值: 0x0123 0000
注: 当CAN处于初始化模式时,该寄存器只能由软件访问。

                                                                                         图2

位31SILM: 静默模式(用于调试)
0: 正常状态;
1: 静默模式。
位30LBKM: 环回模式(用于调试)
0: 禁止环回模式;
1: 允许环回模式。
位29:26保留位,硬件强制为0。
位25:24SJW[1:0]: 重新同步跳跃宽度
为了重新同步,该位域定义了CAN硬件在每位中可以延长或缩短多少个时间单元的上限。
tRJW = tCAN x (SJW[1:0] + 1)。
位23保留位,硬件强制为0。
位22:20TS2[2:0]: 时间段2
该位域定义了时间段2占用了多少个时间单元
tBS2 = tCAN x (TS2[2:0] + 1)。
位19:16TS1[3:0]: 时间段1
该位域定义了时间段1占用了多少个时间单元
tBS1 = tCAN x (TS1[3:0] + 1)
位15:10保留位,硬件强制其值为0。
位9:0BRP[9:0]: 波特率分频器
该位域定义了时间单元(tq)的时间长度
tq = (BRP[9:0]+1) x tPCLK
3 如何在代码中配置波特率配置波特率是在CAN模块初始化时配置,代码示例如下:
[cpp] view plaincopy


  • //CAN1 register init   
  • CAN_DeInit(CAN1);  
  • CAN_StructInit(&CAN_InitStructure);  
  •       
  • //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 = ENABLE;   
  • CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;   
  • CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;   
  • CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; //tBS1=6个tCAN时钟周期  
  • CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; //tBS2=8个tCAN时钟周期  
  • CAN_InitStructure.CAN_Prescaler = 4; //ABP总线时钟时钟4分频  
  •       
  • //CANbps= Fpclk/((BRP+1)*((Tseg1+1)+(Tseg2+1)+1)   
  • //所以这里CANbps=30000000/4/(8+6+1))=500k bps  
  • //总体配置方向: Tseg1>=Tseg2  Tseg2>=tq; Tseg2>=2TSJW      
  • if (CAN_Init(CAN1,&CAN_InitStructure) == CANINITFAILED)           
  • {  
  •        return _ERROR;                                                      
  • }  
  • CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);//打开FMP0中断  

总体配置保持tBS1>=tBS2 tBS2>=1个CAN时钟周期  tBS2>=2tSJW
沙发
Rollo| | 2016-9-11 20:41 | 只看该作者
位时间特性逻辑通过采样来监视串行的CAN总线,并且通过跟帧起始位的边沿进行同步

使用特权

评论回复
板凳
一坨代码|  楼主 | 2016-9-11 23:05 | 只看该作者
Rollo 发表于 2016-9-11 20:41
位时间特性逻辑通过采样来监视串行的CAN总线,并且通过跟帧起始位的边沿进行同步 ...


回答正确

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

109

帖子

2

粉丝