stm32之I2C通信外设

news2024/11/28 13:39:39

系列文章目录

1. stm32之I2C通信协议
2. stm32之软件I2C读写MPU6050陀螺仪、加速度传感器应用案例
3. stm32之硬件I2C读写MPU6050陀螺仪、加速度传感器应用案例


文章目录

  • 系列文章目录
  • 前言
  • 一、I2C通信外设
    • 1.1 I2C外设简介
    • 1.2 软件模拟和硬件外设对比
  • 二、I2C外设电路结构
    • 2.1 I2C框图
    • 2.2 I2C基本结构
  • 三、I2C外设时序
    • 3.1 主机发送
      • 3.1.1 起始信号生成 (EV5)
      • 3.1.2 发送从机地址和方向位 (EV6)
      • 3.1.3 清除ADDR标志位 (EV8_1)
      • 3.1.4 发送数据 (EV8)
      • 3.1.5 发送最后一个字节数据
      • 3.1.6 生成停止信号 (EV8_2)
    • 3.2 主机接收
      • 3.2.1 起始信号生成 (EV5)
      • 3.2.2 发送从机地址和方向位 (EV6)
      • 3.2.3 清除ADDR标志位 (EV6_1)
      • 3.2.4 接收数据 (EV7)
      • 3.2.5 接收最后一个字节数据
      • 3.2.6 停止信号生成 (EV7_1)


前言

提示:本文主要用作在学习江科大自化协STM32入门教程后做的归纳总结笔记,旨在学习记录,如有侵权请联系作者

本文主要探讨stm32之I2C外设相关概念以及基本结构等,最后详细地分析了I2C外设的读写时序。


一、I2C通信外设

1.1 I2C外设简介

STM32内部集成了硬件I2C收发电路,能够自动完成时钟生成、起始和终止条件生成、应答位收发以及数据传输等功能,从而大幅减轻CPU的负担。它支持多主机模式,并兼容7位和10位地址模式。此外,I2C通信支持多种速度选项,包括标准模式(最高100 kHz)和快速模式(最高400 kHz)。STM32还支持通过DMA进行数据传输,并且兼容SMBus协议。

以STM32F103C8T6为例,其硬件I2C资源包括I2C1和I2C2。

1.2 软件模拟和硬件外设对比

特性软件模拟 I2C硬件外设 I2C
灵活性高,可以使用任意 GPIO 引脚低,仅限于特定的硬件引脚
效率低,需占用 CPU 资源高,硬件自动管理,释放 CPU 资源
时序精度较低,受软件控制,易受中断影响高,硬件管理,时序精确稳定
调试难度低,容易插入调试信息高,硬件时序难以直接干预
实现复杂度简单,容易实现和修改复杂,需理解和配置硬件寄存器
支持 DMA不支持支持,可实现高效数据传输
多主设备支持手动实现,难度较高硬件支持,自动处理仲裁
可靠性较低,易受中断和其他任务干扰高,时序稳定,错误检测能力强

软件模拟 I2C: 适用于需要高灵活性、硬件资源有限或者对 I2C 速率要求不高的场合。特别适用于简单的 I2C 通信或者开发阶段需要频繁调试和修改时序的场景。

硬件外设 I2C: 适用于需要高效、稳定和可靠的 I2C 通信,特别是在多任务系统或需要高速数据传输的场合。如果 MCU 有空闲的 I2C 外设,优先选择硬件实现。

二、I2C外设电路结构

2.1 I2C框图

下图所示为STM32内部 I2C外设结构图。

在这里插入图片描述

首先,下图所示左边这里是这个外设的通信引脚SDA和SCL,红圈部分就是数据控制电路,这里数据收发的核心部分是这里的数据寄存器和移位寄存器。当我们需要发送数据时,可以把一个字节数据写到数据寄存器DR,当移位寄存器没有数据移位时,这个数据寄存器的值就会进一步转到移位寄存器里。在移位的过程中我们就可以直接把下一个数据放到数据寄存器里等着了,一旦前一个数据移位完成,下一个数据就可以无缝衔接继续发送。当数据由数据寄存器转到移位寄存器时就会置状态寄存器的TXE位为1表示发送寄存器为空,这就是发送的流程。

