GD32C103单片机CAN通讯导致CAN总线一直报错

        有个项目,需要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总线,工作正常。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值