GD32F303之CAN通信

1、CAN时钟

GD32F303主时钟频率最大是120Mhz,然后APB1时钟最大是60Mhz,APB2时钟最大是120Mhz,CAN挂载在APB1总线上面

所以一般CAN的时钟频率是60Mhz,这个频率和后面配置波特率有关

2、GD32F303时钟配置

首先我们知道芯片有几个时钟

HXTAL:高速外部时钟;
LXTAL:低速外部时钟;
IRC8M:高速内部时钟;
IRC40K:低速内部时钟;

代码配置时钟时我们要确定时选择内部晶振还是外部晶振,他们配置频率都不一样,例如下面的宏定义可以配置不同的时钟频率

比如  如果定义了__SYSTEM_CLOCK_120M_PLL_IRC8M宏定义,那么芯片时钟采用内部晶振8Mhz,然后主时钟频率是120Mhz

如果定义了__SYSTEM_CLOCK_120M_PLL_HXTAL宏定义,那么芯片时钟采用外部晶振时钟,这个晶振一般都是8Mhz,但是针对不同的系列有所不一样,比如GD32F303RET6的外部晶振就是12Mhz,然后使能__SYSTEM_CLOCK_120M_PLL_HXTAL宏定义之后他的主时钟频率不是120Mhz,看代码可知   (12/2)*30不等于120Mhz,所以时钟的频率需要确定好,下面这个代码只适配外部晶振是8Mhz的。

3、CAN的波特率配置

首先我们需要知道波特率的计算公式,其中的PCLK就是CAN挂载总线APB1的时钟,一般为60Mhz,如果我们配置为下面的参数,及代表着CAN的波特率为250kbits。

  /* baudrate 250Kbps */
	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;

4、CAN通信代码

can.c

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

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,0,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); 
	LED1_ON();
}

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


main.c

	//CAN初始化
	gd32_can_init();
	transmit_message.tx_sfid = 0x7ab;
	transmit_message.tx_efid = 0x00;
	transmit_message.tx_ft = CAN_FT_DATA;//帧的类型:数据帧或者遥控帧
	transmit_message.tx_ff = CAN_FF_STANDARD;//帧的格式:标准帧或者拓展帧
	transmit_message.tx_dlen = 8;//数据长度小于8
	transmit_message.tx_data[0] = 0x55;
	transmit_message.tx_data[1] = 0x55;
	transmit_message.tx_data[2] = 0x55;
	transmit_message.tx_data[3] = 0x55;
	transmit_message.tx_data[4] = 0x55;
	transmit_message.tx_data[5] = 0x55;
	transmit_message.tx_data[6] = 0x55;
	transmit_message.tx_data[7] = 0x55;


    gd32_can_send(transmit_message);

5、USBCAN-II+的指示灯含义

如果sys 亮绿灯,则代表驱动安装成功,如果亮红灯,则表示驱动安装失败

如果CAN0或者CAN1的绿灯常亮,说明开始通信

6、CAN通信失败原因可能

(1)波特率和上位机没有一一配对

(2) CAN的时钟频率配置问题

(3)CANtest上位机如果一直出现打开设备失败,则选择使用ZCanPro上位机

(4)可以使用示波器挂一下单片机的两个输出引脚,是否有波形发出,如果有,说明软件发出了数据,然后挂载另一边,检查芯片是否有问题

(5)打开上位机然后CAN盒一直闪红灯,说明通信有问题

        问题1:错误帧一直累加,说明单片机已经发出数据帧,但是帧的内容存在问题,原因可能是上位机和单片机的波特率不匹配

        问题2:接收帧和错误帧都会累加,但是接收帧的帧ID,数据长度和内容都存在问题,原因可能是主时钟频率或者CAN频率出现问题

7、USBCAN-II+驱动下载

驱动下载 (zlg.cn)

总结:主时钟频率是程序的基础,针对和时钟有关的代码,必须将时钟频率调准再写,比如选择外部时钟源,具体是8Mhz还是12Mhz,比如选取完外部时钟源时钟分频和倍频是否正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/792110.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[图解]SysML和EA建模住宅安全系统-14-黑盒系统规约

1 00:00:02,320 --> 00:00:07,610 接下来,我们看下一步指定黑盒系统需求 2 00:00:08,790 --> 00:00:10,490 就是说,把这个系统 3 00:00:11,880 --> 00:00:15,810 我们的目标系统,ESS,看成黑盒 4 00:00:18,030 --> …

软考:软件设计师 — 2.操作系统

二. 操作系统 1. 操作系统概念 (1)操作系统的作用 操作系统是计算机硬件之上的第一层软件系统。 操作系统通常用来: 管理系统的硬件、软件、数据资源。控制程序运行。人机之间的接口。应用软件与硬件之间的接口。 可概括为: …

汽车零配件行业看板管理系统应用

生产制造已经走向了精益生产,计算时效产出、物料周转时间等问题,成为每一个制造企业要面临的问题,工厂更需要加快自动化,信息化,数字化的布局和应用。 之前的文章多次讲解了企业MES管理系统,本篇文章就为大…

HybridCLR原理中的重点总结

