| 
 
| 这里用的是CAN0,在回环模式的时候可以发送,也可以接收,可以进中断,但是在普通模式的时候就没法发送,但是用示波器看是有波形的,上位机用的PCAN_VEIW,收不到数据,上位机发数据也收不到,不进中断。 #include "can.h"
 #include "stdio.h"
 #include "stdlib.h"
 #include "string.h"
 //#include "gd32e5xx.h"
 #include "systick.h"
 uint8_t can_rx_msg_index = 0;
 
 /**
 * @brief 配置 CAN0 的 GPIO 引脚
 */
 void can_gpio_config(void)
 {
 
 // 使能 GPIOA 和复用功能时钟
 
 rcu_periph_clock_enable(RCU_AF);
 rcu_periph_clock_enable(RCU_GPIOA);
 
 // 使能 CAN0 部分重映射(将 CAN0 引脚重映射到 PA11 和 PA12)
 
 gpio_pin_remap_config(((uint32_t)0x001D0000U | PCF0_CAN0_REMAP(0)), ENABLE);
 // 配置 CAN0_RX (PA11) 为上拉输入
 gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
 // 配置 CAN0_TX (PA12) 为复用推挽输出
 gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
 //        gpio_bit_set(GPIOA,GPIO_PIN_11);
 //        gpio_bit_set(GPIOA,GPIO_PIN_12);
 }
 
 /**
 * @brief 初始化 CAN0 外设
 */
 void can_init_config(void)
 {
 can_parameter_struct can_parameter;
 can_filter_parameter_struct can_filter;
 
 // 使能 CAN0 时钟
 rcu_periph_clock_enable(RCU_CAN0);
 
 // 复位 CAN0 寄存器
 can_deinit(CAN0);
 
 // 初始化 CAN 参数结构体
 can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
 
 // 配置 CAN 参数
 can_parameter.time_triggered = DISABLE;
 can_parameter.auto_bus_off_recovery = DISABLE;
 can_parameter.auto_wake_up = ENABLE;
 can_parameter.auto_retrans = ENABLE;
 can_parameter.rec_fifo_overwrite = DISABLE;
 can_parameter.trans_fifo_order = DISABLE;
 //    can_parameter.working_mode = CAN_LOOPBACK_MODE;
 can_parameter.working_mode = CAN_NORMAL_MODE;
 // 配置波特率为 125Kbps
 can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
 can_parameter.time_segment_1 = CAN_BT_BS1_12TQ;
 can_parameter.time_segment_2 = CAN_BT_BS2_5TQ;
 can_parameter.prescaler = 40;
 
 // 初始化 CAN0
 if(can_init(CAN0,&can_parameter) == ERROR)
 {
 return ;
 }
 
 // 初始化过滤器结构体
 can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);
 
 // 配置过滤器
 can_filter.filter_mode = CAN_FILTERMODE_MASK;
 can_filter.filter_bits = CAN_FILTERBITS_32BIT;
 can_filter.filter_list_high = 0x00;
 can_filter.filter_list_low = 0x00;
 can_filter.filter_mask_high = 0x0000;
 can_filter.filter_mask_low = 0x0000;
 can_filter.filter_fifo_number = CAN_FIFO0;
 can_filter.filter_number = 0;
 can_filter.filter_enable = ENABLE;
 
 // 初始化过滤器
 can_filter_init(CAN0, &can_filter);
 
 
 // 使能 CAN0 接收 FIFO0 非空中断
 can_interrupt_enable(CAN0, CAN_INT_RFNE0);
 
 // 配置 NVIC
 nvic_irq_enable(CAN0_RX1_IRQn, 1, 0);
 nvic_irq_enable(USBD_LP_CAN0_RX0_IRQn, 1, 0);
 }
 
 /**
 * @brief 发送 CAN 消息
 * @param tx_message 要发送的 CAN 消息结构体指针
 * @return 发送邮箱号,失败返回 CAN_TXMAILBOX0
 */
 uint8_t CAN_Send_Message(uint32_t id,uint8_t *data,uint8_t len,can_trasnmit_message_struct *tx_message)
 {
 
 static uint8_t i,mbox;
 uint16_t timeout = 100;
 tx_message->tx_efid = 0x00;
 tx_message->tx_sfid = 0x701;
 tx_message->tx_ff   = CAN_FF_STANDARD;//标准帧
 tx_message->tx_ft   = CAN_FT_DATA;//数据帧
 tx_message->tx_dlen = len;
 for(i=0;i<len;i++)
 {
 tx_message->tx_data = data;
 }
 mbox = can_message_transmit(CAN0,tx_message);                                //发送CAN报文
 while(can_transmit_states(CAN0,mbox) == CAN_TRANSMIT_PENDING)        //等待发送完成
 {
 if(timeout--)
 {
 return 2;
 }
 delay_1ms(1);
 }
 if(can_transmit_states(CAN0,mbox) == CAN_TRANSMIT_OK)
 {
 return 0;
 }
 return 1;
 
 }
 
 | 
 |