那在接收时也是这一路,输入的数据一位一位地从引脚移入到移位寄存器里,当一个字节的数据收齐之后,数据就整体从移位寄存器转到数据寄存器,同时置标志位RXNE表示接收寄存器非空,这时我们就可以把数据从数据寄存器读出来了。

在这里插入图片描述

ok,那到这里数据的收发就讲完了,至于什么时候收什么时候发就需要我们写入控制寄存器对应的位来进行操作了。对于起始条件、终止条件以及应答位什么的这里也都有控制电路可以完成,至于具体实现细节这里也没画出来,大家知道有电路帮我们完成这些工作就行了。

简而言之就是,对于SDA收发数据这块内容,我们只需要掌握数据寄存器和移位寄存器配合的这部分就行了。

然后我们继续看下面SCL这部分。时钟控制,是用来控制SCL线的,至于控制的细节这里也没画你就把它当作一个黑盒子就行了,在这个时钟控制寄存器写对应的位电路就会执行对应的功能。控制逻辑电路也是黑盒子,写入控制寄存器可以对整个电路进行控制,读取状态寄存器可以得知电路的工作状态。然后是中断,当内部有一些标志位置1之后可能事件比较紧急就可以申请中断,如果我们开启了这个中断,那当这个事件发生后程序就可以跳到这个中断函数来处理这个事件了。最后是DMA请求与响应。在进行很多字节的收发时可以配合DMA来提高效率。

在这里插入图片描述

2.2 I2C基本结构

接下来我们看一下I2C的基本结构图。

首先,移位寄存器和数据寄存器DR的配合是通信的核心部分。因为I2C是高位先行,所以这个移位寄存器是向左移位,在发送的时候最高位先移出去,然后是次高位等等。一个SCL时钟移位一次,移位8次就能把一个字节由高位到低位依次放到SDA线上了。那在接收的时候,数据通过GPIO口从右依次移进来,最终移8次,一个字节就接收完成了。

GPIO口这里,使用硬件I2C的时候这两个对应的GPIO口都要配置成复用开漏输出的模式。复用,就是GPIO口的状态是交由片上外设来控制的,开漏输出,这是I2C协议要求的端口配置。

在这里插入图片描述

然后SCL这里,时钟控制器通过GPIO去控制时钟线,上图简化成一主多从的模型了,所以时钟这里只画了输出的方向。

再看一下SDA这里,输出数据通过GPIO输出到端口,输入数据也是通过GPIO输入到移位寄存器。

然后是数据控制器,这是黑盒模型,没啥可说的。

最后,还是有个开关控制,也就是I2C_Cmd,配置好了就使能外设,外设就能正常工作了。

三、I2C外设时序

接下来,我们来看一下硬件I2C的操作流程,在这里我们只讨论主机发送和主机接收的流程,从机的部分就暂时先不讨论了。

在STM32F103C8T6中,当使用I2C外设进行7位地址模式下的主发送时,通信过程遵循特定的时序,并在各关键步骤产生相应的事件,下面我们就来分析一下主发送模式下的时序以及各个事件的触发过程吧。

3.1 主机发送

在这里插入图片描述

3.1.1 起始信号生成 (EV5)

  • 步骤:主机通过设置I2C_CR1寄存器中的START位生成起始信号(Start condition)。
  • 事件 (EV5):当起始条件在I2C总线上生成后,I2C_SR1寄存器中的SB(Start Bit)标志位会被置位。此时,表示总线处于活动状态,起始条件已经成功发送。

EV5事件描述:SB=1,读SR1然后将地址写入DR寄存器将清除该事件

在这里插入图片描述在这里插入图片描述

3.1.2 发送从机地址和方向位 (EV6)

  • 步骤:在EV5事件发生后,主机将7位从机地址与方向位(RW=0表示写)发送到I2C总线上。
  • 事件 (EV6):当从机地址和方向位成功发送并且从机发送应答(ACK)信号时,I2C_SR1寄存器中的ADDR标志位会被置位,标志着地址传输已完成,从机已响应。

