当前位置: 首页 > article >正文

2.STM32之通信接口《精讲》之IIC通信---软件实现IIC《深入浅出》面试必备!

跟着上一节的步伐,继续前进!!!

(温馨提示:可以参考我以前51单片的存储芯片的读写实验的文章,类比一下IIC对不同器件的操作)

51单片机-AT24C02(IIC总线介绍及其时序编写步骤)-第一节(下一节实战)_24c02 232-CSDN博客

IIC既可以通过软件实现,又可以通过硬件实现!

mpu6050中文手册:MPU6050是一款由InvenSense公司生产的六轴运动处理组件,集成了3轴陀螺仪和3轴加速度计,广泛应用于无人机、机器人、体感游戏设备等需要精确感知运动的场合。这款传感器支持I2C和SPI通信接口,能够提供高精度的姿态数据,是许多DIY项目和学术研究中的首选。 - GitCode

我们就先用软件实现IIC通信

本节将学习如何使用 MPU6050 模块。该模块的操作主要通过配置寄存器来完成:我们可以向寄存器写入数据以设置模块的工作模式(写入电路),也可以从寄存器读取数据(读出电路状态)以获取 MPU6050 处理后的传感器信息。

示例:配置采样率并读取加速度数据

假设我们想将 MPU6050 的采样率设置为 1kHz,并读取三轴加速度数据,步骤如下:

  1. 设置采样率:通过向 SMPLRT_DIV 寄存器写入值。例如,写入 0x07(十进制 7)可将采样率设置为 1kHz。
  2. 读取加速度数据
    • 从加速度的寄存器(ACCEL_XOUT_HACCEL_XOUT_L 等)读取 16 位的原始数据。
    • 根据设定的量程(如 ±2g),将原始数据转换为实际加速度值。

通过配置和读取寄存器,我们可以灵活控制 MPU6050 的工作模式,并获取精准的运动和姿态数据,为后续开发提供强大支持。

我们以前学习时,主要是使用 STM32 内部集成的外设,通常可以直接调用 STM32 提供的库函数完成基本的配置。而本次学习的 MPU6050 属于 STM32 的外部外设,这就需要我们自己编写相关的函数来对 MPU6050 进行操作。

例如,我们需要手动实现以下基础功能:

  1. 初始化函数:配置 MPU6050 的基本参数,如电源管理、采样率、量程等。
  2. 数据读取函数:从 MPU6050 的寄存器中读取加速度、角速度或温度数据。
  3. 数据写入函数:向特定寄存器写入配置数据,设置其工作模式。
  4. 通信链路配置:通过 I²C 接口实现 STM32 和 MPU6050 之间的数据交互。

这些操作都需要参考 MPU6050 的数据手册,手册中详细列出了寄存器地址、配置选项和操作流程。通过对手册的学习和代码的实现,可以帮助我们深入理解 MPU6050 的工作原理和 STM32 的外设使用方法。

提出一个问题?单片机是如何通过IIC与外部设备通信的呢?我们都知道STM32操作自己的外设是可以通过自己内部的总线来配置相对应的寄存器,问题来了?MPU6050是单片机外部的设备,我们又应该怎样去配置他的寄存器呢?如果利用IIC应该怎样实现,使用USART又应该怎样实现呢?给出你的实现过程还有IIC和USART的实现对比表格?还要给出步骤,并举出一个例子,

