GD32F30x系列---CAN通信收发配置

这篇具有很好参考价值的文章主要介绍了GD32F30x系列---CAN通信收发配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

GD32F30x系列CAN通信配置:
先找到CAN模块时钟时挂载在APB1总线上的,如下图所示:gd32 can配置,GD32F30x开发,stm32,单片机,mcu
APB1总线的最大频率为60MHz,如下图所示:gd32 can配置,GD32F30x开发,stm32,单片机,mcu
根据总线频率可以计算出对应波特率的配置BS1,BS2等;gd32 can配置,GD32F30x开发,stm32,单片机,mcu
如果不会计算的话也可以直接使用工具,如下图所示:gd32 can配置,GD32F30x开发,stm32,单片机,mcu
这里工具会直接帮你你计算好BS1、BS2、PRE等参数,并且在改参数的配置下其出错的概率和采样准确率等,可以提高其开发效率。

另外需要注意的是,GD32F30x系列的CAN通信出错率会进行计数,当出错计数值达到255时CAN会进入离线状态,并且CAN发送和接收都会失效,所以当总线不稳定的情况下需要注意CAN是否进入离线状态以及需要恢复CAN功能。gd32 can配置,GD32F30x开发,stm32,单片机,mcu
1、创建can.c 和can.h文件并放到对应的文件夹中,如下图所示:gd32 can配置,GD32F30x开发,stm32,单片机,mcu
2、将创建好的can.c文件以及gd32f30x_can.c 和gd32f30x_dbg.c文件添加到项目中,如下图所示:
添加这个文件gd32f30x_dbg.c是由于gd32f30x_can.c文件中调用了调试相关函数,为了不修改库函数相关文件,所以可以将两个文件都添加进项目中。gd32 can配置,GD32F30x开发,stm32,单片机,mcu
3、完成CAN模块的初始化以及发送函数,中断接收等。

//can.c文件
#include "can.h"

/*
	CAN 通信初始化
*/
void gd32_can_init(void)
{
	can_parameter_struct	can_parameter;
    can_filter_parameter_struct can_filter;
	/* initialize CAN register */
    can_deinit(CAN0);
    /* enable CAN clock */
    rcu_periph_clock_enable(RCU_CAN0);
    rcu_periph_clock_enable(RCU_GPIOA);//使能时钟

    gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ,GPIO_PIN_11);
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_12);//IO复用为CAN功能
  
    /* configure CAN0 NVIC */
    nvic_irq_enable(CAN0_RX1_IRQn,3,0); //中断配置

    can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
    can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);//初始化参数
  /* baudrate 250Kbps */
	can_parameter.time_segment_1 = CAN_BT_BS1_14TQ;
	can_parameter.time_segment_2 = CAN_BT_BS2_1TQ;
	can_parameter.prescaler = 15;
    /* initialize CAN */
    can_init(CAN0, &can_parameter);
	
	can_filter.filter_fifo_number = CAN_FIFO1;
    can_filter.filter_enable = ENABLE;
    can_filter_init(&can_filter);
	 /* enable can receive FIFO0 not empty interrupt */
    can_interrupt_enable(CAN0, CAN_INT_RFNE1|CAN_INT_TME);

}

/*
	CAN通信数据发送
		can_frame---要发送的数据
	发送成功返回0,失败返回1 
*/
uint8_t gd32_can_send(can_trasnmit_message_struct can_frame)
{  
	uint8_t ret=0;
	ret = can_message_transmit(CAN0,&can_frame);
	if(ret == CAN_NOMAILBOX)
	{
		return 1;
	}
  	return 0;
}

/*
	CAN出错--重启CAN
*/
void gd32_can_error(void)
{
	if(	can_flag_get(CAN0, CAN_FLAG_MTE2) != RESET ||
		can_flag_get(CAN0, CAN_FLAG_MTE0) != RESET ||
		can_flag_get(CAN0, CAN_FLAG_MTE1) != RESET || 
		can_flag_get(CAN0, CAN_FLAG_PERR) != RESET ||
		can_flag_get(CAN0, CAN_FLAG_WERR) != RESET)
	{
		can_flag_clear(CAN0, CAN_FLAG_MTE0);
		can_flag_clear(CAN0, CAN_FLAG_MTE1);
		can_flag_clear(CAN0, CAN_FLAG_MTE2);
		can_flag_clear(CAN0, CAN_FLAG_PERR);
		can_flag_clear(CAN0, CAN_FLAG_WERR);
		can_wakeup(CAN0);
		gd32_can_init();
	}
}

/*
	CAN接收中断函数
*/
void CAN0_RX1_IRQHandler(void)
{
	can_receive_message_struct can_mes;
	memset(&can_mes,0,sizeof(can_mes)); 
	can_message_receive(CAN0, CAN_FIFO1, &can_mes); 
}

//can.h文件
#ifndef __CAN_H__
#define __CAN_H__

#include "gd32f30x.h"
#include "string.h"

void gd32_can_init(void);
uint8_t gd32_can_send(can_trasnmit_message_struct can_frame);
void gd32_can_error(void);

#endif