EV6事件描述:ADDR=1,读SR1然后读SR2将清除该事件

在这里插入图片描述

3.1.3 清除ADDR标志位 (EV8_1)

  • 步骤:为了继续通信,必须读取I2C_SR1寄存器,然后读取I2C_SR2寄存器来清除ADDR标志位。清除该标志后,通信流程可以继续,准备发送数据。
  • 事件 (EV8_1):EV8_1事件的产生其实就是为了清除EV6事件,为接下来写入数据作准备,写入DR寄存器该事件将被清除。

EV8_1事件描述:TxE=1,移位寄存器空,数据寄存器空,写DR寄存器

3.1.4 发送数据 (EV8)

  • 步骤:主机将要发送的数据字节写入I2C_DR寄存器中。
  • 事件 (EV8):每当I2C_DR寄存器中的数据被移送至移位寄存器并且I2C_DR寄存器空闲时,I2C_SR1寄存器中的TXE(Transmit Data Register Empty)标志位会被置位。这表明可以写入下一个字节的数据。

EV8事件描述:TxE=1,移位寄存器非空,数据寄存器空,写入DR寄存器将清除该事件

在这里插入图片描述

3.1.5 发送最后一个字节数据

  • 步骤:如果启用了自动应答功能(即ACK使能),并且是最后一个数据字节,那么在发送最后一个字节时,BTF(Byte Transfer Finished)标志位会被置位,表示字节传输已经完成,且所有数据已经发送。

3.1.6 生成停止信号 (EV8_2)

  • 步骤:在所有数据发送完毕后,主机可以通过设置I2C_CR1寄存器中的STOP位来生成停止条件(Stop condition),从而结束通信并释放总线。
  • 事件 (EV8_2):在生成停止条件后,I2C通信结束,总线释放。

EV8_2事件描述:TxE=1,BTF=1,请求设置停止位,TxE和BTF位由硬件在产生停止条件时清除

在这里插入图片描述

3.2 主机接收

同样,这里有7位地址和10位地址的主接收,我们只讲7位地址的。

在这里插入图片描述

3.2.1 起始信号生成 (EV5)

  • 步骤:主机通过设置I2C_CR1寄存器中的START位来生成起始信号(Start condition)。
  • 事件(EV5):当起始条件在总线上生成后,I2C_SR1寄存器中的SB(Start Bit)标志位会被置位。这标志着起始信号已经成功发送,并且总线处于活动状态。

EV5事件描述:SB=1,读SR1然后将地址写入DR寄存器将清除该事件

在这里插入图片描述在这里插入图片描述

3.2.2 发送从机地址和方向位 (EV6)

  • 步骤:在EV5事件发生后,主机将从机地址和方向位(读/写)发送到I2C总线上。在7位地址模式下,从机地址左移一位,并将最低位设置为1以指示读方向。
  • 事件 (EV6):当从机地址成功发送并且从机发回应答(ACK)时,I2C_SR1寄存器中的ADDR标志位会被置位。这标志着从机地址传输已完成,并且从机已经响应。

EV6事件描述:ADDR=1,读SR1然后读SR2将清除该事件

在这里插入图片描述

3.2.3 清除ADDR标志位 (EV6_1)

  • 步骤:为了继续通信,必须读取I2C_SR1和I2C_SR2寄存器来清除ADDR标志位。清除后,通信流程可以继续,准备接收数据。
  • 事件 (EV6_1):清除ADDR标志位后准备接收数据。

EV6_1事件描述:没有对应的事件标志,只适于接收一个字节的情况,恰好在EV6之后(即清除了ADDR之后),要清除响应和停止条件的产生位

3.2.4 接收数据 (EV7)

  • 步骤:主机开始接收从机发送的数据。每接收到一个字节的数据,I2C_SR1寄存器中的RXNE(Receive Data Register Not Empty)标志位会被置位。
  • 事件 (EV7):RXNE标志位被置位时,表示I2C_DR寄存器中的数据已准备好被读取。此时,主机可以读取I2C_DR寄存器来获取接收到的数据。

