STM32CubeIDE(CAN)

news2024/12/28 3:38:38

目录

一、概念

1、简述

2、CAN 的几种模式

二、实践

1、环回模式轮询通信

1.1 软件配置

1.2 代码编写

2、环回模式中断通信

2.1 软件配置

2.2 代码编写


一、概念

1、简述

        STM32微控制器系列包含多个型号,其中一些型号集成了CAN(Controller Area Network)控制器,使其可以直接通过硬件接口实现CAN通信。CAN总线是一种多主总线,用于实时应用,例如在汽车、工业自动化和医疗设备中进行数据通信。

2、CAN 的几种模式

        CAN(Controller Area Network)通信支持几种不同的操作模式,这些模式主要设计用于系统初始化、调试、故障检测和网络管理。

1. 正常模式(Normal Mode): 这是最常见的模式,在这种模式下,CAN节点可以发送和接收数据。所有的CAN功能都是可用的,节点可以参与总线上的数据交换,包括数据帧和远程帧的发送与接收。这是CAN总线在日常操作中最常用的模式。

2. 环回模式(Loopback Mode): 在环回模式下,节点发送的数据会被立即重定向回到同一节点的接收器。这意味着节点可以发送一个数据帧,并立即在同一节点上接收该帧,而不将其发送到总线上。这种模式主要用于测试CAN硬件和软件的正确性,因为它允许开发者检查发送的数据是否与接收的数据一致,而无需其他网络节点的参与。

3. 静默模式(Silent Mode): 在静默模式下,节点可以接收数据,但是不会向总线发送任何数据。这意味着即使在检测到总线上的数据帧或远程帧时,节点也不会进行应答或发送任何数据。静默模式通常用于监控网络活动,而不干扰网络通信。例如,在进行故障诊断时,工程师可能只想观察网络上的数据流,而不是影响它们。

4.静默环回模式(Silent Loopback Mode):它结合了静默模式和环回模式的特点,即节点既不会向总线发送数据,同时也会将发送的数据在内部进行环回,用于更细致的测试和调试目的。

二、实践

1、环回模式轮询通信

1.1 软件配置

1.2 代码编写

	if(CAN_SetFilters()==HAL_OK)
	{
		printf("ID Filter: Only Odd IDs \r\n");
	}
	if(HAL_CAN_Start(&hcan1)==HAL_OK)
	{
		printf("CAN is start \r\n");
	}
	uint8_t msgID=1;
  while (1)
  {
  	//CAN_TestPoll(msgID++,CAN_RTR_DATA);//数据帧
  	//printf("\r\n \r\n");
  	HAL_Delay(2000);
  	CAN_TestPoll(msgID++,CAN_RTR_REMOTE);//遥控帧
  	printf("\r\n \r\n");
  }
HAL_StatusTypeDef CAN_SetFilters()
{
	CAN_FilterTypeDef canFilter;
	canFilter.FilterBank=0;
	canFilter.FilterMode=CAN_FILTERMODE_IDMASK;
	canFilter.FilterScale=CAN_FILTERSCALE_32BIT;

	canFilter.FilterIdHigh =0x0020;
	canFilter.FilterIdLow = 0x0000;
	canFilter.FilterMaskIdHigh = 0x0020;
	canFilter.FilterMaskIdLow = 0x0000;

	canFilter.FilterFIFOAssignment=CAN_FILTER_FIFO0;
	canFilter.FilterActivation = CAN_FILTER_ENABLE;
	canFilter.SlaveStartFilterBank = 14;

	HAL_StatusTypeDef result = HAL_CAN_ConfigFilter(&hcan1, &canFilter);
	return result;
}

void CAN_TestPoll(uint8_t msgID, uint8_t frameType)
{
	uint8_t txData[8];
	txData[0]=msgID;
	txData[1]=msgID+11;

	CAN_TxHeaderTypeDef TxHeader;
	TxHeader.StdId=msgID;
	TxHeader.RTR=frameType;
	TxHeader.IDE=CAN_ID_STD;
	TxHeader.DLC = 2;
	TxHeader.TransmitGlobalTime =DISABLE;

	while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)<1){}

	uint32_t TxMailbox;
	if(HAL_CAN_AddTxMessage(&hcan1, &TxHeader, txData, &TxMailbox)!=HAL_OK)
	{
		printf("Send to mailbox error \r\n");
		return ;
	}

	//uint8_t tempStr[30];
	printf("Send MsgID= %d \r\n",msgID);
	while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)!=3){}

	//轮询方式接收消息
	HAL_Delay(1);
	if(HAL_CAN_GetRxFifoFillLevel(&hcan1, CAN_RX_FIFO0)!=1)
	{
		printf("Message is not received \r\n");
		return ;
	}
	printf("Message is received \r\n");

	CAN_RxHeaderTypeDef RxHeader;
	uint8_t RxData[8];
	if(HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData)==HAL_OK)
	{
		printf("StdID=%ld \r\n",RxHeader.StdId);
		printf("RTR(0=Data,2=Remote)=%ld \r\n",RxHeader.RTR);
		printf("IDE(0=Std,4=Ext)=%ld \r\n",RxHeader.IDE);
		printf("DLC(Data Length)=%ld \r\n",RxHeader.DLC);

		if(TxHeader.RTR == CAN_RTR_DATA)
		{
			printf("Data[0] = %d \r\n",RxData[0]);
			printf("Data[1] = %d \r\n",RxData[1]);
		}
	}
}

