打印

GD32E503RET6can通讯

[复制链接]
135|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这里用的是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;

}

使用特权

评论回复
沙发
chenqianqian| | 2025-4-24 21:41 | 只看该作者
CAN是有过滤帧功能的,要看一下你的配置是否正确。

使用特权

评论回复
板凳
dffzh| | 2025-4-25 08:48 | 只看该作者
本帖最后由 dffzh 于 2025-4-25 08:56 编辑

1、前段时间遇到过类似问题,不过我这边是因为硬件上一主二从的拓扑结构不正确造成的,你那边的CAN拓扑是一主一从吗?2、回环测试(LOOPBACK)没问题的话,那代码上应该问题不大,建议着重仔细先分析波形吧;
3、有木有软件逻辑分析仪或CAN协议解析器也行,分析一下波形的协议格式,看对不对,类似下图:

4、方便的话,把原理图CAN通讯那块的发出来看看。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