EV7事件描述:RxNE=1,读DR寄存器清除该事件

在这里插入图片描述

3.2.5 接收最后一个字节数据

  • 步骤:如果当前接收的是最后一个字节数据,主机需要在接收前将I2C_CR1寄存器中的ACK位清除(ACK=0),这会导致主机在接收完最后一个字节后发送一个非应答(NACK)信号给从机,表示数据接收结束。

在这里插入图片描述

3.2.6 停止信号生成 (EV7_1)

  • 步骤:当所有数据接收完毕后,主机需要生成停止信号(Stop condition)来释放I2C总线。通过设置I2C_CR1寄存器中的STOP位,主机会自动生成停止条件。
  • 事件 (EV7_1):在产生停止条件后,I2C通信结束,I2C总线释放。

EV7_1事件描述:RxNE=1,读DR寄存器清除该事件,设置ACK=0和STOP请求

在这里插入图片描述

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

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

相关文章

【数据结构-二维前缀异或和】【分区算法优化】力扣1738. 找出第 K 大的异或坐标值

给你一个二维矩阵 matrix 和一个整数 k &#xff0c;矩阵大小为 m x n 由非负整数组成。 矩阵中坐标 (a, b) 的 目标值 可以通过对所有元素 matrix[i][j] 执行异或运算得到&#xff0c;其中 i 和 j 满足 0 < i < a < m 且 0 < j < b < n&#xff08;下标从 …

IP网络广播系统(IP网络广播系统是什么及它的优势与应用)

一、引言 在当今数字化的时代&#xff0c;音频传播技术也在不断革新。IP网络广播系统作为一种先进的音频传输解决方案&#xff0c;正逐渐在各个领域发挥重要作用。那么&#xff0c;究竟什么是IP网络广播系统呢&#xff1f;它又有着怎样独特的优势和广泛的应用呢&#xff1f;本…

1、Django Admin学习模型

此专栏应用环境和模型基于此文 开发环境 系统&#xff1a;windows11 开发工具&#xff1a;vscode 开发语言&#xff1a;python 3.8 开发框架&#xff1a;django 3.2 数据库&#xff1a;mysql8.4.1 项目目录 settings 注册两个应用 INSTALLED_APPS [django.contrib.ad…

免下载看视频,使用极空间部署P2P磁力种子流媒体服务器『TorrServer』

免下载看视频&#xff0c;使用极空间部署P2P磁力种子流媒体服务器『TorrServer』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 说到在NAS上的观影体验&#xff0c;很多小伙伴的理解可能就是先下载到本地&#xff0c;然后在使用播放器打开观看。今天为大家分享另外一种观影方式&a…

JS设计模式之“语言之魂” - 原型模式

前言 当我们学习JavaScript的时候&#xff0c;经常会听到原型&#xff08;prototype)、原型链&#xff08;prototype chain&#xff09;和原型模式&#xff08;prototype pattern&#xff09;这些概念&#xff0c;它们之间有什么关联呢&#xff1f;怎么样才能使用好原型模式呢…

linux 硬件 arm架构

一.ARM&#xff1a; 1.时钟晶振&#xff1a; 在单片机系统里晶振的作用非常大&#xff0c;他结合单片机内部的电路&#xff0c;产生单片机所必须的时钟频率&#xff0c;单片机的一切指令的执行都是建立在这个基础上的&#xff0c;晶振的提供的时钟频率越高&#xff0c;那单片机…

Valley14.2免授权php跨境电商在线商城

6Valley 14.2 Nulled – 多供应商电子商务 – 完整的电子商务移动应用程序、Web、卖家和管理面板 后台可自定义收款&#xff0c;和翻译多国语言&#xff0c;中文需要自己对比翻译&#xff01;一般用不到中文。毕竟是跨境电商平台 带商家即时通讯&#xff0c;全套带文档和APP双端…

DReg-NeRF: Deep Registration for Neural Radiance Fields论文解读

