可以修改初始化程序,判断是CAN1的话使用一套波特率设置,判断不是CAN1的话使用另一套波特率设置:
- if(CANx == CAN1)
- {
- //传统CAN总线的位速率
- //仲裁域波特率:Fclk/((SEG1+2)+(SEG2+1))/(Prescaler+1)=80M/40/2=1M
- //设定规则:SEG1>=SEG2+1, SEG2>=SJW
- stcInit.stcSBT.u8SEG1 = 30U;
- stcInit.stcSBT.u8SEG2 = 7U;
- stcInit.stcSBT.u8SJW = 2U;
- stcInit.stcSBT.u8Prescaler = 1U;
-
- //可变位速率
- //数据域波特率:Fclk/((SEG1+2)+(SEG2+1))/(Prescaler+1)=80M/16/1=5M
- //设定规则:SEG1>=SEG2, SEG2>=SJW
- stcInit.stcFDCfg.stcFBT.u8SEG1 = 11U;
- stcInit.stcFDCfg.stcFBT.u8SEG2 = 2U;
- stcInit.stcFDCfg.stcFBT.u8SJW = 2U;
- stcInit.stcFDCfg.stcFBT.u8Prescaler = 0U;
- stcInit.stcFDCfg.u8CANFDMode = CAN_FD_MODE_ISO_11898; //CAN_FD_MODE_BOSCH, CAN_FD_MODE_ISO_11898
- stcInit.stcFDCfg.u8TDCSSP = (stcInit.stcFDCfg.stcFBT.u8SEG1 + 2); //TDCSSP 建议设置与 (SEG1+2) 相同值
- }
- else
- {
- //传统CAN总线的位速率
- //仲裁域波特率:Fclk/((SEG1+2)+(SEG2+1))/(Prescaler+1)=80M/40/4=500K
- //设定规则:SEG1>=SEG2+1, SEG2>=SJW
- stcInit.stcSBT.u8SEG1 = 30U;
- stcInit.stcSBT.u8SEG2 = 7U;
- stcInit.stcSBT.u8SJW = 5U;
- stcInit.stcSBT.u8Prescaler = 3U;
-
- //可变位速率
- //数据域波特率:Fclk/((SEG1+2)+(SEG2+1))/(Prescaler+1)=80M/40/4=500K
- //设定规则:SEG1>=SEG2, SEG2>=SJW
- stcInit.stcFDCfg.stcFBT.u8SEG1 = 30U;
- stcInit.stcFDCfg.stcFBT.u8SEG2 = 7U;
- stcInit.stcFDCfg.stcFBT.u8SJW = 5U;
- stcInit.stcFDCfg.stcFBT.u8Prescaler = 3U;
- stcInit.stcFDCfg.u8CANFDMode = CAN_FD_MODE_ISO_11898; //CAN_FD_MODE_BOSCH, CAN_FD_MODE_ISO_11898
- stcInit.stcFDCfg.u8TDCSSP = (stcInit.stcFDCfg.stcFBT.u8SEG1 + 2); //TDCSSP 建议设置与 (SEG1+2) 相同值
- }
复制代码
|