2、环回模式中断通信

2.1 软件配置

2.2 代码编写

	if(CAN_SetFilters()==HAL_OK)
	{
		printf("ID Filter: Only Odd IDs \r\n");
	}
	if(HAL_CAN_Start(&hcan1)==HAL_OK)
	{
		printf("CAN is start \r\n");
	}
	uint8_t msgID=1;
	__HAL_CAN_ENABLE_IT(&hcan1,CAN_IT_RX_FIFO0_MSG_PENDING);//使能接收中断
	__HAL_CAN_ENABLE_IT(&hcan1,CAN_IT_RX_FIFO1_MSG_PENDING);
  while (1)
  {
  	  CAN_SendMsg(msgID++,CAN_RTR_DATA);
  	  HAL_Delay(1000);
  	  printf("\r\n \r\n");
  }
HAL_StatusTypeDef CAN_SetFilters()
{
	CAN_FilterTypeDef canFilter;
	//设置FIFO0的筛选器
	canFilter.FilterBank=0;
	canFilter.FilterMode=CAN_FILTERMODE_IDMASK;
	canFilter.FilterScale=CAN_FILTERSCALE_32BIT;
	canFilter.FilterIdHigh =0x0020;
	canFilter.FilterIdLow = 0x0000;
	canFilter.FilterMaskIdHigh = 0x0020;
	canFilter.FilterMaskIdLow = 0x0000;
	canFilter.FilterFIFOAssignment=CAN_FILTER_FIFO0;
	canFilter.FilterActivation = CAN_FILTER_ENABLE;
	canFilter.SlaveStartFilterBank = 14;
	HAL_StatusTypeDef result = HAL_CAN_ConfigFilter(&hcan1, &canFilter);
	if(result!=HAL_OK)
	{
		return result;
	}
	//设置FIFO1的筛选器
	canFilter.FilterBank=1;
	canFilter.FilterIdHigh =0x0000;
	canFilter.FilterIdLow = 0x0000;
	canFilter.FilterMaskIdHigh = 0x0000;
	canFilter.FilterMaskIdLow = 0x0000;
	canFilter.FilterFIFOAssignment=CAN_FILTER_FIFO1;
	result = HAL_CAN_ConfigFilter(&hcan1, &canFilter);
	return result;
}
void CAN_SendMsg(uint8_t msgID, uint8_t frameType)
{
	CAN_TxHeaderTypeDef TxHeader;
	TxHeader.StdId=msgID;
	TxHeader.RTR=frameType;
	TxHeader.IDE=CAN_ID_STD;
	TxHeader.DLC = 4;
	TxHeader.TransmitGlobalTime =DISABLE;
	uint32_t random32bit;
	HAL_RNG_GenerateRandomNumber(&hrng,&random32bit);
	uint8_t txData[8];
	txData[0]= random32bit & 0x000000FF;
	txData[1]=(random32bit & 0x0000FF00)>>8;
	txData[2]=(random32bit & 0x00FF0000)>>16;
	txData[3]=(random32bit & 0xFF000000)>>24;
	while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)<1){}
	printf("Send MsgID = %d \r\n",msgID);
	uint32_t TxMailbox;
	if(HAL_CAN_AddTxMessage(&hcan1, &TxHeader, txData, &TxMailbox)!=HAL_OK)
	{
		printf("Send to mailbox error \r\n");
		return ;
	}
}
void CAN_ReadMsg(uint32_t FIFO_num)
{
	CAN_RxHeaderTypeDef RxHeader;
	uint8_t RxData[8];
	if(FIFO_num == CAN_RX_FIFO0)
	{
		printf("Message received by FIFO0 \r\n");
		if(HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData)!=HAL_OK)
		{
			printf("Read FIFO0 error \r\n");
			return ;
		}
	}
	else if(FIFO_num == CAN_RX_FIFO1)
	{
		printf("Message received by FIFO1 \r\n");
		if(HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO1, &RxHeader, RxData)!=HAL_OK)
		{
			printf("Read FIFO1 error \r\n");
			return ;
		}
	}
	printf("StdID=%ld \r\n",RxHeader.StdId);
	printf("RTR(0=Data,2=Remote)=%ld \r\n",RxHeader.RTR);
	printf("IDE(0=Std,4=Ext)=%ld \r\n",RxHeader.IDE);
	printf("DLC(Data Length)=%ld \r\n",RxHeader.DLC);
	printf("Data = %02X %02X %02X %02X \r\n",RxData[0],RxData[1],RxData[2],RxData[3]);
}
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
	CAN_ReadMsg(CAN_RX_FIFO0);
}

