meijing · 2022年12月19日 · 河南

【GD32F427开发板试用】 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

推荐阅读
关注数
10711
内容数
187
中国高性能通用微控制器领域的领跑者兆易创新GD系列芯片技术专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息