IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 CAN笔记 -> 正文阅读

[嵌入式]STM32 CAN笔记

基本帧结构
在这里插入图片描述
在这里插入图片描述
CAN帧数据详细如上图所示。
1.起始位
在I2C,SPI,USART通信协议中都有起始位。通信线静默状态(无数据时),总线上的电平状态为静默状态。
表示开始就要打破静默状态,总线上的节点知道通信要开始了。启动相应的接收准备。表示帧开始传输

2.标识符 ID
在I2C协议中 发送起始位后,需要发送目标节点的地址,表示数据的归属。
在CAN中没有目标节点地址,ID代表着这条数据的归属。
例如 ,ID0x 01 表示温度。那么所有关心温度的节点都可以识别到这条消息。
根本上来说CAN的数据传输是一种广播,ID 区分了广播的数据和意义。总线上的节点根据ID来接收或者丢弃。
如果是I2C要进行广播,显然要把所有的节点的地址都发一次
同理消息ID有仲裁的消息,在I2C中一样。回读自己发送的ID,一旦不同则仲裁出局,根本上来说是线与。

3.远程传输请求
简单说就是,发起请求。有点像I2C中的read/Write。需要写数据的时候,是要携带数据的。read的时候不需要带数据,告诉对方是read。
发起请求标志。接收到这个请求的节点会回馈这个请求,发送相应的报文。

4.R1,R0
预留,以后CAN协议要扩展,先留下两个坑位,实现兼容。

5.数据长度
有效载荷 数据的长度,也就是一帧数据所携带的真正内容。

6.CRC校验
1-5步骤的数据进行CRC校验

7.ACK
ACK必定是一个非静默电平。表示有人应答。

9.EOF
结束

理解上述基本帧后,再去看扩展帧。这里不叙述扩展帧。
在这里插入图片描述
1.邮箱
为什么叫邮箱
CAN 帧的定义实际上是CAN协议的数据链路层的定义。定义了一帧数据的结构,有开头有结尾。所以收发数据的时候,按照这个定义来组包->发送,接收->解包。那么这包就是这里的帧。显然可以定义一种数据结构来表示帧数据,邮箱就是这个数据结构,而且它是硬件实现的寄存器组。多个寄存器按照CAN逻辑链路的定义组成一组。这一组就叫做一个邮箱,邮箱对应的是一帧数据。
把邮箱进行标号,就有邮箱1,邮箱2,邮箱3。邮箱之间的数据排列如果是队列形式的那么就可以叫做FIFO。用于存储接收帧的邮箱组就叫做接收FIFO。

2.筛选器
CAN传输数据是用广播的方式,所有连接在总线上的节点都可以接受到发送端的数据。
所以只要总线上有数据传输,那么就一直接收。这个时候需要判别出哪些数据时本节点需要的。
显然一般的方法是把CAN一帧的数据读进CPU,对比一下ID是不是我要。这很费事。
所以,在硬件上设计了一个对比机制,根本上解放了CPU。CPU只要处理需要的数据。
这个对比机制也就是筛选机制就是 筛选器,筛选的主体就是ID。

筛选器的根本就是队ID处理
a.完整的ID筛选
ID11位完全符合,才会接收入邮箱
b.掩码筛选
ID 与运算 掩码 =掩码 ,表示通过
当然分扩展和基础帧
在这里插入图片描述
筛选器的部分应该就没啥问题了。
在CAN模块的框图中,数据流动的箭头表示。通过筛选器的数据才会进入到接收FIFO

CAN的工作模式

有三种主要的工作模式: 初始化、 正常和睡眠。
CAN通信是广播发送,所以相对来说,每个节点都需要接收数据。
CAN不带时钟信号线,所以CAN的节点需要在每次显性电平的跳变沿进行同步和补偿。每个节点的接收模块是比较“忙的”
总线形式是所有节点都连接在一起,向一条马路一样如果有问题,会影响到整条通路的状况。
1.有节能的需求,应为CAN控制器会比较忙。
2.减少节点出错,发送错误的数据

CAN控制器
初始化状态:这个状态允许对控制寄存器进行配置
正常状态:寄存器不能进行配置
睡眠状态:节能

在这里插入图片描述
SLAK,INAK 组合用来表示当前状态
SLEEP 睡眠请求
INRQ 初始化请求

  1. ACK = 硬件通过将 CAN_MSR 寄存器的 INAK 或 SLAK 位置 1 来确认请求的等待状态
  2. SYNC = bxCAN 等待 CAN 总线变为空闲(即在 CANRX 上监测到连续 11 个隐性位)的状态
    切换的逻辑如上图所示。

发送处理

发送就是按照CAN帧的定义把相应的数据装填到 数据结构(邮箱)中。然后拍一下邮箱的屁股,说走吧
数据的装填 :标识符、数据长度代码 (DLC) 和数据本身
显然我们只能往一个空的邮箱里面写数据。
然后把 配置 TXRQ: 发送邮箱请求 (Transmit mailbox request) 就让它发送。
如果这个时候,发送正在排队,可以根据ID优先级和邮箱号的顺序进行。

在这里插入图片描述

接收处理

为了接收 CAN 消息,提供了构成 FIFO 的三个邮箱。为了节约 CPU 负载,简化软件并保证数据一致性, FIFO 完全由硬件进行管理。应用程序通过 FIFO 输出邮箱访问 FIFO 中所存储的消息。
当消息依据 CAN 协议正确接收(直到 EOF 字段的倒数第二位都没有发送错误) 并且成功通过标识符筛选后,该消息将视为有效

接收到的数据会放入接收FIFO,这个和所有带FIFO的通信模块一样,FIFO有很多状态
接收到一个消息,接收到两个,接收FIFO满了,FIFO上溢了。
都会有相应的状态寄存器表示,如果对应的中断使能打开还可以产生中断,这样CPU可以计时的介入处理任务。

中断处理

在这里插入图片描述

不得不说STM32系列为什么这么流行,他的手册写的非常好,容易理解。
上图是中断
发送中断可由以下事件产生:
— 发送邮箱 0 变为空, CAN_TSR 寄存器的 RQCP0 位置 1。
— 发送邮箱 1 变为空, CAN_TSR 寄存器的 RQCP1 位置 1。
— 发送邮箱 2 变为空, CAN_TSR 寄存器的 RQCP2 位置 1。
● FIFO 0 中断可由以下事件产生:
— 接收到新消息, CAN_RF0R 寄存器的 FMP0 位不是“00”。
— FIFO0 满, CAN_RF0R 寄存器的 FULL0 位置 1。
— FIFO0 上溢, CAN_RF0R 寄存器的 FOVR0 位置 1。
●FIFO 1 中断可由以下事件产生:
— 接收到新消息, CAN_RF1R 寄存器的 FMP1 位不是“00”。
— FIFO1 满, CAN_RF1R 寄存器的 FULL1 位置 1。
— FIFO1 上溢, CAN_RF1R 寄存器的 FOVR1 位置 1。
● 错误和状态改变中断可由以下事件产生:
— 错误状况,有关错误状况的更多详细信息,请参见 CAN 错误状态寄存器
(CAN_ESR)。
— 唤醒状况, CAN Rx 信号上监测到 SOF。
— 进入睡眠模式。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-30 19:05:27  更:2022-01-30 19:06:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:37:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码