转载:STM32配置CAN波特率

STM32之CAN---配置波特率

位时间特性

为了掌握如何设置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标准。


时间特性

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

与CAN波特率有关的寄存器

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

BTR

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

如何在代码中配置波特率

配置波特率是在CAN模块初始化时配置,代码示例如下:

//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=APB1总线频率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

STM32的CAN波特率计算

波特率=APB1Clock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler
(PS:CAN_SJW表示重新同步跳跃宽度,不参与波特率的计算,其值可以编程为1到4个时间单元,表示该总线对波特率范围的容差度。公式中1表示同步段固定为一个单位时间。)
例如:
APB1Clock=36Mhz,CAN_BS1=3,CAN_BS2=5,CAN_Prescaler=32
36000k/9/32=125k/s

另外,尽可能地把采样点设置为CiA推荐的值:

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

CiA计算方式:(1+CAN_BS1)/(1+CAN_BS1+CAN_BS2)

采样点设置的影响:采样点设置的符合表格中的范围,CAN通信 会更稳定。

The CAN bit comprises – depending on the configured “atomic” time unit called time quantum (tq) – multiple of these time quanta. The time quanta length derives from the bit-rate prescaler and the used oscillator frequency.

The CAN bit is logically divided into four segments. The synchronization segment has always a length of 1 tq. The following propagation segment and phase-segment 1 are not distinguishable for the user. It is configured as one value. The forth part is the phase-segment 2. Between the two phase-segments, the sample-point is located. If the bit-timing settings move the sample-point to the end of the bit, the propagation segment is enlarged, so that you can realize longer networks. If the sample-point is configured in the other direction, the re-synchronization capability is increased.

The sample point should be the same in all connected CAN nodes. However, in practice it is sufficient if the sample points don't vary too much. The automotive industry has specified some recommendations for the bit timing settings in the SAE J2284 series. For CANopen networks, the recommendations given in CiA 301 should be used. The sample points should be at 87,5 percent of the bit time. For most of the specified bit-rates a range of 85 percent to 90 percent is allowed. Of course, the larger the tolerance range, the shorter the maximum possible length of the network。

CAN位时间组成 取决于配置的“原子”时间单位称为时间量子(tq) - 这些时间量子的倍数。时间量程长度来自比特率预分频器和使用的振荡器频率。
CAN位时间逻辑上分为四个段。同步段总是长度为1 tq。后面的传播段和相位段1对于用户是不可区分的。它被配置为一个值。第四部分是相位段2.在两个相位段之间,定位采样点。如果位定时设置将采样点移动到位的结尾,则传播段被放大,以便可以实现更长的网络。如果采样点在另一个方向配置,则重新同步功能会增加。

所有连接的CAN节点的采样点应该相同。然而,在实践中,如果采样点区别不大就足够了。汽车行业为SAE J2284系列中的位定时设置指定了一些建议。对于CANopen网络,应使用CiA 301中给出的建议,采样点应为位时间的87.5%。对于大多数指定的比特率,允许85%至90%的范围。当然,公差范围越大,网络的最大可能长度越短。

你可能感兴趣的:(转载:STM32配置CAN波特率)