这里用的是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;
}
|