where the options are Peripheral clock=20MHz or Oscillator clock (16MHz if using 32MHz xtal or 13MHz if using 26MHz xtal). The recomiendation is to use the Oscillator clock due to peripheral clock can have jitter that affect communication.
计算公式
TQ calculation for nominal phase:(这里我的程序选择外部32Mhz,为什么下面是16Mhz请看上面那段英文)
TQ = (PRESDIV + 1) / CANCLK = (3 + 1) / 16000000 = 0.00000025
TQ calculation for FD phase:
TQ = (FPRESDIV + 1) / CANCLK = (0 + 1) / 16000000 = 0.0000000625
For nominal phase:
- Bit Time = (number of Tq in 1 bit time) x Tq
- CAN Bit Time = (1 + (PROPSEG + PSEG1 + 2) + (PSEG2 + 1) ) x Tq
- CAN Bit Time = (1 + (1 + 2 + 2) + (1 + 1) ) x Tq = 8 x 0.00000025
- Baud rate = 1/ CAN Bit Time = 500KHz
For FD phase:
- CAN Bit Time = (number of Tq in 1 bit time) x Tq
- CAN Bit Time = (1 + (FPROPSEG + FPSEG1 + 1) + (FPSEG2 + 1) ) x Tq
- CAN Bit Time = (1 + (0 + 1 + 1) + (1 + 1) ) x Tq = 5 x Tq = 0.0000003125
- Bit Rate = 1/CAN Bit Time = 1 / 0.0000003125 = 3.2MHz
1.125K配置
flexcan_config_t flexcanConfig;
FLEXCAN_GetDefaultConfig(&flexcanConfig);//设置默认值给flexcanConfig
flexcanConfig.baudRate = 125000;//修改波特率125000
flexcanConfig.clkSrc = kFLEXCAN_ClkSrcOsc;//使用外部32M晶振
/*下面参考参考手册37.4.8.7*/
flexcanConfig.timingConfig.phaseSeg1 = 5;(PSEG1 )
flexcanConfig.timingConfig.phaseSeg2 = 4;(PSEG2 )
flexcanConfig.timingConfig.propSeg = 3;(PROPSEG )
flexcanConfig.timingConfig.rJumpwidth = 1;
修改库函数FLEXCAN_SetBaudRate将timingConfig.preDivider设置成0x07(分频PRESDIV ),最好还是不要修改库函数,自己重新定义初始化
波特率125k = 1/((1+3+5+2+4+1)*((7+1)/16000000))
2.250k配置
flexcan_config_t flexcanConfig;
FLEXCAN_GetDefaultConfig(&flexcanConfig);//设置默认值给flexcanConfig
flexcanConfig.baudRate = 250000;//修改波特率250000
flexcanConfig.clkSrc = kFLEXCAN_ClkSrcOsc;//使用外部32M晶振
/*下面参考参考手册37.4.8.7*/
flexcanConfig.timingConfig.phaseSeg1 = 2;(PSEG1 )
flexcanConfig.timingConfig.phaseSeg2 = 1;(PSEG2 )
flexcanConfig.timingConfig.propSeg = 1;(PROPSEG )
flexcanConfig.timingConfig.rJumpwidth = 1;
修改库函数FLEXCAN_SetBaudRate将timingConfig.preDivider设置成0x07(分频PRESDIV ),最好还是不要修改库函数,自己重新定义初始化
波特率125k = 1/((1+2+1+2+1+1)*((7+1)/16000000))
3.500k配置
flexcan_config_t flexcanConfig;
FLEXCAN_GetDefaultConfig(&flexcanConfig);//设置默认值给flexcanConfig
flexcanConfig.baudRate = 250000;//修改波特率250000
flexcanConfig.clkSrc = kFLEXCAN_ClkSrcOsc;//使用外部32M晶振
/*下面参考参考手册37.4.8.7*/
flexcanConfig.timingConfig.phaseSeg1 = 2;(PSEG1 )
flexcanConfig.timingConfig.phaseSeg2 = 1;(PSEG2 )
flexcanConfig.timingConfig.propSeg = 1;(PROPSEG )
flexcanConfig.timingConfig.rJumpwidth = 1;
修改库函数FLEXCAN_SetBaudRate将timingConfig.preDivider设置成0x03(分频PRESDIV ),最好还是不要修改库函数,自己重新定义初始化
波特率125k = 1/((1+2+1+2+1+1)*((3+1)/16000000))