ARM技术william hill官网
直播中

王秀兰

7年用户 1328经验值
私信 关注
[经验]

CAN通信的收发测试步骤

这篇测试下CAN通信的收发测试,代码使用库例程中修改。

硬件部分

测试用到了CAN0、串口0和定时器1。

1> CAN0使用的接口

514.png

2> 串口0使用的接口

本计划使用PA9和PA10,PA9在原理图上被USB使用,不能正常发送,改为PA15端口

235.png

软件部分

1> main.c

主程序执行收发函数调用

#include "gd32f4xx.h"
#include "gd32f427v_start.h"
#include "systick.h"
#include <stdio.h>
#include "uart.h"
#include "can.h"
#include "led.h"
#include "timer.h"

int main(void)
{
    systick_config();
    init_uart();
    init_can();
    init_led();
    init_timer();
    while(1) 
    {
            can0_rxhdl();
            can0_txhdl();    
    }
}

2> CAN0接收函数

void CAN0_RX0_IRQHandler(void)
{
    /* check the receive message */
    can_message_receive(CAN0, CAN_FIFO0, &receive_message);
        if((0x321 == receive_message.rx_sfid)&&(CAN_FF_STANDARD == receive_message.rx_ff))
      {
            can0_receive_flag=1;
    }
}

3> CAN0发送和接收函数

void can0_txbuf(void)
{
    transmit_message.tx_data[0] = 0x2a;
    transmit_message.tx_data[1] = 0x00;
    printf("\r\n can0 transmit data:%x,%x", transmit_message.tx_data[0], transmit_message.tx_data[1]);
    /* transmit message */
    can_message_transmit(CAN0, &transmit_message);
}

void can0_txhdl(void)
{
    if(timer_can0_tx_flag==1)
    {
        timer_can0_tx_flag=0;
        can0_txbuf();
    }
}

void can0_rxhdl(void)
{
    if(can0_receive_flag==1) 
    {
        can0_receive_flag=0;
        printf("\r\n can0 receive data:%x,%x", receive_message.rx_data[0], receive_message.rx_data[1]);
    }
}

执行结果

CAN0定时1S向外发送数据,同时串口输出发送的信息,
CAN1接收到CAN工具发送的数据后,通过串口打印输出。

309.png

原作者:meijing

更多回帖

发帖
×
20
完善资料,
赚取积分