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,并读取三轴加速度数据,步骤如下:
- 设置采样率:通过向
SMPLRT_DIV
寄存器写入值。例如,写入0x07
(十进制 7)可将采样率设置为 1kHz。 - 读取加速度数据:
- 从加速度的寄存器(
ACCEL_XOUT_H
和ACCEL_XOUT_L
等)读取 16 位的原始数据。 - 根据设定的量程(如 ±2g),将原始数据转换为实际加速度值。
- 从加速度的寄存器(
通过配置和读取寄存器,我们可以灵活控制 MPU6050 的工作模式,并获取精准的运动和姿态数据,为后续开发提供强大支持。
我们以前学习时,主要是使用 STM32 内部集成的外设,通常可以直接调用 STM32 提供的库函数完成基本的配置。而本次学习的 MPU6050 属于 STM32 的外部外设,这就需要我们自己编写相关的函数来对 MPU6050 进行操作。
例如,我们需要手动实现以下基础功能:
- 初始化函数:配置 MPU6050 的基本参数,如电源管理、采样率、量程等。
- 数据读取函数:从 MPU6050 的寄存器中读取加速度、角速度或温度数据。
- 数据写入函数:向特定寄存器写入配置数据,设置其工作模式。
- 通信链路配置:通过 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 信号(应答/非应答)。
- 数据传输遵循以下时序:
- 起始信号(Start Condition):SCL 高电平时,SDA 从高到低变化。
- 数据传输:每次传输 8 位数据,从最高位开始。
- 应答信号:接收方在第 9 个时钟周期发出应答(ACK/NACK)。
- 停止信号(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通信!