初学stm32 --- CAN

目录

CAN介绍

CAN总线拓扑图

CAN总线特点

CAN应用场景

CAN物理层

CAN收发器芯片介绍

 CAN协议层

数据帧介绍

CAN位时序介绍 

数据同步过程

硬件同步

 再同步

CAN总线仲裁

STM32 CAN控制器介绍

CAN控制器模式

 CAN控制器模式

 CAN控制器框图

发送处理

接收处理

 接收过滤器

CAN控制器位时序

CAN相关寄存器介绍(F1 / F4 / F7)

CAN主控制寄存器(CAN_MCR)

CAN位时序寄存器(CAN_BTR)

CAN 标识符寄存器(CAN_(T/R)IxR)

数据长度和时间戳寄存器(CAN_(T/R)DTxR)

 CAN低位数据寄存器(CAN_(T/R)DLxR)

 CAN高位数据寄存器(CAN_(T/R)DHxR)

 CAN过滤器位宽寄存器(CAN_FS1R)

CAN 过滤器FIFO关联寄存器(CAN_FFA1R)

CAN 过滤器组x寄存器(CAN_FxR(1/2))

CAN相关HAL库驱动介绍

CAN外设相关重要结构体:

结构体成员与寄存器情况

CAN基本驱动步骤

过滤器组设置实例:


CAN介绍

        CAN(Controller Area Network),是ISO国际标准化的串行通信协议

        为了满足汽车产业的“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需求。

        低速CAN(ISO11519)通信速率10~125Kbps,总线长度可达1000

        高速CAN(ISO11898)通信速率125Kbps~1Mbps,总线长度≤40米(经典CAN)

        CAN FD 通信速率可达5Mbps,并且兼容经典CAN,遵循ISO 11898-1 做数据收发

        更多CAN的历史知识,可以上CAN in Automation(CiA) 官网了解。

CAN总线拓扑图

         终端电阻,用于阻抗匹配,以减少回波反射

        CAN总线由两根线( CANL CANH )组成,允许挂载多个设备节点(低速CAN:20 高速CAN:30)。

CAN总线特点

  1)多主控制                  每个设备都可以主动发送数据

  2)系统的柔软性           没有类似地址的信息,添加设备不改变原来总线的状态

  3)通信速度                  速度快,距离远

  4)错误检测&错误通知&错误恢复功能

  5)故障封闭                  判断故障类型,并且进行隔离

  6)连接节点多              速度与数量找个平衡

CAN应用场景

        CAN总线协议已广泛应用在汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。

CAN物理层

        CAN使用差分信号进行数据传输,根据CAN_HCAN_L上的电位差来判断总线电平。

        总线电平分为显性电平(逻辑0)和隐性电平(逻辑1),二者必居其一。

        显性电平具有优先权发送方通过使总线电平发生变化,将消息发送给接收方

电平

高速CAN

低速CAN

