• STM32内置bxCAN外设(CAN控制器、拓展CAN),支持CAN2.0A和2.0B(全部的CAN),可以自动发送CAN报文和按照过滤器自动接收指定CAN报文,程序只需处理报文数据而无需关注总线的电平细节
  • 波特率最高可达1兆位/秒,高速CAN波特率为125K~1MBps,可支持高速CAN
  • 意思就是发送的时候有3个缓存区,可以存入3个待发报文,
  • 2个3级深度的接收FIFO,这是接收的缓存区,总共可以缓存2*3=6个报文
  • 14个过滤器组(互联型28个),看芯片是不是互联型,这个过滤器,就是用来过滤接收报文ID的,所有挂载在CAN总线的报文,都是广播发出来的,每个设备都能收到,各种报文都混杂在 起,都在总线上传输,但是对于某个特定的设备而言,它往往只需要接收部分ID的报文,这样我们就可以配置这个过滤器,让CAN外设,只接收我想要的报文,无关报文直接就过滤掉,这样就非常方便

  • STM32 CAN外设额外的一些特色功能:时间触发通信、自动离线恢复、自动唤醒、禁止自动重传、接收FIFO溢出处理方式可配置、发送优先级可配置、双CAN模式

一、CAN网拓扑结构

这里每个CAN节点都挂载在CAN总线上,对于其中一个CAN节点,都由CAN控制器和CAN收发器组成,CAN控制器一般集成在MCU,也就是单片机里面,然后STM32引出CAN_RX和CAN_TX引脚,与CAN收发器连接,之后CAN收发器引出CAN_High和CAN_LOW,与CAN总线相连

stm32的can就两个引脚CAN_RX、CAN_TX

二、CAN收发器电路

VCC供电必须接5V,不能接3.3V,因为协议规定,CAN_H引脚在显性电平时电压为3.5V,要是供电只有3.3V,那么CAN总线的电压,就没法符合规范了。

TXD和RXD,和左边的CAN控制器相连,T接T,R接R,不用交叉,这一点别和串口搞混了

SJA1000这个芯片,是一个独立的CAN控制器,比如如果你用一些低端的单片机,,它没有内置CAN控制器,那么就可以通过外置这个SJA1000,实现CAN通信

模块中间的R3是120Ω电阻,这个电阻就是终端电阻了,可以看到,这里每个收发器模块,自带的就有一个终端电阻,所以当两个模块相连时,正好是两个终端电阻,但是如果三个或更多模块相连,那么终端电阻就也会有3个或更多,这一点,不符合协议的要求,所以,当3个或更多收发器模块相连时,我们得把中间模块的终端电阻去掉,这才是符合协议的做法

三、STM32的CAN基本结构

发送邮箱有3个,每个邮箱可以存入一个CAN报文,如果我们想发出一个报文,那我们就把这个报文写入到其中一个空置邮箱,之后设置寄存器请求发送,就完事了,然后剩下的所有步骤,比如等待总线空闲,操作引脚输出波形,进行位同步和仲裁等等,这些步骤,全都由硬件电路自动执行,所以使用起来,其实非常简单。

接收部分的接收过滤器和2个FIFO,当CAN总线上出现一个数据帧或者遥控帧时,CAN硬件电路都会把这个报文缓存下来,至于是不是要保留这个报文,那得看它能不能通过过滤器,过滤器内,我们可以设置过滤规则,告诉硬件,我们想要什么ID的报文,如果硬件收到了这些旧的报文,就可以把它存入FIFO,如果收到的报文,无法通过任何一个过滤器,说明这个D的报文,我们并不需要,那硬件就直接就把它扔掉,别来烦我们,这样可以减轻软件的负担。然后,通过过滤器的报文会自动存入主接收FIFO 0或者主接收FIFO 1,FIFO的意思是先进先出寄存器,你也可以把它称为队列,通过过滤器的报文,要进队伍0或者队伍1里面排队,等待CPU读取,这里设计了两个队伍,每个队伍有3个邮箱,也就是最大存入3个报文,如果接收报文很快,CPU无法及时读走,那报文就可以在FIFO 0或者FIFO1里面排队,这样在一定程度上,可以避免报文丢失。