再给大家讲个故事,很久很久以前,有一家大公司找到你,让你开发指定开发一款通讯协议,因为,他们觉得USART通信对他们来说资源太浪费了,而且扩展性还很差,于是找到你,让你为他们开发,他们给出了1个亿的奖金作为报酬!于是,你激动到起飞,但是,他们对这个协议提出了几点要求,要求一:通信收发双方必须只能有一个在读或写,要求二:收发双方必须要有回应,也就是我发送给你数据,你要给我回复你收没收到,要求三:要能与多个设备进行通信,每个通信的设备还要能够独立。要求四:收发双方的时钟要同步,也就是说,收发双方要有一个同步时钟来控制他们收和发的频率,要有一个时钟线来控制他们节奏,意思就是同呼吸,共命运!于是,经过你长达数个月的开发和研究,最终,你开发出来了个毛线。最后,大公司对你太失望了,便找了另外一家公司开发,不知该过了多久,有一天,你打开手机一看,以前找你的那家公司已经开始使用一款通信协议,你就好奇,然后,你就单枪匹马去了这家大公司,进入公司你问了他们一句,这是什么协议,别人告诉你,这是,IIC通信!最终,你怀着无比沉重的心情走出来这家公司。不知过了多久,IIC正式涌入市场,家喻户晓。

一句话,所有的外设模块,只要你能读指定地点的寄存器和写指定地点的寄存器,你就能对这个外设模块进行了完全控制

特性:

IIC(I²C, Inter-Integrated Circuit)总线是一种常用的串行通信协议,其主要特性包括以下几点:


1. 双线制通信

  • 只需要两根信号线:SDA(数据线)SCL(时钟线),用于数据传输和时钟同步。
  • 节省硬件资源,适合简单的嵌入式系统。

2. 主从架构

  • 主设备(Master):控制通信,生成时钟信号,发起数据传输。
  • 从设备(Slave):响应主设备的请求,进行数据读写。
  • 一个总线可以有多个主设备和多个从设备,但每次通信只有一个主设备处于活动状态。

3. 唯一设备地址

  • 每个从设备通过唯一的7位或10位地址被主设备寻址。
  • 主设备通过设备地址选择目标从设备,确保总线上多个设备间的通信不会冲突。

4. 半双工通信

  • 数据在单条 SDA 线上按双向传输(主设备与从设备轮流发送或接收数据),但同一时刻只能单向通信。

5. 时钟同步

  • 主设备生成时钟信号(SCL)并控制数据传输节奏。
  • 支持不同速度设备的通信,通过从设备的时钟拉低(Clock Stretching)机制进行同步。

6. 数据传输特性

  • 数据以字节为单位传输,每个字节后跟一个 ACK/NACK 信号(应答/非应答)。
  • 数据传输遵循以下时序:
    1. 起始信号(Start Condition):SCL 高电平时,SDA 从高到低变化。
    2. 数据传输:每次传输 8 位数据,从最高位开始。
    3. 应答信号:接收方在第 9 个时钟周期发出应答(ACK/NACK)。
    4. 停止信号(Stop Condition):SCL 高电平时,SDA 从低到高变化。

7. 多速率支持

  • 标准模式(Standard Mode):数据速率最高 100 kbps。
  • 快速模式(Fast Mode):数据速率最高 400 kbps。
  • 高速模式(High-speed Mode):数据速率最高 3.4 Mbps。

8. 可扩展性

  • 同一条总线上可以挂接多个从设备(理论上最多 128 个,实际受硬件限制)。
  • 所有设备共享 SDA 和 SCL 两根总线,通过设备地址区分通信目标。

9. 仲裁机制

  • 支持多主设备的场景。
  • 如果两个主设备同时发起通信,IIC 的仲裁机制会确保只有一个主设备能占用总线。

10. 简单硬件要求

  • IIC 总线上的 SDA 和 SCL 需要上拉电阻,用于维持线路的高电平状态(通常为 4.7kΩ 或 10kΩ)。
  • 主设备和从设备都可以通过开漏输出驱动线上的低电平信号。

11. 低功耗

  • 由于硬件简单、数据速率低、信号驱动简单,IIC 通常功耗较低,非常适合电池供电的嵌入式设备。

12. 适用范围广

  • 被广泛应用于芯片间通信(如传感器、EEPROM、RTC、显示器等外设)。
  • 在嵌入式系统中,因其结构简单、支持多设备通信的特性,特别受欢迎。

这些特性使得 IIC 成为一种高效、灵活且广泛使用的通信方式,尤其适合小型嵌入式系统和电子设备之间的低速数据传输。

