GD32C103CBT6修改官方canfd历程,无法通信

[复制链接]
56|5
viktorHuang 发表于 2026-4-27 21:03 | 显示全部楼层 |阅读模式
int can_receive_cnt = 0;
// CAN接收处理
void CAN0_RX0_IRQHandler(void)
{
    uint8_t i;
    can_message_receive(CAN0, CAN_FIFO0, &g_receive_message);
        can_receive_cnt++;
}





void CanCtrl(void)
{  
//    CanSend();
        fdcan_send();
}




void fdcan_init(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_AF);
rcu_periph_clock_enable(RCU_CAN0);   
        gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_11);
    gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_12);
    can_parameter_struct can_parameter;
    can_fdframe_struct can_fd_parameter;
    can_fd_tdc_struct can_fd_tdc_parameter;
    can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);

    can_deinit(CAN0);
//    can_deinit(CAN1);

    CAN_CTL(CAN0) |= CAN_CTL_SWRST;
    while((CAN_CTL(CAN0) & CAN_CTL_SWRST) != 0);
    while((CAN_STAT(CAN0) & CAN_STAT_SLPWS) == 0);
       
    can_parameter.time_triggered = DISABLE;
    can_parameter.auto_bus_off_recovery = DISABLE;
    can_parameter.auto_wake_up = DISABLE;
    can_parameter.auto_retrans = ENABLE;
    can_parameter.rec_fifo_overwrite = ENABLE;
    can_parameter.trans_fifo_order = ENABLE;
    can_parameter.working_mode = CAN_NORMAL_MODE;

    can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
    can_parameter.time_segment_1 = CAN_BT_BS1_7TQ;
    can_parameter.time_segment_2 = CAN_BT_BS2_2TQ;
    can_parameter.prescaler = 6;

    can_init(CAN0, &can_parameter);
//    can_init(CAN1, &can_parameter);

    can_struct_para_init(CAN_FD_FRAME_STRUCT, &can_fd_parameter);
    can_fd_parameter.fd_frame = ENABLE;
    can_fd_parameter.excp_event_detect = ENABLE;
    can_fd_parameter.delay_compensation = ENABLE;
    can_fd_tdc_parameter.tdc_filter = 0x04;
    can_fd_tdc_parameter.tdc_mode = CAN_TDCMOD_CALC_AND_OFFSET;
    can_fd_tdc_parameter.tdc_offset = 0x04;
    can_fd_parameter.p_delay_compensation = &can_fd_tdc_parameter;
    can_fd_parameter.iso_bosch = CAN_FDMOD_ISO;
    can_fd_parameter.esi_mode = CAN_ESIMOD_HARDWARE;

    can_fd_parameter.data_resync_jump_width = CAN_BT_SJW_1TQ;
    can_fd_parameter.data_time_segment_1 = CAN_BT_BS1_2TQ;
    can_fd_parameter.data_time_segment_2 = CAN_BT_BS2_1TQ;

    can_fd_parameter.data_prescaler = 4;
    can_fd_init(CAN0, &can_fd_parameter);
//        CAN_FDCTL(CAN0) |= CAN_FDCTL_FDEN;
//    can_fd_init(CAN1, &can_fd_parameter);


    can1_filter_start_bank(14);
    can_filter_mask_mode_init(0x123, 0x0000, CAN_STANDARD_FIFO0, 0);
//    can_filter_mask_mode_init(0x123, 0x0000, CAN_STANDARD_FIFO0, 15);


    nvic_irq_enable(CAN0_RX0_IRQn, 0, 0);

//    nvic_irq_enable(CAN1_RX0_IRQn, 0, 0);

    can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0);
//    can_interrupt_enable(CAN1, CAN_INTEN_RFNEIE0);
       
       
        can_struct_para_init(CAN_TX_MESSAGE_STRUCT, &g_transmit_message);
    g_transmit_message.tx_sfid = 0x00;
    g_transmit_message.tx_efid = 0x00;
    g_transmit_message.tx_ft = CAN_FT_DATA;
    g_transmit_message.tx_ff = CAN_FF_STANDARD;
    g_transmit_message.tx_dlen = 64;
    g_transmit_message.fd_flag = CAN_FDF_FDFRAME;
    g_transmit_message.fd_brs = 1;
    g_transmit_message.fd_esi = 0;

    /* initialize receive message */
    can_struct_para_init(CAN_RX_MESSAGE_STRUCT, &g_receive_message);
}


int can_send_cnt = 0;
void fdcan_send(void)
{
        if(timerStr.flag.bit._100ms==1)
    {
                g_transmit_message.tx_sfid = 0x123;
                for(uint8_t i = 0;i < 64;i++)
                {
                        g_transmit_message.tx_data[0+i] = 0xaa;
                }
                       
                can_message_transmit(CAN0, &g_transmit_message);
                can_send_cnt++;
        }
}


在main函数中先调用初始化,再发送,APB1是60MHZ的,用示波器查看CANHIGH与地的波形,发现没有明显的波形变化,在2.5v附近的一条类似直线

classroom 发表于 2026-4-28 10:53 | 显示全部楼层
先确认物理层收发器有没有问题,TJA1050这类芯片如果待机模式没解除或者坏了,CANH就会卡在2.5V没反应。
cr315 发表于 2026-4-28 10:53 | 显示全部楼层
终端电阻必不可少,120欧电阻没接的话,总线差分信号推不起来,波形就是一条直线。
duo点 发表于 2026-4-28 10:54 | 显示全部楼层
仲裁段和数据段的波特率都要配置准确
elephant00 发表于 2026-4-28 10:55 | 显示全部楼层
保证总线上至少有两个正常节点,想靠一个设备自发自收,必须工作在环回模式下才行。
flycamelaaa 发表于 2026-4-28 10:59 | 显示全部楼层
检查GPIO复用配置,AF功能有没有开对,万一引脚冲突导致数据发不出去,物理层就测不到波形。
内政奇才 发表于 2026-4-28 11:31 | 显示全部楼层
改改总线负载,可能总线忙仲裁失败,设备不断重发卡死在发送邮箱。
jcky001 发表于 2026-4-28 11:55 | 显示全部楼层
你用的是120欧电阻还是60欧?
又见江南雨 发表于 2026-4-28 13:36 | 显示全部楼层
怀疑代码却测不到波形时,可以借用逻辑分析仪抓TX引脚,对比TX引脚和CANH的波形关系。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0