波特率计算

STM32中的位时序

计算出来的波特率一定要在高速或低速CAN总线的范围内,如果不在其范围内,则要调整。

这里的波特率就是表中的400000 bit/s

下面设置的几种模式:

  • 时间触发模式
  • 自动总线关闭管理
  • 使能唤醒
  • 自动重发模式
  • 接收FIFO锁定模式:接收的FIFO满了,新获取的数据是覆盖呢还是丢弃呢,不使能就是锁定模式:新获取数据直接丢弃
  • 发送FIFO优先级:不使能就是依次使用发送邮箱,使能就根据标识符ID进行优先发送

Test MODE  测试模式:

  • Normal:正常模式,多主机之间通信
  • Loopback:回环模式,单主机通信测试
  • Silent
  • Loopback combined with Silent

标识符ID过滤器:

某个CAN设备节点向总线发出的数据,到底是否是另一个CAN设备节点需要的数据呢?CAN外设节点使用过滤器判定是否是自己使用的数据。

stm32f103的CAN外设(互联型)有28个过滤器,非互联型有14个过滤器,所以接下来介绍一下过滤器的原理。

标识符过滤器框图:

  • 每个过滤器的核心由两个32位寄存器组成:R1[31:0]和R2[31:0]
  • FSCx:位宽设置,置0为16位, 置1为32位
  • FBMx:模式设置,置0为屏蔽模式,置1为列表模式。
  • FFAx:关联设置,置0为FIFO0, 置1为FIFO1
  • FACTx:激活设置,置0为禁用,置1为启用。

屏蔽模式就是设置某些位为1,然后传输过程中进行匹配,如果发现为1的位置但是传输的ID的相应位不是1,而是0,则直接舍弃。也就是对某几个bit位进行匹配

列表模式是要求必须完全匹配,每个bit位都要一样

屏蔽模式主要用于连续的ID的多个报文,列表模式主要用于精确某个几个报文。

扩展格式的有29位ID,所以必须使用32位模式过滤

#include "CAN_Driver.h"
#include "stm32f1xx_hal_can.h"
#include "driver_oled.h"
#include <stdio.h>
#include <string.h>
//1.配置CAN模块的接收过滤器:奇数可以通过,偶数不能能过。
int setCAN_Filter(void)
{//设置过滤器规则:CAN_FilterTypeDef canFilter;//使用哪个过滤器,stm32f103的CAN外设(互联型)有28个过滤器,非互联型有14个过滤器canFilter.FilterBank = 0;//过滤器的模式,置0为屏蔽模式,置1为列表模式。CAN_FILTERMODE_IDMASK就是0屏蔽模式canFilter.FilterMode = CAN_FILTERMODE_IDMASK;//can过滤器的长度:32位或者16位的canFilter.FilterScale = CAN_FILTERSCALE_32BIT;//设置规则://这里设置过滤规则是只要奇数,STID[0]位是高16位的第5位(从0开始算),所以这里设置0x20,看下面的设置标识符屏蔽的图片canFilter.FilterIdHigh = 0x0020;canFilter.FilterIdLow = 0x0000;//设置掩码屏蔽,高16位肯定和上面的标识符屏蔽一样都是0x20,到那时掩码要看IDE(ID扩展标志位)和RTR位(远程请求标志位),我们这个程序只是作为环回模式,自收自发,所以这两位设为1,不需要canFilter.FilterMaskIdHigh = 0x0020;canFilter.FilterMaskIdLow = 0x0006;//通过过滤器的报文放置在哪一个FIFO中:canFilter.FilterFIFOAssignment = CAN_FILTER_FIFO0;//使能FIFOcanFilter.FilterActivation = CAN_FILTER_ENABLE;//把配置好的过滤器参数设置到can模块中:HAL_CAN_ConfigFilter(&hcan,&canFilter);//启动CAN模块:HAL_CAN_Start(&hcan);vTaskDelay(10);return 0;
}//2.发送CAN报文
int CAN_sendMsg(uint32_t msgID, uint8_t* pdata, uint8_t datalen)
{//配置发送报文的格式:stdid + 数据 + RTR + IDE + DLCCAN_TxHeaderTypeDef TxHeader;TxHeader.StdId = msgID;TxHeader.RTR = 0;//数据帧TxHeader.IDE = 0; //标准帧TxHeader.DLC = datalen;//查看有没有空闲邮箱:while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0);//如果有空闲邮箱:uint32_t TxMailbox;HAL_CAN_AddTxMessage(&hcan, &TxHeader, pdata, &TxMailbox);//在OLED屏上显示一下结果:char buf[32] = {0};sprintf(buf, "sendok msgid=%d",TxHeader.StdId);OLED_PrintString(0,0, buf);vTaskDelay(100);return 0;
}//3.接收CAN报文
int CAN_recvMsg(uint8_t* pdata)
{CAN_RxHeaderTypeDef RxHeader;//判断一下接收的FIFO0中有没有数据:if(HAL_CAN_GetRxFifoFillLevel(&hcan,CAN_RX_FIFO0) == 0){//没有接收到OLED_PrintString(0,2, "msg not recv");}else{//接收到了:OLED_PrintString(0,2, "msg is recved");HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxHeader, pdata);char buf[32] = {0};sprintf(buf, "ID=%d,data=%d",RxHeader.StdId, *pdata);OLED_PrintString(0,4,buf);}vTaskDelay(100);return 0;
}

