问答

汇集网友智慧,解决技术难题

21ic问答首页 - 使用GD32F303CCT6抓不到CAN波形,求助

使用

使用GD32F303CCT6抓不到CAN波形,求助

SIDH2026-03-16
本帖最后由 SIDH 于 2026-3-16 10:13 编辑

我使用的GD32F303CCT6最小系统开发板,从官方的CAN例程上修改想通过逻辑分析仪抓取到CAN_TX引脚的波形,但是一直抓不到,强制TX,RX引脚电平反转能看到波形,求大佬给下思路。
[color=rgba(0, 0, 0, 0.85)][backcolor=rgba(0, 0, 0, 0.04)]extern FlagStatus receive_flag;extern can_receive_message_struct receive_message;can_trasnmit_message_struct transmit_message;uint8_t  ff_flag = 1;    void nvic_config(void);void led_config(void);void gpio_config(void);ErrStatus can_networking(void);void can_networking_init(void);/*!    \brief      main function    \param[in]  none    \param[out] none    \retval     none*/int main(void){                    uint8_t i = 0;    uint32_t timeout = 0xFFFF;    uint8_t transmit_mailbox = 0;    receive_flag = RESET;    /* configure GPIO */    gpio_config();    /* configure USART */    gd_eval_com_init(EVAL_COM1);    /* configure NVIC */    nvic_config();    /* initialize CAN and CAN filter */    can_networking_init();        /* enable CAN receive FIFO0 not empty interrupt */    can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0);        /* initialize transmit message */    transmit_message.tx_sfid = 0x7ab;    transmit_message.tx_efid = 0x00;    transmit_message.tx_ft = CAN_FT_DATA;    transmit_message.tx_ff = CAN_FF_STANDARD;    transmit_message.tx_dlen = 8;    printf("\r\nplease press the Tamper key to transmit data!\r\n");    while(1)        {                if(ff_flag == 1)                {                        ff_flag = 0;            transmit_message.tx_data[0] = 0xA0;            transmit_message.tx_data[1] = 0xA1;            transmit_message.tx_data[2] = 0xA2;            transmit_message.tx_data[3] = 0xA3;            transmit_message.tx_data[4] = 0xA4;            transmit_message.tx_data[5] = 0xA5;            transmit_message.tx_data[6] = 0xA6;            transmit_message.tx_data[7] = 0xA7;                                    printf("\r\n jjkkllllljk:");            printf("\r\n can0 transmit data:");            for(i = 0; i < transmit_message.tx_dlen; i++)                        {                printf(" %02x", transmit_message.tx_data);            }                                               /* transmit message */            transmit_mailbox = can_message_transmit(CAN0, &transmit_message);            /* waiting for transmit completed */            timeout = 0xFFFF;            while((CAN_TRANSMIT_OK != can_transmit_states(CAN0, transmit_mailbox)) && (0 != timeout))                        {                timeout--;            }                        if (0 == timeout)                    {                           printf("\r\n CAN0 Transmit Timeout! \r\n");                                                                 switch(can_error_get(CAN0))                                  {                        case CAN_ERROR_ACK: printf(" Reason: ACK Error (No other node?)"); break;                        case CAN_ERROR_BITRECESSIVE: printf(" Reason: Bit Error"); break;                        case CAN_ERROR_CRC: printf(" Reason: CRC Error"); break;                        default: printf(" Reason: Code %d", can_error_get(CAN0)); break;                 }                        }                        else                    {                           printf("\r\n CAN0 Transmit OK! \r\n");                        }                    }                        if(SET == receive_flag)                {            receive_flag = RESET;            printf("\r\n can0 receive data:");            for(i = 0; i < receive_message.rx_dlen; i++)                        {                printf(" %02x", receive_message.rx_data);            }        }    }}/*!    \brief      initialize CAN and filter    \param[in]  none    \param[out] none    \retval     none*/void can_networking_init(void){    can_parameter_struct can_parameter;    can_filter_parameter_struct can_filter;    /* initialize CAN structures */    can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);    can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);    /* initialize CAN register */    can_deinit(CAN0);    /* 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;    can_parameter.time_segment_1 = CAN_BT_BS1_7TQ;    can_parameter.time_segment_2 = CAN_BT_BS2_2TQ;    /* baudrate 1Mbps */    can_parameter.prescaler = 6;            can_init(CAN0, &can_parameter);    /* initialize filter */    /* CAN0 filter number */    can_filter.filter_number = 0;    /* initialize filter */        can_filter.filter_mode = CAN_FILTERMODE_MASK;    can_filter.filter_bits = CAN_FILTERBITS_32BIT;    can_filter.filter_list_high = 0x0000;    can_filter.filter_list_low = 0x0000;    can_filter.filter_mask_high = 0x0000;    can_filter.filter_mask_low = 0x0000;      can_filter.filter_fifo_number = CAN_FIFO0;    can_filter.filter_enable = ENABLE;    can_filter_init(&can_filter);                         can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0); // RX FIFO0 非空中断}/*!    \brief      configure the nested vectored interrupt controller    \param[in]  none    \param[out] none    \retval     none*/void nvic_config(void){    /* configure CAN0 NVIC */    nvic_irq_enable(USBD_LP_CAN0_RX0_IRQn,0,0);}/*!    \brief      configure the leds    \param[in]  none    \param[out] none    \retval     none*/void led_config(void){    gd_eval_led_init(LED2);    gd_eval_led_init(LED3);    gd_eval_led_init(LED4);    gd_eval_led_init(LED5);}/*!    \brief      configure GPIO    \param[in]  none    \param[out] none    \retval     none*/void gpio_config(void){    /* enable can clock */    rcu_periph_clock_enable(RCU_CAN0);    rcu_periph_clock_enable(RCU_GPIOB);        rcu_periph_clock_enable(RCU_AF); //AFIO时钟                    gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);        gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_8);        gpio_pin_remap_config(GPIO_CAN_PARTIAL_REMAP,ENABLE);}/* retarget the C library printf function to the usart */int fputc(int ch, FILE *f){    usart_data_transmit(EVAL_COM1, (uint8_t) ch);    while(RESET == usart_flag_get(EVAL_COM1, USART_FLAG_TBE));    return ch;}


