【STM32】IIC(Inter Integrated Cirruit--集成电路总线)

【单片机】14-I2C通信之EEPROM-CSDN博客

一、IIC总线协议介绍

1.IIC简介

同步(有时钟频率),半双工(同一个时间只能接收或者发送),串行(一个字节一个字节传输),高位读取

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第1张图片

一主多从:表示只能主机同意发送才可以发送

多主多从:表示其中每一个人都有说话的权力,但是同一个时间只能有一个人说话【仲裁】

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第2张图片

2.IIC总线结构图

1)主机控制SDA和SCL,只有从机发送应答的时候主动权才在从机上

2)从机不允许控制SCL

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第3张图片

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第4张图片

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第5张图片

3.IIC协议时序

应答:因为在CLK和SDA上有一个上拉电阻,表示在没有传入数据的时候,默认两个数据线上的电平为高电平。当我们接收到数据时,就要将电平从高电平拉低为低电平。所以nack(高电平)表示未接收到数据,ack(低电平)表示接收到数据。

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第6张图片

4.起始/停止代码

起始/终止都是由主机产生的

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第7张图片

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第8张图片

5.接收应答信号:主机--->从机

表示当主机数据传输结束后,需要从机发送一个应答信号。

主机将SDA拉高,如果从机接收到数据了,则将SDA拉低,

                             如果没有接收到,则SDA不变(还是处于被主机拉高的状态)

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第9张图片

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第10张图片

6.发送应答信号:从机-->主机

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第11张图片

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第12张图片

7.发送非应答信号

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第13张图片

8.开始信号、结束信号、应答信号

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第14张图片

9.发送1字节数据

1)SCL在低电平时期-->SDA将数据放上去-(此时数据放好了)-->SCL松开手(变为高电平)---->从机开始读取数据--(数据读取好了)->SCL拉低电平

2)当在传输数据的时候,产生中断,此时SCL和SDA不会发生变化,会等待处理完成后在接着执行

3)任何一个设备拉低电平,整个线上都是低电平

4)只有全部设备都拉高,整个线上才会是高电平

发送数据:低电平,主机发送数据

                  高电平,从机接收数据

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第15张图片

发送完数据就要是否SDA--》置为高电平

10.接收1字节数据

读取数据:低电平,从机发送数据【从机掌握SDA的控制权,所以主机要先是否SDA】

                  高电平,主机接收数据

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第16张图片

11.数据传输注意点

IIC总线在进行数据传送时,时钟线SCL为低电平期间,发送器向数据线发送一位数据,此期间数据线上的信号允许发送变化,时钟线SCL为高电平期间,接收器从数据线上读取一位数据,此期间数据线上的信号不允许发生变化,需保持稳定。(即时钟线SCL的作用是告诉发送器什么时候发送数据,告诉接收器什么时候读取数据。故时钟线SCL既连在发送器上,又连在接收器上)

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第17张图片

12.重点:当前地址写时序图

1.第一字节:指定地址写

第一个数据=从机地址+读/写位

0:写入操作

1:读入操作

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第18张图片

2.第二字节:指定寄存器地址

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第19张图片

3.第三字节:传输数据

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第20张图片

13.当前地址读时序图

0:写入操作

1:读入操作

由于当前地址读,当设置为读时序,就马上开始读,所以无法指定要读取哪一个寄存器的值。所以只能读取当前寄存器的值。

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第21张图片

14.重点:指定地址读时序图(复合格式)

用于读取外挂寄存器的值

为什么我们这里可以进行指定写寄存器的值???

这里我们在当前地址读操作前加上指定地址写--->指定地址读=指定地址写+当前地址读

2)记得最后结束的时候应答信号是0(非应答信号)

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第22张图片

二、MPU6050:6轴姿态传感器

1.MPU6050简介

10轴:3轴加速度+3轴角速度+3轴磁场强度+1个气压强度

姿态角=欧拉角【比如飞机的左转,右转等】

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第23张图片

压了任意一个面,就会产生压力,输出对应的压力值

加速度计(压力计):A

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第24张图片