设置标识符屏蔽

STID[0]位是高16位的第6位

设置掩码

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

充电桩与照明“联动”创新:智慧灯杆破解新能源基建难题

伴随新能源汽车保有量呈现出极为迅猛的爆发式增长态势&#xff0c;充电基础设施的建设已然逐步成为城市发展进程中不可或缺的刚性需求。国家政策鼓励推进充电设施同城市基础设施展开一体化的建设工作&#xff0c;同时大力鼓励“诸如路灯、监控杆这类市政设施去整合充电相关功能…

datagrip连接mysql数据库过程以及遇到的问题

如果遇到这种错误说明时区错误&#xff0c;解决方法 jdbc:mysql://localhost:3306?serverTimezoneGMTdatagrip连接mysql数据库下一步

Vue 3.5 defineModel:让组件开发效率提升 10 倍

简介 defineModel 是 Vue 3.4 引入并在 Vue 3.5 中稳定的一个组合式 API&#xff0c;它简化了组件的双向数据绑定实现。在此之前&#xff0c;实现双向绑定需要手动定义 props 和 emits&#xff0c;而 defineModel 将这个过程自动化&#xff0c;让代码更加简洁和直观。 主要特…

性能测试-性能测试中的经典面试题一

一、核心概念与流程类性能测试的核心类型与区别负载测试&#xff1a;逐步加压&#xff0c;探测系统阈值&#xff08;如最大TPS/响应时间&#xff09;。压力测试&#xff1a;超越阈值施压&#xff0c;验证系统崩溃点及恢复能力。稳定性测试&#xff1a;80%~90%峰值压力持续运行&…

华为昇腾芯片:多模态模型国产化的硬核突破

前言 在当今数字化时代&#xff0c;人工智能技术的发展日新月异&#xff0c;多模态模型作为 AI 领域的重要发展方向&#xff0c;正逐渐改变着人们与计算机交互的方式以及众多行业的运作模式。多模态模型能够处理多种类型的数据&#xff0c;比如图像、文本、语音等&#xff0c;从…

阿里智能AI框架Playground,即学即用

Spring AI Alibaba Playground 是 Spring AI Alibaba 社区以 Spring AI Alibaba 和 Spring AI 为框架搭建的 AI 应用。包含完善的前端 UI 后端实现&#xff0c;具备对话&#xff0c;图片生成&#xff0c;工具调用&#xff0c;RAG&#xff0c;MCP 等众多 AI 相关功能。在 playg…

智能Agent场景实战指南 Day 28:Agent成本控制与商业模式

【智能Agent场景实战指南 Day 28】Agent成本控制与商业模式 文章标签 AI Agent, 成本优化, 商业模式, LLM应用, 企业级AI 文章简述 本文是"智能Agent场景实战指南"系列的第28天&#xff0c;聚焦智能Agent的成本控制与商业模式设计这一关键课题。文章首先分析了Ag…

