STM32CubeIDE(CAN)

目录

一、概念

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);
}

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

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

相关文章

如何在 Mac 上下载安装植物大战僵尸杂交版? 最新版本 2.2 详细安装运行教程问题详解

植物大战僵尸杂交版已经更新至2.2了&#xff0c;但作者只支持 Windows、手机等版本并没有支持 MAC 版本&#xff0c;最近搞到了一个最新的杂交 2.2 版本的可以在 Macbook 上安装运行的移植安装包&#xff0c;试了一下非常完美能够正常在 MAC 上安装运行&#xff0c;看图&#x…

菜鸟从0学微服务——MyBatis-Plus

关于“菜鸟从0学微服务” 针对有编程基础&#xff0c;开始学习微服务的同学&#xff0c;我们陆续推出从0学微服务的笔记分享。力求从各个中间件的使用来反思这些中间件的作用和优势。 会分享的比较快&#xff0c;会记录demo演算和中间件的使用过程&#xff0c;至于细节的理论…

SSIS_SQLITE

1.安装 SQLite ODBC 驱动程序 2.添加SQLite数据源 在“用户DSN”或“系统DSN”选项卡中&#xff0c;点击“添加”。选择“SQLite3 ODBC Driver”&#xff0c;然后点击“完成”。在弹出的配置窗口中&#xff0c;设置数据源名称&#xff08;DSN&#xff09;&#xff0c;并指定S…

k8s核心知识总结

写在前面 时间一下子到了7月份尾&#xff1b;整个7月份都乱糟糟的&#xff0c;不管怎么样&#xff0c;日子还是得过啊&#xff0c; 1、7月份核心了解个关于k8s&#xff0c;iceberg等相关技术&#xff0c;了解了相关的基础逻辑&#xff0c;虽然和数开主线有点偏&#xff0c;但是…

二、【Python】入门 - 【PyCharm】安装教程

往期博主文章分享文章&#xff1a; 【机器学习】专栏http://t.csdnimg.cn/sQBvw 目录 第一步&#xff1a;PyCharm下载 第二步&#xff1a;安装&#xff08;点击安装包打开下图页面&#xff09; 第三步&#xff1a;科学使用&#xff0c;请前往下载最新工具及教程&#xff1a…

FreeSWITCH 1.10.10 简单图形化界面26-在网页上播放SIP设备视频

​ FreeSWITCH 1.10.10 简单图形化界面26-在网页上播放SIP设备视频 1、前言2、大概流程3、测试环境4、安装流媒体服务器5、设置流媒体服务器接口6、简单写个web接口7、测试一下1、web播放在线播放器1在线播放器2本地video控件 2、vlc播放vlc播放rtmpvlc播放rtsp 8、总结 1、前…

Jmeter三种方式获取数组中多个数据并将其当做下个接口参数入参【附带JSON提取器和CSV格式化】

目录 一、传统方式-JOSN提取器获取接口返回值 1、接口调用获取返回值 2、添加JSON提取器 3、调试程序查看结果 4、添加循环控制器 5、设置count计数器 6、添加请求 7、执行请求 二、CSV参数化 1、将结果写入后置处理程序 2、设置循环处理器 3、添加CSV文件 4、设置…

前端面试项目细节重难点分享(十三)

面试题提问&#xff1a;分享你最近做的这个项目&#xff0c;并讲讲该项目的重难点&#xff1f; 答&#xff1a;最近这个项目是一个二次迭代开发项目&#xff0c;迭代周期一年&#xff0c;在做这些任务需求时&#xff0c;确实有很多值得分享的印象深刻的点&#xff0c;我讲讲下面…

【中项】系统集成项目管理工程师-第5章 软件工程-5.3软件设计

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

设计模式|观察者模式

观察者模式是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时&#xff0c;它的所有观察者都会收到通知并更新。观察者模式常用于实现事件处理系统、发布-订阅模式等。在项目中&#xff0c…

【spring boot】初学者项目快速练手

