打印

GD32 CAN数据偶然发送失败

[复制链接]
995|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
573636075|  楼主 | 2023-12-8 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在车环境下,GD32E503进行CAN发送数据,出现偶然失败的问题,在周立功USBCAN-II+上并没有检测到发出来的数据,但can_transmit_states(CAN1, mbox)返回的结果是CAN_TRANSMIT_OK。在周立功USBCAN-II+模拟环境下,不会出现失败的问题,每次发都能检测到发出来的数据。请问有人知道实车环境下CAN数据偶然发送失败原因吗?
以下是初始化的代码:   
    can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
    can_deinit(CAN1);

    /* initialize CAN */
    can_parameter.time_triggered = DISABLE;
    can_parameter.auto_bus_off_recovery = ENABLE;
    can_parameter.auto_wake_up = DISABLE;
    can_parameter.auto_retrans = ENABLE;
    can_parameter.rec_fifo_overwrite = DISABLE;
    can_parameter.trans_fifo_order = DISABLE;
    can_parameter.working_mode = CAN_NORMAL_MODE;
    can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;

    /* baudrate 1Mbps  = 90M/ 6 / (5+3+1) */
    tbs1 = CAN_BT_BS1_6TQ;
    tbs2 = CAN_BT_BS2_3TQ;
    brp = 18;
    can_parameter.time_segment_1 = tbs1;
    can_parameter.time_segment_2 = tbs2;
    can_parameter.prescaler = brp;
    can_init(CAN1, &can_parameter);

   nvic_irq_enable(CAN1_RX0_IRQn, CAN1_PRIORITY, CAN1_SUBPRIORITY);

   can_interrupt_enable(CAN1, CAN_INTEN_RFNEIE0);

以下是设置滤波器的代码:   
void bsp_can_set_filter(can_port_t Port, uint16_t number, uint32_t datatype, uint32_t rxfid, uint32_t filtermask)
{
    can_filter_parameter_struct can_filter;

    if (Port == CAN_PORT_0) can_filter.filter_number = number;
    else can_filter.filter_number = number + 14;

    can_filter.filter_mode = CAN_FILTERMODE_MASK;
    can_filter.filter_bits = CAN_FILTERBITS_32BIT;

    if (datatype == CAN_FF_STANDARD) {
        can_filter.filter_list_high = ((rxfid << 21) & 0xffff0000) >> 16;
        can_filter.filter_list_low = ((rxfid << 21) | datatype | CAN_FT_DATA) & 0xffff;
    } else {
        can_filter.filter_list_high = ((rxfid << 3) & 0xffff0000) >> 16;
        can_filter.filter_list_low = ((rxfid << 3) | datatype | CAN_FT_DATA) & 0xffff;
    }

    if (datatype == CAN_FF_STANDARD) {
        can_filter.filter_mask_high = ((filtermask << 21) & 0xffff0000) >> 16;
        can_filter.filter_mask_low = ((filtermask << 21) | datatype | CAN_FT_DATA) & 0xffff;
    } else {
        can_filter.filter_mask_high = ((filtermask << 3) & 0xffff0000) >> 16;
        can_filter.filter_mask_low = ((filtermask << 3) | datatype | CAN_FT_DATA) & 0xffff;
    }

    can_filter.filter_fifo_number = CAN_FIFO0;
    can_filter.filter_enable = ENABLE;

    can_filter_init(CAN0, &can_filter);
}

使用特权

评论回复
沙发
chenjun89| | 2023-12-8 21:03 | 只看该作者
检测一下逻辑流程,看看是否是有bug。

使用特权

评论回复
板凳
数码小叶| | 2023-12-8 22:07 | 只看该作者
车载环境考虑can error和恢复没?你的代码只是驱动层,失败是哪一层失败?

使用特权

评论回复
地板
zhoushangshi| | 2023-12-9 14:44 | 只看该作者
试着发送之前先清can发送相关的标志。

使用特权

评论回复
5
储小勇_526| | 2023-12-11 09:51 | 只看该作者
工具偶发的显示错误也是很可能发生的,我司买的GCAN就经常丢一些数据,其实也算正常。

使用特权

评论回复
6
elephant00| | 2023-12-12 11:25 | 只看该作者
CAN总线负载?

使用特权

评论回复
7
两只袜子| | 2023-12-12 11:26 | 只看该作者
可能是数据传输速率不匹配

使用特权

评论回复
8
jcky001| | 2023-12-12 11:26 | 只看该作者
驱动程序兼容性问题

使用特权

评论回复
9
daph| | 2023-12-12 14:03 | 只看该作者
请问这个结构体的定义在哪里可以查到呢can_filter

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

9

帖子

0

粉丝