一、问题描述
以下是GD32F205 CAN0的配置代码,将CAN0的波特率设置为125kbps。其中影响波特率的几个关键参数为resync_jump_width、time_segment_1、time_segment_2和prescaler,下面就详细探讨下几个参数的关系。
can_parameter_struct can_parameter;
can_parameter.time_triggered = DISABLE;
can_parameter.auto_bus_off_recovery = DISABLE;
can_parameter.auto_wake_up = DISABLE;
can_parameter.no_auto_retrans = DISABLE;
can_parameter.rec_fifo_overwrite = DISABLE;
can_parameter.trans_fifo_order = DISABLE;
can_parameter.working_mode = CAN_LOOPBACK_MODE;
/* configure baudrate to 125kbps */
can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
can_parameter.time_segment_1 = CAN_BT_BS1_5TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_4TQ;
can_parameter.prescaler = 48;
can_init(CAN0, &can_parameter);
二、官方描述
GD32官方的描述入下,
简言之
因此
由于PSC要为整数,所以在确定的波特率下,要选择合适的SJW、BS1和BS2。SWJ的取值范围为1~4,BS1的取值范围为1~16,BS2的取值范围为1~8。关于SWJ、BS1和BS2这三个参数的描述入下,建议详细阅读。
三、例子
以下举几个例子
/*******************************************
* PCLK时钟为60MHz,配置波特率为125kbps
* 60000/((1+5+4)*48) = 125
*******************************************/
can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
can_parameter.time_segment_1 = CAN_BT_BS1_5TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_4TQ;
can_parameter.prescaler = 48;
can_init(CAN0, &can_parameter);
/*******************************************
* PCLK时钟为60MHz,配置波特率为250kbps
* 60000/((1+5+4)*24) = 250
*******************************************/
can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
can_parameter.time_segment_1 = CAN_BT_BS1_5TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_4TQ;
can_parameter.prescaler = 24;
can_init(CAN0, &can_parameter);
/*******************************************
* PCLK时钟为60MHz,配置波特率为500kbps
* 60000/((1+6+5)*10) = 500
*******************************************/
can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
can_parameter.time_segment_1 = CAN_BT_BS1_6TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_5TQ;
can_parameter.prescaler = 10;
can_init(CAN0, &can_parameter);