这篇测试下CAN通信的收发测试,代码使用库例程中修改。
硬件部分
测试用到了CAN0、串口0和定时器1。
1> CAN0使用的接口
2> 串口0使用的接口
本计划使用PA9和PA10,PA9在原理图上被USB使用,不能正常发送,改为PA15端口
软件部分
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工具发送的数据后,通过串口打印输出。