STM32-第十二节-I2C协议
2026/9/17 22:32:20 网站建设 项目流程

一、简介:

1.介绍:

(1)两根通信线:SCL(Serial Clock)、SDA(Serial Data),一根给时钟,一根放数据

(2)同步、半双工,带数据应答,支持挂载多设备(一主多从)

(3)优点:UART是异步的,双方时序必须要求十分严格才能正确传输,而I2C通过SCL给出时钟,故可以通过软件手动反转电平给出时钟,不依赖硬件。

2. 时序结构:

(1)起始,终止:

(2)发送和接收字节:

下面的SDA的两行是具体数据,可0可1,需要注意SCL拉高期间SDA不能变。

(3)发送和接收应答:

3.开漏输出+弱上拉模式(巧妙)

一主多从如图:CPU为主机,其他为从机,它们都挂载在同一根SDA和SCL上。

对于I2C协议来说,所有设备都要配置为开漏输出模式+弱上拉

(1)什么是开漏输出+弱上拉?

开漏输出是,当一个模块对一根线配置电压0/1,输出0有驱动能力,将这根线上的电压置0,输出1则为高阻态,即模块与线断开。如果输出1断开,则这根线上的电压就没有配置,是不确定的,这不好,为了在输出1时这根线上电压为1,就如图所示,配置两个上拉电阻(隔着电阻接到Vdd),这样当输出0时,线上电压为0,输出1时,线上电压为1。

(2)为什么要用开漏输出+弱上拉?

有人要问,为什么不用推挽输出,输出0/1都有驱动,输出是多少,线上电压就是多少?

答:因为对于I2C协议,主机和从机都能控制线上电压,如果它们都为输出,且一个输出0,一个输出1,就短路了。而采用上面的模式,就好比,有一个带弹簧的杠杆,如果没人把它往下拉,弹簧会自动把杠杆拉上去,只要有一个人把杠杆往下拉,杠杆就会被拉下来。就结果而言,对于挂载在同一条线上的所有模块,只要有一个置0,则线上电压为0,只有都置1,线上电压才为1。解决了可能短路的问题。

4.如何收发内容:

从机地址:由于一主多从,主机向从机发送数据,需要确定向哪一个从机发送。故每一次发送数据,第一个字节为从机地址,每个其中前7位为从机地址(高位先行),最低位标志读写,0为主机写,1为读。

(1)指定地址写:

起始条件 + 从机地址(写)+ 控制字/指定地址 + 数据

注:第二个字节是控制字还是指定地址,是由从机来决定的。

(2)当前地址读:

(地址指针:对于一个从机,其内部是有寄存器的,由一个指针指向从机内的地址,称为地址指针。上面的指定地址写时序,中的第二个字节--指定地址,就是在移动地址指针。)

起始条件 + 从机地址(读)+ 数据

注:1.其中,从机地址字节最后一位为1(读)。

2.当主机给出从机地址读操作字节后,立即进入读环节,下一字节为从机放数据,数据为地址指针指向的数据。(问题:没有时间给指定地址)

(3)指定地址读:

起始条件 + 从机地址(写)+ 指定地址 + 起始条件 + 从机地址(读)+ 数据

注:很好理解,通过从机地址(写)+ 指定地址,改变地址指针的位置,再读数据。

(4)连续读写:

上边时序的数据部分,每成功写/读一个字节的数据,地址指针自动+1。

连续写:直接连续给出多个字节的数据(有应答),不给终止时序就可以了。

连续读:如果应答了,从机会继续放数据,就是连续读,给出非应答后停止。

二、MPU6050:

1.简介:

MPU6050是6轴姿态传感器,可以测量芯片自身XYZ轴(即空间各个方向)的加速度角速度

2.参数:

收集的加速度,角速度等信息需要转换为数据存储起来,就要用到ADC,本模块采用16位ADC采集传感器的模拟信号,范围-32768-32767

当ADC数值达到最大32767时,对应的实际模拟值,为满量程选择:
加速度计满量程选择:正负2,4,8,16,单位g(重力加速度)
陀螺仪满量程选择:正负250,500,1000,2000,单位 deg/s(度每秒)

模块利用I2C通信,地址:1101000(AD0=0,一个引脚),1101001(AD0=1)
(注:7位地址+1位读写标志位=1个字节)

3.硬件电路:

右侧为MPU6050芯片,左下为8针排针,左上为低压差LDO(低压差线性稳压器,可将5V电压压至3.3V给芯片供电)。

看左下角排针:

SCL、SDA:I2C通信引脚
XCL、XDA:主机I2C通信引脚,用于扩展,如外接磁力计等。
AD0:决定从机地址,默认低电平
INT:中断输出引脚,可配置一些中断

芯片内部还嵌入了DMP处理器,专用于解算姿态,配合官方提供的库使用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询