项目视频&#xff1a;一小时带你从0到1实现一个SpringBoot项目开发_哔哩哔哩_bilibili 注解视频&#xff1a;10、Java高级技术&#xff1a;注解&#xff1a;认识注解_哔哩哔哩_bilibili 一、基础知识 1.注解Annotation &#xff08;1&#xff09;定义 注解是Java代码里的特…

Wordpress安装到win10(2024年7月)

目录 1.wordpress介绍 2下载应用 2.1.wordpress 2.2XAMPP 2.3 PHPmyadmin 3.配置应用 3.1XAMPP进程 3.2 文件配置 3.3 phpmyadmin配置 4.配置网页 4.1 数据库创建 4.2 安装wordpress 5.进入面板 6.总结 1.wordpress介绍 WordPress是一个开源内容管理系统&#xff0…

Node.js知识点总结

Node.js知识点总结 Node.js其本质和浏览器一样是一个JavaScript运行环境。浏览器的运行环境为V8引擎浏览器内置API&#xff08;BOM、DOM、Canvas);而node.js的运行环境是V8引擎node提供的API(fs、path、http)。它使JavaScript可以编写后端。 基本知识 fs文件系统模块 它提供一…

C语言·分支和循环语句(超详细系列·全面总结)

前言&#xff1a;Hello大家好&#x1f618;&#xff0c;我是心跳sy&#xff0c;为了更好地形成一个学习c语言的体系&#xff0c;最近将会更新关于c语言语法基础的知识&#xff0c;今天更新一下分支循环语句的知识点&#xff0c;我们一起来看看吧~ 目录 一、什么是语句&#xf…

剪画小程序:短视频搬运必备!去除视频字幕!

在这个人人都自媒体的盛世&#xff0c;新人想要创作爆款视频那里难上加难&#xff0c;所以搬运视频就成了很多新手自媒体人的不二选择。 搬运优质内容成为许多人的需求。但原视频中的字幕往往成为困扰大家的难题。 你是否曾为了搬运一个精彩的短视频&#xff0c;却因为无法去除…

gitee设置ssh公钥密码避免频繁密码验证

gitee中可以创建私有项目&#xff0c;但是在clone或者push都需要输入密码&#xff0c; 比较繁琐。 公钥则可以解决该问题&#xff0c;将私钥放在本地&#xff0c;公钥放在gitee上&#xff0c;当对项目进行操作时带有的私钥会在gitee和公钥进行验证&#xff0c;避免了手动输入密…

CTF-Web习题:[GXYCTF2019]Ping Ping Ping

题目链接&#xff1a;[GXYCTF2019]Ping Ping Ping 解题思路 访问靶机&#xff0c;得到如下页面&#xff0c;类似于URL参数 尝试用HackBar构造url传输过去看看 发现返回了ping命令的执行结果&#xff0c;可以猜测php脚本命令是ping -c 4 $ip&#xff0c;暂时不知道执行的函数…

【Android】数据存储方案——文件存储、SharedPreferences、SQLite数据库用法总结

文章目录 文件存储存储到文件读取文件 SharedPreferences存储存储获取SharedPreferences对象Context 类的 getSharedPreferences() 方法Activity 类的 getPreferences() 方法PreferenceManager 类中的 getDefaultSharedPreferences() 方法 示例 读取记住密码的功能 SQLite数据库…

通信协议_C#实现CAN通信

CAN协议 CAN&#xff08;Controller Area Network&#xff09;即控制器局域网络。特点&#xff1a; 多主网络&#xff1a;网络上的任何节点都可以主动发送数据&#xff0c;不需要一个固定的主节点。双绞线&#xff1a;使用双绞线作为通信介质&#xff0c;支持较远的通信距离。…

挑战房市预测领头羊:KNN vs. 决策树 vs. 线性回归

挑战房市预测领头羊&#xff08;KNN&#xff0c;决策树&#xff0c;线性回归&#xff09; 1. 介绍1.1 K最近邻&#xff08;KNN&#xff09;&#xff1a;与邻居的友谊1.1.1 KNN的基础1.1.2 KNN的运作机制1.1.3 KNN的优缺点 1.2 决策树&#xff1a;解码房价的逻辑树1.2.1 决策树的…