目录 一、导言 二、NeRF2NeRF 三、相关工作 1、神经辐射场 2、点云配准 3、NeRF配准 四、DReg-NeRF 1、NeRF神经辐射场查询 2、特征提取 3、transformer 4、Decoder 五、损失函数 一、导言 该论文来自于ICCV2023&#xff0c;主要提到一种DReg-NeRF的配准方法&#…

SQL 数据查询

文章目录 3.4.1 单表查询定义特点单表无条件查询单表带条件查询对查询结果进行排序限制查询结果数量 3.4.2 分组查询定义特点&#xff1a;聚集函数GROUP BY短语HAVING子句分组查询小结 3.4.3 连接查询定义特点&#xff1a;等值连接与非等值连接查询自然连接&#xff08;内连接&…

全局安装react

1、首先安装react脚手架 npm install -g create-react-app2、创建react项目 create-react-app my-app3、 PS D:\桌面\papers\subject> create-react-app my-react-appCreating a new React app in D:\桌面\papers\subject\my-react-app.Installing packages. This might …

基于vue框架的超市订单管理系统16uob(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;员工,商品分类,商品信息,供货商,入库订单,销售订单,货架信息,盈利信息 开题报告内容 基于Vue框架的超市订单管理系统开题报告 一、研究背景与意义 随着信息技术的飞速发展和电子商务的普及&#xff0c;传统超市管理模式正面临前所未有…

wsl2 安装qt5

sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator -ysudo apt-get install build-essential libfontconfig1 mesa-common-dev -y "qt5-default"从Ubuntu 21.04 存储库中就缺少了该软件包&#xff0c;后续会不会添加暂时未知。 在…

SpringBoot日志使用:Slf4j与Logback

步骤一&#xff1a;引入lombok即可&#xff0c;lombok自带Slf4j注解&#xff08;网上说不用引入api的依赖&#xff0c;若报错可添加&#xff09; <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version&…

数据访问:JPA

文章目录 JPA的由来JPA是什么Spring Data JPA快速上手 JPA的由来 ORM框架能够将Java对象映射到关系型数据库中&#xff0c;能够直接持久化复杂的 Java对象。ORM框架的出现&#xff0c;可以让开发者从数据库编程中解脱出来&#xff0c;把更多的精力放在业务模型与业务逻辑上。目…

Open3D 计算投影的点云的尺寸

目录 一、概述 1.1实现步骤 1.2应用场景 二、代码实现 三、实现效果 3.1原始点云 3.2投影后点云 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概述 在 Open3D 中&…

electron-vite打包出错

问题&#xff1a;1 electron-vite 安装&#xff0c; 打包下载资源失败&#xff0c;设置国内镜像 由于electron默认打包会从github上下载相关二进制包&#xff0c;众所周知&#xff0c;国内GitHub访问是相当慢的&#xff0c;所以经常会出现下载失败导致打包不成功&#xff0c;…

中兴-ZSRV2路由器-任意文件读取

中兴-ZSRV2路由器-任意文件读取 文章目录 中兴-ZSRV2路由器-任意文件读取免责声明漏洞描述搜索语法漏洞复现修复建议 免责声明 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与教学之用&#xff0c;读者将其信息做其他用途&#xff0c;由用户承担全部法律及连…

upload-labs闯关攻略

pass-1 提前准备好的一个PHP木马&#xff0c;然后将后缀名改为jpg上传 然后在上传的过程中利用抓包&#xff0c;将抓取到的包里面的后缀jpg改为php如图所示&#xff0c;然后放行 接着我们去访问上传的图片信息&#xff0c;如下图所示就为成功 pass-2 提前准备好的一个PHP木马…

线程池相关知识点

线程池是什么相信大家都是知道的&#xff0c;所以这里就不做解释了&#xff0c;直接看相关知识点吧。 初始化线程池方法 继承ThreadPool 实现Runnable 实现Callable 接口 FutureTask &#xff08;可以拿到返回结果&#xff0c;可以处理异常&#xff09; 核心参数 corePoo…

[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-23 VTC视频时序控制器设计

软件版本&#xff1a;VIVADO2021.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA 实验平台&#xff1a;米联客-MLK-H3-CZ08-7100开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http…