序言 该文章以一个新手的身份,讲一下自己学习的经过,大家更快的学习HrbirdCLR。 我之前的两个Unity项目中,都使用到了热更新功能,而热更新的技术栈都是用的HybridCLR。 第一个项目本身虽然已经集成好了热更逻辑(使用…

楼道灯微波雷达模块模组,智能感应uA级超低功耗替换红外传感器,飞睿助力绿色照明

随着科技的飞速发展,LED楼道灯早已不仅仅是照亮我们回家路的工具,它们正变得越来越智能、高效和环保。今天,就让我们一起探索LED楼道灯背后的科技——飞睿智能微波雷达模块模组,以及它如何以超低功耗(uA级别&#xff0…

信息化安全管理怎么做

企业如何做好安全管理工作?检查频次多了怕影响子正常生产经营,效益低下,检查频次少了又担心管控不住。”这是安全管理部综合业务室的困惑,也是很多企业的困惑。面对企业在安全管理中的困惑与挑战,采用信息化平台与精细化管理策略…

强烈推荐!!李沐老师《动手学深度学习》最新Pytorch版!

动手学深度学习(PyTorch版)》是由李沐、Aston Zhang和孔德威共同编写的教材,专为深度学习初学者和实践者设计。本书使用PyTorch作为主要的深度学习框架,全面系统地介绍了深度学习的基本理论、常见模型和实际应用技巧。 书中内容包括深度学习的基础知识、…

华南师范大学“大学生校外实践教学基地”授牌仪式暨见习参观活动圆满结束

为促进校企合作的深入发展,培育出具有实际应用技能的人才,7月9日,华南师范大学数学科学院与广东泰迪智能科技股份有限公司联合开展“大学生校外实践教学基地”授牌仪式暨见习参观活动。华南师范大学数学科学院数据科学系主任陈艳男、副主任陈…

物联网实训室建设可行性报告

一、建设物联网实训室的目的和意义 随着信息技术的快速发展,物联网(IoT)已成为推动社会进步和经济发展的关键技术之一。物联网技术的集成应用,不仅能够提高生产效率,还能促进智慧城市、智能家居、智能农业等多个领域的…

企业网站源码系统 自主快速搭建响应式网站 海量模版随心选择 带完整的源代码包以及搭建教程

系统概述 企业网站源码系统,是一款专为中小企业量身定制的网站建设解决方案。该系统基于先进的Web开发技术,融合了模块化设计理念和用户友好的操作界面,旨在帮助企业用户无需编程基础,即可轻松搭建出符合自身需求的响应式网站。通…

星环科技推出语料开发工具TCS,重塑语料管理与应用新纪元

5月30-31日,2024向星力未来数据技术峰会期间,星环科技推出一款创新的语料开发工具——星环语料开发工具TCS(Transwarp Corpus Studio),旨在通过全面的语料生命周期管理,极大提升语料开发效率,助…

衣服、帽子、鞋子相关深度学习数据集大合集(2)

继续为大家分享关于衣帽鞋子的深度学习数据集,主要有衣服、帽子、鞋子、短裤、短袖、T恤等。 1、人头上带着各种帽子图片数据集 数据格式:图片 是否标注:已标注 标注格式:yolov8 图片数量:1853张 数据查看地址&a…

捷配生产笔记-细间距芯片的表面处理工艺:OSP与沉金工艺的重要性

在现代电子制造领域,随着技术的进步,电子设备变得越来越小型化和高性能化。细间距芯片作为实现这一目标的关键组件,其制造工艺要求极为严格。在这些要求中,表面处理工艺尤为关键,因为它直接影响到芯片的焊接质量和长期…

叉车司机疲劳检测系统解决方案

在日益繁忙的物流仓储和工业制造领域,叉车司机的工作强度逐渐增大,疲劳驾驶的风险也随之提升。因此,我们提出了一套能够准确检测叉车司机疲劳状态的系统,以确保驾驶安全,提高工作效率。 安全监控功能主要透过三颗独立摄…

Git协作

文章目录 Git协作冲突冲突的发生情况解决冲突如何处理冲突 1 分支1.1 什么是Git分支1.2 创建分支 2 切换分支2.1 指向分支2.2 暂存分支切换分支与未提交更改的处理使用 Stash 临时保存更改Stash 的工作原理:场景设定使用 Git Stash 3 远程分支3.1 快进合并快进合并的…

亲测,爱回收严选买电脑真的靠谱

近日想买电脑,在某东的爱回收严选看到了9成新的MacBook Pro 2020,因为之前在爱回收严选买手机安全下车,所以我对这个店铺还是信任的,这次买电脑也就没有多犹豫,爱回收严选也确实没让我失望! 爱回收严选买二…

为什么大多数过来人还是建议你考一本HCIE

HCIE认证是华为推出的高级网络工程师认证。 然而,对于是否值得考取HCIE,许多人有不同的看法。 有些人质疑它的价值,但也有很多过来人强烈推荐。 今天探讨一番。为什么尽管有质疑声,许多经验丰富的老网工还是建议你考一本HCIE。 01…

MySQL的约束键多表查询

约束 概念 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。目的:保证数据中数据的正确、有效性和完整性。 外键约束 概念 ​ 外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。 注意&#x…

Autosar网络管理:发出第一帧网络管理报文的方法

Autosar网络管理:发出第一帧网络管理报文的方法 1. 为什么要第一帧发出网络管理报文 很多OEM要求CAN网络管理第一帧发出的是网络管理报文,目的是为了快速唤醒CAN网络 2. 节点外发第一帧报文不是网络管理报文的原因 首先根据AUTOSAR CANNM规范要求,节点要能够发出网络管理…

SepViT: Separable(分离式) Vision Transformer

Vision Transformers(ViT)在一系列的视觉任务中取得了显著的成功。然而,这些Transformer模型通常依赖大量的计算成本来实现高性能,这使得在资源受限的设备上部署它们变得非常困难。研究者们从深度可分离卷积(depthwise separable convolution)中汲取经验,并模仿其设计理…