有个项目,需要CAN通讯和USB通讯,F103的片子两者之间有影响,所以查阅资料选择了C103系列的片子。产品开发后,自测没问题,就发给客户使用。
使用后客户反馈,产品放入总线,一直报错,导致CAN总线异常,影响使用;项目组集中讨论后,最后测试解决,为软件问题。
CAN通讯初始化的问题!!!!考虑到初次使用该芯片,所有使用官方固件库进行开发,官方CAN初始化函数如下:
/*!
\brief initialize CAN function
\param[in] none
\param[out] none
\retval none
*/
void can_config(void)
{
can_parameter_struct can_parameter;
can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
/* initialize CAN register */
can_deinit(CAN0);
can_deinit(CAN1);
/* initialize CAN parameters */
can_parameter.time_triggered = DISABLE;
can_parameter.auto_bus_off_recovery = DISABLE;
can_parameter.auto_wake_up = DISABLE;
can_parameter.auto_retrans = DISABLE;
can_parameter.rec_fifo_overwrite = DISABLE;
can_parameter.trans_fifo_order = DISABLE;
can_parameter.working_mode = CAN_NORMAL_MODE;
/* initialize CAN */
can_init(CAN0, &can_parameter);
can_init(CAN1, &can_parameter);
/* config CAN0 baud rate */
can_frequency_set(CAN0, DEV_CAN_BAUD_RATE);
/* config CAN1 baud rate */
can_frequency_set(CAN1, DEV_CAN_BAUD_RATE);
/* initialize filter */
can1_filter_start_bank(14);
can_filter_mask_mode_init(DEV_CAN0_ID, DEV_CAN0_MASK, CAN_EXTENDED_FIFO0, 0);
can_filter_mask_mode_init(DEV_CAN1_ID, DEV_CAN1_MASK, CAN_EXTENDED_FIFO0, 15);
/* configure CAN0 NVIC */
nvic_irq_enable(CAN0_RX0_IRQn, 0, 0);
/* configure CAN1 NVIC */
nvic_irq_enable(CAN1_RX0_IRQn, 1, 0);
/* enable can receive FIFO0 not empty interrupt */
can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0);
can_interrupt_enable(CAN1, CAN_INTEN_RFNEIE0);
}
问题出在can_frequency_set()函数,该函数不能设置采样点、同步跳转,导致波特率偏差,接入总线后,就一直报错。所以需要增加采样点、同步跳转的设置
/*设置采样点、同步跳转*/
can_parameter.resync_jump_width = CAN_BT_SJW_2TQ; /*提高位宽容忍度*/
can_parameter.time_segment_1 = CAN_BT_BS1_11TQ;
can_parameter.time_segment_2 = CAN_BT_BS2_4TQ; /*采样点:(BS1+1)/(BS1+BS2+1)=75%*/
/* initialize CAN */
can_init(CAN0, &can_parameter);
/* config CAN0 baud rate */
can_frequency_set(CAN0, DEV_CAN_BAUD_RATE);
更改配置后,再次接入CAN总线,工作正常。