回答 +关注 1
1298人浏览 8人回答问题 分享 举报
8 个回答
  • dffzh 发表于 2026-3-17 10:27
    不会出来的,CAN总线有通信机制,在正常模式下,CAN控制器必须参与到实际的总线通信中,一个关键要求是: ...

    好的,谢谢
  • SIDH 发表于 2026-3-17 09:34
    没有收发器的话只是不能将电平信号转换成差分信号吗,如果我用逻辑分析仪探TX引脚排针应该会有电平信号出 ...

    不会出来的,CAN总线有通信机制,在正常模式下,CAN控制器必须参与到实际的总线通信中,一个关键要求是:它发送的每一帧数据,都必须收到至少一个其他CAN节点(哪怕是另一个开发板或CAN分析仪)发出的应答信号(ACK)才行,下面这样是没办法进行CAN数据的波形抓取的:
    5743369b8bc1500a2f.png
  • dffzh 发表于 2026-3-17 09:21
    不可行,回环模式无法测试到引脚处的波形;正常模式时,需要有完整的正常的CAN通信链路,才能测试到TX波形 ...

    没有收发器的话只是不能将电平信号转换成差分信号吗,如果我用逻辑分析仪探TX引脚排针应该会有电平信号出来吧,求大佬解答
  • SIDH 发表于 2026-3-17 09:13
    没有CAN收发器,芯片引脚跟排针TX引脚也是蜂鸣响的,我想的是在回环模式或正常模式下去发送CAN消息,然后 ...
    不可行,回环模式无法测试到引脚处的波形;正常模式时,需要有完整的正常的CAN通信链路,才能测试到TX波形。
  • dffzh 发表于 2026-3-17 08:48
    那你这个的话,程序上应该问题不大,很可能就是外部CAN节点通信异常,MCU收不到CAN_RX数据,一般是测试不到 ...

    没有CAN收发器,芯片引脚跟排针TX引脚也是蜂鸣响的,我想的是在回环模式或正常模式下去发送CAN消息,然后通过逻辑分析仪抓取TX引脚的电平跳变,这样可行吗
  • 本帖最后由 dffzh 于 2026-3-17 08:50 编辑
    SIDH 发表于 2026-3-16 19:30
    好的,谢谢。我回环模式也测了能自收自发,但是也看不到TX引脚波形
    那你这个的话,程序上应该问题不大,很可能就是外部CAN节点通信异常,MCU收不到CAN_RX数据,一般是测试不到CAN_TX的,这是CAN总线的机制,你可以了解一下CAN总线的通信机制,再看一下外部电路,外面是接了CAN收发器芯片吧,是不是没有正常工作?
  • dffzh 发表于 2026-3-16 16:31
    你可以先用CAN的内部回环模式LOOPBACK(不需要经过外部电路)测试一下程序逻辑,即发送数据后,接收中断能 ...

    好的,谢谢。我回环模式也测了能自收自发,但是也看不到TX引脚波形
  • 本帖最后由 dffzh 于 2026-3-16 16:40 编辑

    你可以先用CAN的内部回环模式LOOPBACK(不需要经过外部电路)测试一下程序逻辑,即发送数据后,接收中断能不能正常触发并收到你发的数据,修改下面这个为LOOPBACK模式:
    can_parameter.working_mode = CAN_NORMAL_MODE;

    然后以后导入代码的话,把代码复制到下面这个里面再添加,可视化效果会好一点,方便坛友看代码:
    6397269b7c1e610838.png

您需要登录后才可以回复 登录 | 注册