显性电平(0

UCAN_H – UCAN_L=  2V

UCAN_H – UCAN_L = 3V

隐性电平(1

UCAN_H – UCAN_L = 0V

UCAN_H – UCAN_L = - 1.5V

CAN收发器芯片介绍

 CAN协议层

          CAN总线以“帧”形式进行通信。CAN协议定义了5种类型的帧:数据帧、遥控帧、错误帧、过载帧、间隔帧,其中数据帧最为常用。

数据帧介绍

        数据帧由7段组成。数据帧又分为标准帧(CAN2.0A)和扩展帧(CAN2.0B),主要体现在仲裁段和控制段。

CAN位时序介绍 

        CAN总线以“位同步”机制,实现对电平的正确采样。位数据都由四段组成:同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每段又由多个位时序Tq组成。

        注意 : 节点监测到总线上信号的跳变在SS段范围内,表示节点与总线的时序是同步,此时采样点的电平即该位的电平。

        采样点是指读取总线电平,并将读到的电平作为位值的点。

        根据位时序,就可以计算CAN通信的波特率。

数据同步过程

        由于时钟频率误差、传输上的相位延迟引起偏差,所以需要数据同步

        CAN为了实现对总线电平信号的正确采样,数据同步分为硬件同步和再同步。

硬件同步

        节点通过CAN总线发送数据,一开始发送帧起始信号。总线上其他节点会检测帧起始信号在不在位数据的SS段内,判断内部时序与总线是否同步。

        假如不在SS段内,这种情况下,采样点获得的电平状态是不正确的。所以,节点会使用硬件同步方式调整, 把自己的SS段平移到检测到边沿的地方,获得同步,同步情况下,采样点获得的电平状态才是正确的。

 再同步

        再同步利用普通数据位的边沿信号(帧起始信号是特殊的边沿信号)进行同步。

        再同步的方式分为两种情况:超前和滞后,即边沿信号与SS段的相对位置。

        再同步时,PSB1和PSB2中增加或者减少的时间被称为“再同步补偿宽度(SJW)”,其范围:1~4 Tq

          限定了SJW值后,再同步时,不能增加限定长度的SJW值。SJW值较大时,吸收误差能力更强,但是通讯速度会下降。

        

CAN总线仲裁

决定优先级

        CAN总线处于空闲状态,最先开始发送消息的单元获得发送权。

        多个单元同时开始发送时,从仲裁段(报文ID)的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送,即首先出现隐性电平的单元失去对总线的占有权变为接收。

        

         竞争失败单元,会自动检测总线空闲,在第一时间再次尝试发送。

STM32 CAN控制器介绍

        STM32 CAN控制器(bxCAN),支持CAN 2.0ACAN 2.0B Active版本协议。

        CAN 2.0A 只能处理标准数据帧且扩展帧的内容会识别错误,而CAN 2.0B Active 可以处理标准数据帧和扩展数据帧。CAN 2.0B Passive只能处理标准数据帧且扩展帧的内容会忽略。

bxCAN主要特点:

   波特率最高可达1M bps

   支持时间触发通信(CAN的硬件内部定时器可以在TX/RX的帧起始位的采样点位置生成时间戳)

   具有3级发送邮箱

   具有3级深度的2个接收FIFO

   可变的过滤器组(最多28个)(F1只有14个)

CAN控制器模式

        CAN控制器的工作模式有三种:初始化模式、正常模式和睡眠模式。

 CAN控制器模式

CAN控制器的测试模式有三种:静默模式、环回模式和环回静默模式。(初始化模式下进行配置

 CAN控制器框图

 1CAN内核

        包含各种控制/状态/配置寄存器,可以配置模式、波特率等

2)发送邮箱

        用来缓存待发送的报文,最多可以缓存3个报文

3)接收FIFO

        缓存接收到的有效报文

4)接收过滤器

        筛选有效报文

发送处理

接收处理

 接收过滤器

        当总线上报文数据量很大时,总线上的设备会频繁获取报文,占用CPU。过滤器的存在,选择性接收有效报文,减轻系统负担。

        每个过滤器组都有两个32位寄存器CAN_FxR1CAN_FxR2。根据过滤器组的工作模式(位宽和选择模式)不同,寄存器的作用不尽相同。

        选择模式可设置屏蔽位模式标识符列表模式,寄存器内容的功能就有所区别。

        屏蔽位模式,可以选择出一组符合条件的报文。寄存器内容功能相当于是否符合条件。

        标识符列表模式,可以选择出几个特定ID的报文。寄存器内容功能就是标识符本身。

        REG中bit值代表的是匹配与否:1必须匹配 0不用关心

        屏蔽位寄存器中位值为1,表示与ID要必须匹配;位值为0,表示可不与ID匹配。

        在使能过滤器情况下,总线上广播的报文ID与过滤器的配置都不匹配,CAN控制器会丢弃该报文,不会进入到接收FIFO中。

        注意:标识符选择位IDE和帧类型RTR需要一致。不同过滤器组的工作模式可以设置为不同。

CAN控制器位时序