void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
	CAN_ReadMsg(CAN_RX_FIFO1);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用移动硬盘装系统里面资料会全删吗?误装系统怎么办

使用‌移动硬盘装系统是一种可行的选择&#xff0c;尤其是当你需要在多台电脑上使用相同的操作系统时。然而&#xff0c;对于初次尝试的新手来说&#xff0c;可能会有一些疑虑&#xff1a;在将移动硬盘用作系统安装盘后&#xff0c;原有的数据是否会被完全删除&#xff1f;如果…

邮件安全篇:邮件反垃圾系统运作机制简介

1. 什么是邮件反垃圾系统&#xff1f; 邮件反垃圾系统是一种专门设计用于检测、过滤和阻止垃圾邮件的技术解决方案。用于保护用户的邮箱免受未经请求的商业广告、诈骗信息、恶意软件、钓鱼攻击和其他非用户意愿接收的电子邮件的侵扰。 反垃圾系统的常见部署形式 2. 邮件反垃圾…

3GPP眼中的XR及其技术特点

3GPP R18 支持了XR Services。XR需要高数据速率和低延迟通信&#xff0c;这也真是5G可以大展身手的地方。这篇就从3GPP的角度看下XR是什么以及XR有哪些技术特点。 Extended Reality (XR) 是指由计算机技术和可穿戴设备生成的所有现实与虚拟相结合的环境和人机交互技术。 实际上…

【ELK】window下ELK的安装与部署

ELK的安装与部署 1. 下载2. 配置&启动2.1 elasticsarch2.1.1 生成证书2.1.2 生成秘钥2.1.3 将凭证迁移到指定目录2.1.4 改配置2.1.5 启动2.1.6 访问测试2.1.7 生成kibana账号 2.2 kibana2.2.1 改配置2.2.2 启动2.2.3 访问测试 2.3 logstash2.3.1 改配置2.3.2 启动 2.4 file…

SQL injection UNION attacks SQL注入联合查询攻击

通过使用UNION关键字&#xff0c;拼接新的SQL语句从而获得额外的内容&#xff0c;例如 select a,b FROM table1 UNION select c,d FROM table2&#xff0c;可以一次性查询 2行数据&#xff0c;一行是a&#xff0c;b&#xff0c;一行是c&#xff0c;d。 UNION查询必须满足2个条…

Potree在web端显示大型点云模型文件

一、克隆项目代码&#xff08;准备好上网工具&#xff0c;得先有node.js npm 环境&#xff09; git clone https://github.com/potree/potree.git二、依赖安装&#xff08;换淘宝镜像能快一些&#xff09; cd potree npm install三、运行 npm start四、使用样例 打开浏览器…

【Linux学习】常用基本指令

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a;Linux学习 目录 &#x1f308;前言&#x1f525;XShell的一些使用查看Linux主机IP使用XShell登录主机XShell下的复制粘贴 &#x1f525;Linux下常用基本指令ls指令pwd指令cd指定touch指令…

Java:115-Spring Boot的底层原理(下篇)

这里续写上一章博客&#xff08;115章博客&#xff09; SpringBoot视图技术&#xff1a; 支持的视图技术 &#xff1a; 前端模板引擎技术的出现&#xff08;jsp也是&#xff09;&#xff0c;使前端开发人员无需关注后端业务的具体实现&#xff08;jsp中&#xff0c;具体的…

Windows 如何把软件从C盘移到其他盘

不知道您有没有发现&#xff0c;当我们下载安装程序时&#xff0c;程序通常会默认自动安装在C盘驱动器中&#xff0c;如果您不手动修改路径的话&#xff0c;C盘驱动器上的可用空间将逐渐减少&#xff0c;并会在不久的将来出现 C盘已满 问题&#xff0c;这可能会导致您的电脑性能…

