21ic问答首页 - 使用GD32F303CCT6抓不到CAN波形,求助
使用GD32F303CCT6抓不到CAN波形,求助
本帖最后由 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;}
我使用的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;}

问答
赞0
好的,谢谢
评论
2026-03-17
赞0
不会出来的,CAN总线有通信机制,在正常模式下,CAN控制器必须参与到实际的总线通信中,一个关键要求是:它发送的每一帧数据,都必须收到至少一个其他CAN节点(哪怕是另一个开发板或CAN分析仪)发出的应答信号(ACK)才行,下面这样是没办法进行CAN数据的波形抓取的:
评论
2026-03-17
赞0
没有收发器的话只是不能将电平信号转换成差分信号吗,如果我用逻辑分析仪探TX引脚排针应该会有电平信号出来吧,求大佬解答
评论
2026-03-17
赞0
评论
2026-03-17
赞0
没有CAN收发器,芯片引脚跟排针TX引脚也是蜂鸣响的,我想的是在回环模式或正常模式下去发送CAN消息,然后通过逻辑分析仪抓取TX引脚的电平跳变,这样可行吗
评论
2026-03-17
赞0
评论
2026-03-17
赞0
好的,谢谢。我回环模式也测了能自收自发,但是也看不到TX引脚波形
评论
2026-03-16
赞0
你可以先用CAN的内部回环模式LOOPBACK(不需要经过外部电路)测试一下程序逻辑,即发送数据后,接收中断能不能正常触发并收到你发的数据,修改下面这个为LOOPBACK模式:
can_parameter.working_mode = CAN_NORMAL_MODE;
然后以后导入代码的话,把代码复制到下面这个里面再添加,可视化效果会好一点,方便坛友看代码:
评论
2026-03-16
您需要登录后才可以回复 登录 | 注册