记住,一句话,主机对IIC可以完全控制,也就是说,任何时候都是主机控制SCL时钟线!

IIC时序讲解

起始条件和终止条件始终主机控制!

可以对比一下USART时序

uart接口的时序分析_uart时序-CSDN博客

IIC发送一个字节时序图(主机而言的)

IIC读取一个字节时序图(主机而言的)

实线部分是由主机控制,虚线部分是从机控制

发送应答和接收应答

谨记:出厂时,支持IIC通信的设备都必须有一个唯一可识别的地址。唯一的

相同型号的期间芯片,地址都是一样的,我们可以采用地址中的可变部分来区分

实验时的片段!IIC截图

主机向指定地址写入数据

绿色的线表示从机读到的数据,第八位,代表0代表主机要进行写入操作,1代表读出操作。

从图中分析,翻译过来就是,在从机地址0xD0的0x19(一般是寄存器地址)位置写入0xAA的数据。

主机向当前地址读数据(也就是0xD0,D0改为D1代表读当前地址)

也是一样,蓝色竖直的线代表主机读取当前从机数据

时序也很简单,也就是在SCL低电平期间,把数据放到SDA上,等到SCL为高电平时,把数据读走。

时序意思也很简单:就是读出0x0f地址下的内容。

这边有个小疑问?

从上面时序图中,我们读取数据的时候,我们并没指定要读哪个地址的数据,但是从时序图中看出,在主机发送读的指令时,从机返回应答,主机就开始直接读一个地址下的数据了,我们指定读哪个寄存器?

解答:在我们写入数据的时候假入寄存器的地址时0x19,那么,接下来我们再读当前地址的数据时,0x19就会加一变成0x1A,地址自动加一。原因是,所有的寄存器地址都是放在一个线性区的,每当写入一个数据时,紧接着再去读这个寄存器的内容,此时这个地址所存储的内容就会被放在地址加一的位置,线性结构所决定。

主机向指定地址读出数据

指定设备在指定位置读取数据,sr的意思是重复其实条件。

从上图可以看出,这张图展示了一个复合时序:即在“当前地址写”(下图 1,框中蓝色部分)的基础上,结合“当前地址读”(下图 2,框中黄色部分)的时序操作。在即将写入数据的后半段,蓝色部分的时序紧接着加入了黄色部分的时序,实现了数据的读操作。这一复合时序有效地结合了当前地址写和当前地址读的功能。

图1

图2

时序到这里,我就讲完了,接下来采用硬件连接线路,软件来操作总线,来实现IIC通信!

下一节,我们将进行一个从机设备的介绍和讲解  MPU6050(然后,完成IIC通信部分)!!!!!!!!


http://www.kler.cn/a/406163.html

相关文章:

  • 小鹏汽车智慧材料数据库系统项目总成数据同步
  • Day24 回溯算法part03
  • Android上运行Opencv(TODO)
  • 模糊控制系统的设计(取材bilibili_蓝天的季洁)
  • C语言数据结构——详细讲解 双链表
  • Shell编程-8
  • Javaee文件的io操作
  • 使用 PyTorch 实现并训练 VGGNet 用于 MNIST 分类
  • Frida反调试对抗系列(二)
  • pcb元器件选型与焊接测试时的一些个人经验
  • SELinux知识点
  • C++学习第四天
  • 深入了解 Spring Security 的授权核心功能
  • idea 程序打包 jar 发布
  • 前端 vue 如何区分开发环境
  • 使用php和Xunsearch提升音乐网站的歌曲搜索效果
  • vue 目录结构
  • 【Linux】进程-PCB
  • vue制作代码比较工具
  • 本地云存储 MinIO 中修改用户密码
  • Oracle-物化视图基本操作
  • Spring |(二)IoC相关内容 | bean
  • [JAVA]用MyBatis框架实现一个简单的数据查询操作
  • go版本,google-authenticator动态口令算法,二次安全校验
  • Elasticsearch面试内容整理-分析与映射
  • wsl2中kali linux下的docker使用教程(教程总结)