sqli-labs:Less-8关卡详细解析

1. 思路&#x1f680; 本关的SQL语句为&#xff1a; $sql"SELECT * FROM users WHERE id$id LIMIT 0,1";注入类型&#xff1a;字符串型&#xff08;单引号包裹&#xff09;提示&#xff1a;参数id需以闭合 同样无法像常规一样回显&#xff0c;php输出语句的代码如下&…

LeetCode 1782.统计点对的数目

给你一个无向图&#xff0c;无向图由整数 n &#xff0c;表示图中节点的数目&#xff0c;和 edges 组成&#xff0c;其中 edges[i] [ui, vi] 表示 ui 和 vi 之间有一条无向边。同时给你一个代表查询的整数数组 queries 。 第 j 个查询的答案是满足如下条件的点对 (a, b) 的数…

U-Mail邮件系统-全面适配信创环境的国产邮件系统

在当今数字化时代&#xff0c;邮件系统作为企业、政府机构以及各类组织日常办公不可或缺的沟通工具&#xff0c;其安全性、稳定性以及自主可控性的重要性日益凸显。随着信创产业的蓬勃发展&#xff0c;国产邮件系统应运而生&#xff0c;成为保障信息安全、推动数字化转型的关键…

【LeetCode 热题 100】394. 字符串解码

Problem: 394. 字符串解码 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的&#xff1b;输入字符串中没有…

Activity之间互相发送数据

activity_send_data_req.xml<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_pare…

设计模式:访问者模式 Visitor

目录前言问题解决方案结构代码前言 访问者是一种行为设计模式&#xff0c;它能将算法与其所作用的对象隔离开来。 问题 假如你的团队开发了一款能够使用巨型图像中地理信息的应用程序。 图像中的每个节点既能代表复杂实体&#xff08;例如一座城市&#xff09;&#xff0c; 也…

OpenCV 学习探秘之四:从角点检测,SIFT/SURF/ORB特征提取,目标检测与识别,Haar级联分类人脸检测,再到机器学习等接口的全面实战应用与解析

书接上回&#xff0c;前面介绍了一些基本应用&#xff0c;本篇则着重介绍一些比较复杂的应用。 附&#xff1a;本文所用例子中使用的Opencv库OpenCV4.5.4版本编译好的库 五、特征提取与描述 5.1 角点检测&#xff1a;Harris 角点和 Shi-Tomasi 角点 5.1.1 Harris 角点检测&a…

《秋招在即!Redis数据类型面试题解析》

博客主页&#xff1a;天天困啊系列专栏&#xff1a;面试题关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Redis中常见的基础数据结构总共五种&#xff1a;这五种类型分别为String&#xff…

政务网站内容检测系统对错敏信息有什么作用

政务网站内容检测系统在错敏信息管理中发挥着重要作用&#xff0c;能够有效提升政府网站的信息安全性与合规性。以下从错敏信息的作用及蚁巡政务信息巡查系统的功能特点两方面进行说明。一、政务网站内容检测系统对错敏信息的作用1、实时监测与识别内容检测系统通过智能化技术对…

Tower of Hanoi 汉诺塔

题目描述The Tower of Hanoi game consists of three stacks (left, middle and right) and n round disks of different sizes. Initially, the left stack has all the disks, in increasing order of size from top to bottom. The goal is to move all the disks to the r…

在 Docker 中启动 Nginx 并挂载配置文件到宿主机目录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 在 Docker 中启动 Nginx 并挂载配置文件到宿主机目录前言一、创建宿主机目录存放 Nginx 配置1.1 在宿主机&#xff08;如 Windows 或 Linux&#xff09;上创建目录&#xff0…

认识ansible(入门)

什么是ansible&#xff1f;Ansible是一款自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible是基于模块…

Apache Ignite 关于 **Executor Service(执行器服务)** 的介绍

这段内容是 Apache Ignite 关于 Executor Service&#xff08;执行器服务&#xff09; 的介绍。我们可以把它理解为&#xff1a;一个分布式的“线程池”&#xff0c;可以把任务分发到集群中的多个节点上去执行。 下面我用通俗易懂的方式帮你彻底理解这个概念。&#x1f310; 什…