打印
[研电赛技术支持]

CAN通讯实现1ms发送3帧+gd32f470

[复制链接]
197|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Zuocidian|  楼主 | 2025-5-7 22:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本例子是在GD32f470芯片上实现的,通过配置CAN1初始化和发送函数,500k最大限度实现1ms发送3帧报文。

一、CAN1初始化

void Can1_Init(uint32_t baud,uint8_t MasterSlave)
{
        can_parameter_struct        can_parameter;
    can_filter_parameter_struct can_filter;
        /* initialize CAN register */
        rcu_periph_clock_enable(RCU_CAN1);
       
        can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
    can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);//Initialization parameters
       
        can_deinit(CAN1);
       
        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      = ENABLE;
    can_parameter.working_mode          = CAN_NORMAL_MODE;
       
        if(baud == 125)
        {
                //CAN baud AP1_60MHz/(20*(4+16+4))=125kHz
                can_parameter.resync_jump_width = CAN_BT_SJW_4TQ;
                can_parameter.time_segment_1 = CAN_BT_BS1_16TQ;
                can_parameter.time_segment_2 = CAN_BT_BS2_4TQ;
                can_parameter.prescaler = 20;
        }
        else if(baud == 250)
        {
                //CAN Baud AP1_60MHz/(15*(1+14+1))=250kHz
                can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
                can_parameter.time_segment_1 = CAN_BT_BS1_14TQ;
                can_parameter.time_segment_2 = CAN_BT_BS2_1TQ;
                can_parameter.prescaler = 15;
        }
        else if(baud == 500)
        {
                //CAN baud AP1_60MHz/(15*(1+6+1))=250kHz
                can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
                can_parameter.time_segment_1 = CAN_BT_BS1_6TQ;
                can_parameter.time_segment_2 = CAN_BT_BS2_1TQ;
                can_parameter.prescaler = 15;
        }
        else if(baud == 1000)
        {
                //CAN baud AP1_60MHz/(15*(1+2+1))=1000kHz
                can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
                can_parameter.time_segment_1 = CAN_BT_BS1_2TQ;
                can_parameter.time_segment_2 = CAN_BT_BS2_1TQ;
                can_parameter.prescaler = 15;
        }
       
    /* initialize CAN */
    can_init(CAN1, &can_parameter);

    /* initialize filter */
    /* CAN0 filter number */
    can_filter.filter_number = 15;

    /* initialize filter */
    can_filter.filter_mode = CAN_FILTERMODE_MASK;
    can_filter.filter_bits = CAN_FILTERBITS_32BIT;
        if(MasterSlave == 0) //Master
        {
                can_filter.filter_list_high = 0x0000;
                can_filter.filter_list_low = 0x0000;
                can_filter.filter_mask_high = 0x0000;
                can_filter.filter_mask_low = 0x0000;
        }
        else if(MasterSlave == 1) //Slave
        {
                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_FIFO1;
    can_filter.filter_enable = ENABLE;
    can_filter_init(&can_filter);
       
        can_interrupt_enable(CAN1, CAN_INTEN_RFNEIE1);
       
         /* configure CAN1 NVIC */
    nvic_irq_enable(CAN1_RX1_IRQn, 6, 0);
}


二、CAN1发送函数

//CAN1修改
int SendByCan1(unsigned int std,void* data,const int len)
{
        can_trasnmit_message_struct TxMessage = {0};//Define Send Message Structure
       
        volatile uint32_t i = 0;
        uint8_t TransmitMailbox = 0;

        TxMessage.tx_sfid = std;
        TxMessage.tx_efid = std;
        TxMessage.tx_ft =CAN_FT_DATA;                    //Set the frame type of the message to be transmitted: data frame
    TxMessage.tx_ff =CAN_FF_EXTENDED;           //Extended identifier
        TxMessage.tx_dlen = (len> 8)?8:len;
       
    volatile uint8_t *psrc = (uint8_t*)data;
    for(i=0; i<len; i++)
        {
        TxMessage.tx_data[i] = psrc[i];
    }
       
        TransmitMailbox = can_message_transmit(CAN1,&TxMessage);//Start the transmission of a message
       
        i = 0;
        while((i<0XFFF))
    {
        if(can_transmit_states(CAN1,TransmitMailbox) == 1)break;
        i++;   
    }
        if(i < 0XFFF)
        {
                return 0;
        }
        else
        {
                return -1;
        }
}



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_37822396/article/details/147744684

使用特权

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

本版积分规则

46

主题

120

帖子

0

粉丝