python实现责任链模式

把多个处理方法串成一个list。下一个list的节点是上一个list的属性。 每个节点都有判断是否能处理当前数据的方法。能处理&#xff0c;则直接处理&#xff0c;不能处理则调用下一个节点&#xff08;也就是当前节点的属性&#xff09;来进行处理。 Python 实现责任链模式&#…

【Python】sqlite加密库pysqlcipher3编译安装步骤

目录 说明准备工作openssl编译sqlite tclsetup.py修改quote_argumentopenssl路径 安装加密示例代码测试附录参考 说明 pysqlcipher3是针对Python 3使用的pysqlcipher的一个分支&#xff0c; 尽管仍然维护对Python 2的支持。它仍然处于测试阶段&#xff0c; 尽管这个库包含的最…

电脑没有摄像头怎么用手机当摄像头?虚拟摄像头使用的详细教程来了(全)

随着科技水平以及全球化经济的快速发展&#xff0c;视频会议、在线课程和直播已经成为日常办公或者生活中必不可少的一个环节。然而&#xff0c;在如今仍有许多台式电脑和一些老旧的笔记本电脑并没有内置摄像头&#xff0c;亦或者自带的摄像头质量不够理想&#xff0c;这使得视…

数据结构day5

一、思维导图 二、课后练习 1、使用循环链表完成约瑟夫环问题 2、使用栈&#xff0c;完成进制转换&#xff08;输入&#xff1a;一个整数&#xff0c;进制数&#xff0c;输出&#xff1a;该数的对应的进制数&#xff09; //头文件 #ifndef DEC_TO_BIN_H #define DEC_TO_BIN_H…

怎样使用 Juicer tools 的 dump 命令将.hic文件转换为交互矩阵matrix计数文件 (Windows)

创作日志&#xff1a; 万恶的生信…一个scHiC数据集没有提供处理好的计数文件&#xff0c;需要从.hic转换。Github一个个好长的文档看了好久才定位到 juicer tools 的dump命令&#xff0c;使用起来比想象中简单。 一、下载Juicer tools 注意&#xff1a;使用Juicer tools的前提…

Ubuntu 22.04.4 LTS (linux) Tomcat 9 内存和线程优化

1 Apache Tomcat 9.0.91 线程 #在70行左右&#xff0c;增加如下 sudo vim /data/tomcat/conf/server.xmlmaxThreads"800" #客户请求最大线程数minSpareThreads"200" #最小线程数maxSpareThreads"500" #最大线程数acceptCount"800"…

Spark RPC框架详解

文章目录 前言Spark RPC模型概述RpcEndpointRpcEndpointRefRpcEnv 基于Netty的RPC实现NettyRpcEndpointRefNettyRpcEnv消息的发送消息的接收RpcEndpointRef的构造方式直接通过RpcEndpoint构造RpcEndpointRef通过消息发送RpcEndpointRef Endpoint的注册Dispatcher消息的投递消息…

go-kratos 学习笔记(4) 服务注册与发现 nacos注册

接口实现​ Registry 接口分为两个&#xff0c;Registrar 为实例注册和反注册&#xff0c;Discovery 为服务实例列表获取 type Registrar interface {// 注册实例Register(ctx context.Context, service *ServiceInstance) error// 反注册实例Deregister(ctx context.Context…

Docker安装nacos(详细教程)

Nacos 是一个开源的动态服务发现、配置管理和服务管理平台&#xff0c;广泛用于微服务架构中。在本文章中&#xff0c;博主将详细介绍如何使用 Docker 来安装 Nacos&#xff0c;以便快速启动并运行这个强大的服务管理工具。 前置条件 在开始安装 Nacos 之前&#xff0c;请确保…

算法信息动力学中的优化公式探索

算法信息动力学中的优化公式探索 Hector Zenil,剑桥大学计算机科学家和生物技术学家,算法信息动力学提出者。学者主页:https://hectorzenil.net/ 信息最大化利用与效益优化的核心公式 算法信息动力学研究的核心在于如何通过有效处理和分析数据,结合算法优化,以实现决策过…

Android中systrace配置及注意问题

Android中systrace配置及注意问题 systrace配置的官方文档地址如下&#xff1a;优化启动时间 Systrace systrace 允许在启动期间收集内核和 Android 跟踪记录。systrace 的可视化可以帮助分析启动过程中的具体问题。&#xff08;不过&#xff0c;如果要查看整个启动过程中的平…