具有静态稳定性,不具有动态稳定性(因为在运动的时候,计算出来的结果会有误差)

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第25张图片

陀螺传感器:G

MPU6050中陀螺传感器测量的是角速度

陀螺仪具有动态稳定性,不具有静态稳定性

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第26张图片

2.MPU6050参数

1)满量程:等价于ADC转换中的Vref参考电压一样

2)加速度的单位:g(1g=9.8m/s^2)

3)

        如果MUP6050的从机地址为:0xD0(包含写地址位)或者0xD1(包含读地址位),表示将读/写位融入从机地址

      如果MUP6050的从机地址为:0x68(直接把7位地址转换位十六进制得到的),则在计算传入数据时要将数据(0x68<<1)再或与上读/写

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第27张图片

3.硬件电路

根据我们此时的应用场景

直接将J1引脚上的SCL和SDA直接接到我们对应STM32的IIC引出的RXD和TXD两个引脚上即可。

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第28张图片

4.MPU6050框图

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第29张图片

自测功能

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第30张图片

电荷泵

升压自动的

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第31张图片

IIC接口

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第32张图片

5.略读数据手册

MPU-6050_(TDK InvenSense(应美盛))MPU-6050中文资料_价格_PDF手册-立创电子商城 (szlcsc.com)

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第33张图片

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第34张图片

三、软件IIC读写MPU6050

软件IIC读写:实际上就是自己操控GPIO引脚的高低电平转换

1.硬件连接

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第35张图片

2.模块划分

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第36张图片

3.IIC代码编写

0.引脚的封装

可移植性高

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第37张图片

1.iic_init()

1)初始化为开漏输出,释放总线(置为高电平)

2)SCL和SDA处于高电平,此时IIC处于空闲状态

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第38张图片

2.起始条件

1)要先拉低SDA再拉低SCL

2)先确保SDA和SCL都为高电平,然后再拉低SDA和SCL

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第39张图片

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第40张图片

3.终止条件

先拉低SDA(确保SDA是从低电平--->高电平)

再拉高SCL

最后拉高SDA

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第41张图片

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第42张图片

4.发送一个字节

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第43张图片

1)将SCL拉低

2)趁SCL为低,将数据放到SDA上

3)将SCL拉高,开始读取SDA

4)读取结束,将SCL拉低,准备下一次读取

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第44张图片

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第45张图片

5.接收一个字节

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第46张图片

1)将SCL拉低

2)将SDA释放---》表示将SDA的主动权交给从机(设置为高电平)【因为此时数据是从从机输出给主机】

3)如果传输的是高电平则就就拉高,如果传输的是低电平则就拉低

4)趁SCL为低,将数据放到SDA上

5)将SCL拉高,开始读取SDA【判断SDA上是高电平还是低电平】

6)读取结束,将SCL拉低,准备下一次读取

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第47张图片

6.发送应答

1)将SCL拉低

2)将应答数据放入SDA

3)拉高SCL,开始读取应答信号

4)拉低SCL,开始读取下一次数据

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第48张图片

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第49张图片

7.接收应答

1)将SCL拉低

2)释放SDA--》将SDA主动权交给从机【因为此时数据是从从机输出给主机】

3)将应答数据放入SDA

4)拉高SCL,开始读取应答信号

5)拉低SCL,开始读取下一次数据

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第50张图片

4.IIC测试代码

指定地址写

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第51张图片

main.c

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第52张图片

5.MPU6050代码

1.mpu6050写入寄存器

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第53张图片

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第54张图片

2.mpu6050读入寄存器

前面一部分和“ mpu6050写入寄存器 ”一样

最后记得将应答信号修改为不应答

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第55张图片

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第56张图片

6.MPU6050测试代码

获取MPU6050的id

【STM32】IIC(Inter Integrated Cirruit--集成电路总线)_第57张图片

[10-3] 软件I2C读写MPU6050_哔哩哔哩_bilibili

未看完-->等待后面继续了解【44分】

你可能感兴趣的:(STM32,stm32,嵌入式硬件,单片机)