学习FDCAN,必须要了解波特率计算。STM32G474的FDCAN给出了两种位时间,一个是“the nominal bit time(标称位时间)”,另外一个是“the data bit time(数据位时间)”,同时告诉我们,FDCAN波特率是“位时间”的倒数,The baud rate is the inverse of bit time (baud rate = 1 / bit time)。到底用哪个,还是两个都用,这个和STM32F103有点不同。
1、STM32G474之FDCAN之分频器频率:
FDCAN输入时钟为PCLK1,经过分频器后就得到FDCAN分频器时钟。配置如下:
FDCAN_HandleTypeDef hfdcan1;
hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV4;
//设置“FDCAN_CKDIV寄存器bit3:0(PDIV[3:0])”
fdcan_tq_ck=fPCLK1/4=170MHz/4=42.5MHz
tfdcan_tq_clk=1/fdcan_tq_ck
2、位时间
通过上图,我们知道“位时间”由“SyncSeg时间”,“Bit segment 1 (BS1)时间”和“Bit segment 2 (BS2)时间”三部分组成。
1)、标称位时间(nominal bit time)
tq = (NBRP[8:0] + 1) * tfdcan_tq_clk=(NBRP[8:0] + 1) / fdcan_tq_ck;
SyncSeg时间: tSyncSeg = 1tq
Bit segment 1 (BS1)时间:tBS1 = tq * (NTSEG1[7:0] + 1)
Bit segment 2 (BS2)时间:tBS2 = tq * (NTSEG2[6:0] + 1)
重新同步跳跃时间:tSJW = (NSJW[3:0] + 1) x tq,可以了解一下,对波特率计算无影响,可以了解一下;
波特率的计算公式为:baud rate = 1 / bit time
baud rate = 1 / [ tSyncSeg + tBS1 + tBS2 ]
baud rate = 1 / [1tq + tq * (NTSEG1[4:0] + 1)+tq * (NTSEG2[3:0] + 1)]
baud rate = 1 / {tq * [1 + (NTSEG1[4:0] + 1)+(NTSEG2[3:0] + 1)] }
baud rate = 1 / { [ (NBRP[4:0] + 1)/fdcan_tq_ck ] * (3 + NTSEG1[4:0] + NTSEG2[3:0] ) }
baud rate = ffdcan_tq_clk / { (NBRP[4:0] + 1) * (3 + NTSEG1[4:0] + NTSEG2[3:0] ) }
使用标称位时间计算FDCAN波特率:
hfdcan1.Init.NominalPrescaler = 17;
//FDCAN_NBTP寄存器bit24:16(NBRP[8:0]),NBRP[8:0]=(17-1)=16波特率分频器为17分频
hfdcan1.Init.NominalSyncJumpWidth = 4;
//FDCAN_NBTP寄存器bit31:25(NSJW[6:0]),NSJW[6:0]=(4-1)=3标称(重新)同步跳转宽度
hfdcan1.Init.NominalTimeSeg1 = 17;
//FDCAN_NBTP寄存器bit15:8(NTSEG1[7:0]),NTSEG1[4:0]=(17-1)=16采样点前的标称时间段
hfdcan1.Init.NominalTimeSeg2 = 2;
//FDCAN_NBTP寄存器bit6:0(NTSEG2[6:0]),NTSEG2[6:0]=(2-1)=1采样点后的标称时间段
baud rate = ffdcan_tq_clk / { (NBRP[4:0] + 1) * (3 + NTSEG1[4:0] + NTSEG2[3:0] ) }
baud rate =( 42.5*1000)/{(16+1)*(3+16+1)}=125KHz
2)、数据位时间(bit time)
tq = (NBRP[8:0] + 1) * tfdcan_tq_clk=(NBRP[8:0] + 1) / fdcan_tq_ck;
SyncSeg时间: tSyncSeg = 1tq
Bit segment 1 (BS1)时间:tBS1 = tq * (DTSEG1[4:0] + 1)
Bit segment 2 (BS2)时间:tBS2 = tq * (DTSEG2[3:0] + 1)
重新同步跳跃时间:tSJW = (DSJW[3:0] + 1) x tq,对波特率计算无影响,可以了解一下;
波特率的计算公式为:baud rate = 1 / bit time
baud rate = 1 / [ tSyncSeg + tBS1 + tBS2 ]
baud rate = 1 / [1tq + tq * (DTSEG1[4:0] + 1)+tq * (DTSEG2[3:0] + 1)]
baud rate = 1 / {tq * [1 + (DTSEG1[4:0] + 1)+(DTSEG2[3:0] + 1)] }
baud rate = 1 / { [ (DBRP[4:0] + 1)/fdcan_tq_ck ] * (3 + DTSEG1[4:0] + DTSEG2[3:0] ) }
baud rate = ffdcan_tq_clk / { (DBRP[4:0] + 1) * (3 + DTSEG1[4:0] + DTSEG2[3:0] ) }
使用数据位时间计算FDCAN波特率:
hfdcan1.Init.DataSyncJumpWidth = 4;
//FDCAN_DBTP寄存器bit3:0(DSJW[3:0]),DSJW[3:0]=(4-1)同步跳转宽度
hfdcan1.Init.DataPrescaler = 17;
//FDCAN_DBTP寄存器bit20:16(DBRP[4:0]),DBRP[4:0]=(17-1)=16数字波特率分频器
hfdcan1.Init.DataTimeSeg1 = 17;//DTSEG1[4:0]=17-1=16
hfdcan1.Init.DataTimeSeg2 = 2;//DTSEG2[3:0]=2-1=1
baud rate = ffdcan_tq_clk / { (DBRP[4:0] + 1) * (3 + DTSEG1[4:0] + DTSEG2[3:0] ) }
baud rate = (42.5*1000) /{ (16+1)*(3+16+1) }=125KHz
3、测试结果
在实际应用中,修改“标称位时间(nominal bit time)”会影响FDCAN波特率计算。修改“数据
位时间”时,最好和“标称位时间(nominal bit time)”设置成一样。
为什么数据位时间应与标称位时间一致?
1)确保数据传输的稳定性:将数据位时间设置为标称位时间可以保证数据在传输过程中的稳定性。
如果数据位时间与标称位时间不一致,可能会导致数据传输过程中的延迟和错误,影响数据的完
整性和准确性。
2)提高通信效率:保持数据位时间和标称位时间一致,可以减少通信过程中的冲突和错误,从而
提高通信效率。在CAN总线中,位速率是固定的,确保数据位时间与标称位时间一致,有助于减少
通信错误,提高系统的可靠性。
3)减少系统负担:通过保持数据位时间和标称位时间一致,可以减少系统在处理数据时的负担,
避免因时间设置不匹配而导致的额外处理需求。
至于为什么要保持一致,资料没有写,这是从网络中搜索得到的。从实际测量,也确实要这么设置,具体什么原因,如果你知道,请给我留言。