4、在main.c文件main函数中调用CAN的初始化,并循环往外发送CAN数据,编译下载程序到硬件板,如下图所示:
gd32 can配置,GD32F30x开发,stm32,单片机,mcu
下载后运行程序,连接好CAN工具和CAN收发助手可以看到CAN助手中每隔1S接收到一条CAN报文,接收的数据与程序发送的数据一致,如下图所示:gd32 can配置,GD32F30x开发,stm32,单片机,mcu
使用CAN助手工具向硬件板中发送1条CAN报文,在CAN接收中断中设置断点,并获取CAN接收到的数据与发送的数据对比,如下图所示:gd32 can配置,GD32F30x开发,stm32,单片机,mcu
GD32F30x系列CAN通信接收与发送数据都正常,说明CAN通信配置成功。文章来源地址https://www.toymoban.com/news/detail-803675.html

到了这里,关于GD32F30x系列---CAN通信收发配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GD32F103 硬件SPI通信

    SPI既可以做主机也可以做从机。 当做主机时。MOSI,SCK,CS都是作为输出。 而作为从机时。MOSI,SCK,CS都是作为输入。  所以SPI的硬件电路应该实现这样的功能。 1. GD32框图 如下图做主机的数据流向:   如下图做从机的数据流向:    2. STM32框图  通过一些寄存器的配置来控制

    2024年02月02日
    浏览(43)
  • stm32f407单片机上通过HAL库实现can总线数据的收发

      最近在使用can总线,由于这个以前接触的比较少,所以调试代码的时候直接是下载的正点原子的例程,在这个基础上修改调试的。现在将调试中遇到的问题,总结一下,避免以后踩坑。目前写了一个查询方式的,一个中断方式的。项目代码下载地址: https://download.csdn.n

    2024年02月09日
    浏览(54)
  • STM32的CAN通信的收发库函数解读

    STM32的CAN通信的收发函数: CAN发送消息结构体定义:        当需要使用CAN发送报文时,先定义一个上面发送类型的结构体,然后把报文的内容按成员赋值到该结构体中,最后调用库函数CAN_Transmit把这些内容写入到发送邮箱即可把报文发送出去。  CAN接收消息结构体定义:

    2024年02月07日
    浏览(38)
  • 野火STM32电机系列(三)Cubemx配置CAN通信

    CAN接口: PI9 PB9 1.配置CAN 通信参数 由于F4的 CAN外设挂载在APB1上,时钟配置后APB1的时钟速率为42MHz,目标通信速率为1000KHz,由公式: BaudRate = 1/NominalBitTime NominalBitTime = 1tq + tBS1 +tBS2 设置参数如下: CAN时钟分频参数为7,BS1为4,BS2为1,CAN模式为Nomal模式。 生成工程 在can.c中添加

    2024年02月11日
    浏览(48)
  • STM32+Cube mx hal库实现CAN通信收发实验

          关于CAN通信的入门教程和基本原理在其他博主发的文章里面都有介绍,笔者只是简单记录下学习过程,文章用到的是正点原子的阿波罗F429开发板,另一个设备是中盛科技的继电器模块(CAN版)。       实现之前看一下继电器模块相关信息          发送数据的格式官方文

    2024年02月16日
    浏览(44)
  • GD32f303之rs485配置

            rs485是一种硬件通信接口,USART引脚的TTL电平通过SP485芯片转换为差分信号,+2V~+6V表示\\\"0\\\",- 6V~- 2V表示\\\"1\\\"。RS485有两线制和四线制两种接线,四线制是全双工通讯方式,本文采用两线制半双工通讯方式。

    2024年02月13日
    浏览(50)
  • 【STM32】STM32F103C8T6串口通信,实现3个串口收发数据

    串口通信(Serial Communications)实现单片机与电脑或者其它外设进行通信,通信时只需两根线(TX,RX)就可以实现数据传输。STM32f103有三个串口,分别为串口1(RX PA10, TX PA 9),串口2(RX PA3,TX PA2),串口3(RX PB11,TX PB10)。 以下代码是配置三个串口: usart.c usart.h main.c 注意,

    2024年02月12日
    浏览(53)
  • GD32F470之网络lwip+UDP配置+lan8720芯片

    先申明,本栏目用的都是GD32F470芯片240M,软件用的是keil,编写用的是C++(其实和C没有区别). 和STM32的lwip配置大致一样,主要不一样的地方在于 PHY的配置顺序问题,下面会讲到. 我用的是lan8720,所以头文件要修改一下,在gd32f4xx_enet.h中。 把PHY_TYPE改为LAN8700, PHY_ADDRESS改为0, 这是

    2023年04月09日
    浏览(49)
  • GD32 SPI DMA收发

    由于需求用到GD32 SPI, 故做相关实验记录分享,本实验为 SPI DMA 发送与接收 16bit 数据, GD32 相关配置如下 GD32 F30x系列 DMA配置如下   SPI DMA 发:使用SPI0,对应的DMA为0 Channel 2。  注意打开 对应 DMA 与 SPI 相关时钟, DMA write 使用时需要先拉低 NSS,发送结束,拉高NSS SPI DMA 收

    2024年02月13日
    浏览(47)
  • [GD32F4]基于GD32固件库移植cherryusb[STM32F4]

    [GD32F4]基于GD32固件库移植cherryusb[STM32F4] 使用开发板是淘宝买的不知名开发板,没什么好说的,具体的型号是GD32F450VET6。 使用的cherryusb版本是0.9.0版本。 使用的GD32官方固件库版本是:GD32F4xx_Firmware_Library_V3.0.4 cherryusb最牛的地方在于抛弃掉所有的依赖,只需要知道芯片的usb中断

    2024年02月06日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包