STM32CAN外设位时序分为三段:

        同步段 SYNC_SEG、        时间段1 BS1(PTS + PBS1、        时间段2 BS2

STM32F103,设TS1=8TS2=7BRP=3,波特率 = 36000 / [( 9 + 8 + 1 ) * 4] = 500Kbps

STM32F407,设TS1=6TS2=5BRP=5,波特率 = 42000 / [( 7 + 6 + 1 ) * 6] = 500Kbps

  注意:通信双方波特率需要一致才能通信成功。

CAN相关寄存器介绍(F1 / F4 / F7)

CAN主控制寄存器(CAN_MCR

 INRQ位,用于控制初始化请求。

CAN位时序寄存器(CAN_BTR

 STM32F103,设TS1=8TS2=7BRP=3,波特率 = 36000 / [( 9 + 8 + 1 ) * 4] = 500Kbps

CAN 标识符寄存器(CAN_(T/R)IxR

 x范围:1~3,3个发送邮箱                x范围:1~2,2个接收FIFO邮箱

         报文使用标准标识符,EXID[17:0]值无效

        TxRQ位置1,请求邮箱发送

        注意:报文使用扩展标识符时,STID[10:0]等效于EXID[28:18],与EXID[17:0]组成29位扩展标识符。

        

数据长度和时间戳寄存器(CAN_(T/R)DTxR

 x范围:1~3,3个发送邮箱                x范围:1~2,2个接收FIFO邮箱

        注意:DLC是多少,数据内容就有多少字节被发送,并不是每次都发送8个字节数据。

 CAN低位数据寄存器(CAN_(T/R)DLxR

 CAN高位数据寄存器(CAN_(T/R)DHxR

使用时间戳功能DLC必须为8字节

CAN过滤器模式寄存器(CAN_FM1R

 CAN过滤器位宽寄存器(CAN_FS1R

        注意:CAN外设只能使用的有的过滤器组,不能使用没有的过滤器组。 

CAN 过滤器FIFO关联寄存器(CAN_FFA1R

该寄存器决定了哪个FIFO寄存器有效(即RIxRRDTxRRDLxRRDHxR的‘x) 

CAN 过滤器组x寄存器(CAN_FxR(1/2)

CAN相关HAL库驱动介绍

CAN外设相关重要结构体:

CAN_InitTypeDefCAN_FilterTypeDefCAN_(T/R)xHeaderTypeDef

CAN_InitTypeDefuint32_t Prescaler			/* 预分频 */
uint32_t Mode				/* 工作模式 */
uint32_t SyncJumpWidth		/* 再次同步跳跃宽度 */
uint32_t TimeSeg1			/* 时间段1(BS1)长度 */
uint32_t TimeSeg2			/* 时间段2(BS2)长度 */
uint32_t TimeTriggeredMode	/* 时间触发通信模式 */
uint32_t AutoBusOff			/* 总线自动关闭 */
uint32_t AutoWakeUp			/* 自动唤醒 */
uint32_t AutoRetransmission 	/* 自动重传 */
uint32_t ReceiveFifoLocked		/* 接收FIFO锁定 */
uint32_t TransmitFifoPriority	/*  传输FIFO优先级 */
CAN_FilterTypeDefuint32_t FilterIdHigh			/* ID高字节 */
uint32_t FilterIdLow			/* ID低字节 */
uint32_t FilterMaskIdHigh	 	/* 掩码高字节 */
uint32_t FilterMaskIdLow		/* 掩码低字节 */
uint32_t FilterFIFOAssignment	/* 过滤器关联FIFO */
uint32_t FilterBank			/* 选择过滤器组 */
uint32_t FilterMode			/* 过滤器模式*/
uint32_t FilterScale			/* 过滤器位宽 */
uint32_t FilterActivation		/* 过滤器使能 */
Uint32_t SlaveStartFilterBank 	/* 从CAN选择启动过滤器组 单CAN没有意义*/

结构体成员与寄存器情况

 

CAN基本驱动步骤

1CAN参数初始化

        工作模式、波特率等        HAL_CAN_Init

2、使能CAN时钟和初始化相关引脚

        GPIO模式设为复用功能模式        HAL_CAN_MspInit

3、设置过滤器

        HAL_CAN_ConfigFilter 完成过滤器的初始化

4CAN数据接收和发送

        HAL_CAN_AddTxMessage 发送消息

        HAL_CAN_ GetRxMessage 接收数据

5、使能CAN相关中断/设置NVIC/编写中断服务函数

        __HAL_CAN_ENABLE_IT (可选)

过滤器组设置实例:

 

关于CAN中断 

        启用 CAN 接收 FIFO0 消息挂起中断

__HAL_CAN_ENABLE_IT(&g_can_handle_struct, CAN_IT_RX_FIFO0_MSG_PENDING);
  • __HAL_CAN_ENABLE_IT:这是 STM32 HAL 库提供的一个宏,用于启用 CAN 外设的中断。
  • CAN_IT_RX_FIFO0_MSG_PENDING:这个参数表示启用 CAN 接收 FIFO0 消息挂起中断
    • 当 CAN 接收 FIFO0 中有新的消息并且该消息已经准备好时,控制器会触发一个中断,允许外部应用程序处理接收到的消息。
    • FIFO(先进先出队列)用于存储接收到的 CAN 消息,FIFO0 是第一个 FIFO 队列,STM32 的 CAN 控制器通常有多个 FIFO 队列。

是的,您的理解是正确的。进入挂起中断后,您可以读取 can_rxheader_struct.StdId,因为当 CAN 控制器收到数据并通过过滤器后,会将其存放到 FIFO 队列中。中断会在 FIFO 中有新消息时触发,并通过 HAL 函数 HAL_CAN_GetRxMessage 将数据读取出来。

详细解释:

1. CAN 接收机制概述
  • CAN 总线是一个广播式协议,当总线上有设备发送消息时,所有连接的设备都能接收到这条消息。
  • 过滤器:CAN 控制器通常配置了过滤器来筛选感兴趣的消息,只有经过过滤器允许的消息才会被接收并存储到接收 FIFO 中。STM32 的 CAN 控制器可以通过配置多个过滤器来选择哪些消息应当接收。
  • FIFO 队列:接收到的有效消息会被存储到接收 FIFO(如 FIFO0)。消息排队存储,等待被中断服务程序处理。
2. 中断触发

当接收到一条消息,并且通过了过滤器的检查后,消息就会被存储到 FIFO 中。此时,如果启用了接收中断(例如通过 CAN_IT_RX_FIFO0_MSG_PENDING),并且 FIFO 中有新消息,CAN 中断会被触发

3. 读取接收的消息
  • 在进入中断处理函数 USB_LP_CAN1_RX0_IRQHandler 后,您可以通过 HAL_CAN_GetRxMessage 函数读取接收到的消息,并将消息的相关信息(如标识符)和数据存储到相应的结构体中。
  • 读取的消息头信息(如 StdIdIDERTRDLC 等)通常存储在 CAN_RxHeaderTypeDef 结构体中
4. 总结
  • 数据是被动接收的:当总线上有数据并且经过了过滤器的过滤,符合条件的消息会被存储到 FIFO 中。
  • 进入中断后,可以读取 can_rxheader_struct.StdId:一旦中断被触发,您可以通过 HAL_CAN_GetRxMessage 读取消息的标识符和数据,标识符信息存储在 can_rxheader_struct.StdId 中。
  • 过滤器的作用:过滤器用于筛选总线上接收到的消息,只有符合条件的消息才会存放到 FIFO 中,并触发中断。

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

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

相关文章

OpenHarmony 4.1 SDK11 北向应用开发笔记

目录 声明 1、开启其他应用 2、延时切换页面 3、设置页面切换效果 4、设置背景图片和背景铺满屏幕 5、设置隐藏状态和导航条 6、设置组件大小和对齐方式 7、设置按钮类型改变按钮边框圆角半径 8、常用布局方式 9、布局技巧 声明 本笔记基于OpenHarmony 4.1 SDK11&am…

leetcode707-设计链表

leetcode 707 思路 本题也是用了虚拟头节点来进行解答,这样的好处是,不管是头节点还是中间的节点都可以当成是中间节点来处理,用同一套方法就可以进行处理,而不用考虑太多的边界条件。 下面题目中最主要的实现就是添加操作addA…

高效实现 Markdown 转 PDF 的跨平台指南20250117

高效实现 Markdown 转 PDF 的跨平台指南 引言 Markdown 文件以其轻量化和灵活性受到开发者和技术写作者的青睐,但如何将其转换为易于分享和打印的 PDF 格式,是一个常见需求。本文整合了 macOS、Windows 和 Linux 三大平台的转换方法,并探讨…

汽车网络信息安全-ISO/SAE 21434解析(上)

目录 概述 第四章-概述 1. 研究对象和范围 2. 风险管理 第五章-组织级网络安全管理 1. 网络安全治理(cybersecurity governance) 2. 网络安全文化(cybersecurity culture) 3. 信息共享(Information Sharing) 4. 管理体系…

计算机网络 (50)两类密码体制

前言 计算机网络中的两类密码体制主要包括对称密钥密码体制(也称为私钥密码体制、对称密码体制)和公钥密码体制(也称为非对称密码体制、公开密钥加密技术)。 一、对称密钥密码体制 定义: 对称密钥密码体制是一种传…

PCL K4PCS算法实现点云粗配准【2025最新版】

目录 一、算法原理1、算法概述2、算法流程3、参考文献二、 代码实现1、原始版本2、2024新版三、 结果展示本文由CSDN点云侠原创,原文链接,首发于:2020年4月27日。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 博客长期更新,本文最近一次更新时间为…

消息队列实战指南:三大MQ 与 Kafka 适用场景全解析

前言:在当今数字化时代,分布式系统和大数据处理变得愈发普遍,消息队列作为其中的关键组件,承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品&#xff0…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)边缘检测

OpenCV中边缘检测四种常用算子: (1)Sobel算子 Sobel算子是一种基于梯度的边缘检测算法。它通过对图像进行卷积操作来计算图像的梯度,并将梯度的大小作为边缘的强度。它使用两个3x3的卷积核,分别用于计…

C语言编程笔记:文件处理的艺术

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、为什么要用文件二、文件的分…

头歌答案--爬虫实战

目录 urllib 爬虫? 第1关:urllib基础 任务描述 第2关:urllib进阶? 任务描述 requests 爬虫 第1关:requests 基础 任务描述 第2关:requests 进阶 任务描述 网页数据解析 第1关:XPath解析网页? 任务描述…

【JavaEE】Spring Web MVC

目录 一、Spring Web MVC简介 1.1 MVC简介1.2 Spring MVC1.3 RequestMapping注解1.3.1 使用1.3.2 RequestMapping的请求设置 1.3.2.1 方法11.3.2.2 方法2 二、Postman介绍 2.1 创建请求2.2 界面如下:2.3 传参介绍 一、Spring Web MVC简介 官方文档介绍&#xff…

Sqlmap入门

原理 在owasp发布的top10 漏洞里面,注入漏洞一直是危害排名第一,其中数据库注入漏洞是危害的。 当攻击者发送的sql语句被sql解释器执行,通过执行这些恶意语句欺骗数据库执行,导致数据库信息泄漏 分类 按注入类型 常见的sql注入…

RabbitMQ基础篇

文章目录 1 RabbitMQ概述1.1 消息队列1.2 RabbitMQ体系结构 2 RabbitMQ工作模式2.1 简单模式(Simple Queue)2.2 工作队列模式(Work Queues)2.3 发布/订阅模式(Publish/Subscribe)2.4 路由模式(R…

javaEE初阶————多线程初阶(2)

今天给大家带来第二期啦,保证给大家讲懂嗷; 1,线程状态 NEW安排了工作还未开始行动RUNNABLE可工作的,或者即将工作,正在工作BLOCKED排队等待WAITING排队等待其他事TIMED_WAITING排队等待其他事TERMINATED工作完成了 …

于灵动的变量变幻间:函数与计算逻辑的浪漫交织(下)

大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 这一节我们主要来学习单个函数的声明与定义,static和extern… 这里写目录标题 一、单个函数…

【数据分析】02- A/B 测试:玩转假设检验、t 检验与卡方检验

一、背景:当“审判”成为科学 1.1 虚拟场景——法庭审判 想象这样一个场景:有一天,你在王国里担任“首席审判官”。你面前站着一位嫌疑人,有人指控他说“偷了国王珍贵的金冠”。但究竟是他干的,还是他是被冤枉的&…

HTML应用指南:利用GET请求获取全国特斯拉充电桩位置

随着电动汽车的普及,充电基础设施的建设变得至关重要。作为电动汽车领域的先驱,特斯拉不仅在车辆技术创新上持续领先,还积极构建广泛的充电网络,以支持其不断增长的用户群体。为了提升用户体验和服务质量,开发人员和数…

【原创】大数据治理入门(2)《提升数据质量:质量评估与改进策略》入门必看 高赞实用

提升数据质量:质量评估与改进策略 引言:数据质量的概念 在大数据时代,数据的质量直接影响到数据分析的准确性和可靠性。数据质量是指数据在多大程度上能够满足其预定用途,确保数据的准确性、完整性、一致性和及时性是数据质量的…

OpenVela——专为AIoT领域打造的开源操作系统

目录 一、系统背景与开源 1.1. 起源 1.2. 开源 二、系统特点 2.1. 轻量化 2.2. 标准兼容性 2.3. 安全性 2.4. 高度可扩展性 三、技术支持与功能 3.1. 架构支持 3.2. 异构计算支持 3.3. 全面的连接套件 3.4. 开发者工具 四、应用场景与优势 4.1. 应用场景 4.2. …

寒假1.18

web(报错注入) [第一章 web入门]SQL注入-2 题解: 打开是个403界面,还以为没开成 通过题目提示,访问/login.php /user.php 合在一起访问屁都没有,分开访问,/login.php回显: /user.p…