尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

两根线,让传感器开口说话:I2C 总线在 MPU6050 上的完整演绎

两根线,让传感器开口说话:I2C 总线在 MPU6050 上的完整演绎 1. I2C 在这里扮演什么角色一句话它是 MCU主机和 MPU6050从机之间唯一的沟通语言。干什么用配置初始化MCU 通过 I2C 向 MPU6050 的寄存器写入数据比如唤醒芯片、设置量程、配置低通滤波器。读取数据MCU 通过 I2C 读取加速度计、陀螺仪、温度传感器的原始数据寄存器。操作 DMP如果你使用内置的数字运动处理器需要把 DMP 固件通过 I2C 下载到 MPU6050 的内存里并读取解算好的四元数。2. 物理层两根线怎么连I2C 总线只有两根线极为简洁线名作用在 MPU6050 上的连接SCL串行时钟线Serial Clock接 MCU 的 I2C 时钟引脚。时钟由 MCU 产生控制数据发送的节奏。SDA串行数据线Serial Data接 MCU 的 I2C 数据引脚。所有命令、地址和数据都在这根线上传输。上拉电阻将总线空闲时拉高至高电平强制项。需要两个4.7kΩ左右的电阻分别把 SDA 和 SCL 上拉到 3.3V。多数模块已内置但飞线久了建议确认。为什么要上拉I2C 设备采用开漏输出结构它们只能把总线拉低到 GND不能主动输出高电平。高电平完全靠上拉电阻“拉”上去。没有上拉电阻总线永远保持低电平通信彻底瘫痪。MPU6050 的 I2C 地址模块上的AD0 引脚决定地址低位AD0 接 GND → 7位地址为0x68AD0 接 VCC → 7位地址为0x69实际通信时地址字节的最低位是读写位所以写地址 0xD0(0x68 1 | 0)读地址 0xD1(0x68 1 | 1)3. 协议层一次典型的“握手”过程我们用读取 MPU6050 的“WHO_AM_I”寄存器地址 0x75为例它会返回 0x68 来证明通信成功。整个读取过程包含起始信号 → 写命令 → 重启 → 读数据 → 停止信号五个阶段。请看下面的时序描述3.1 第一步发送起始信号MCU 先把 SDA 从高电平拉低然后 SCL 拉低告诉总线“通信开始你们都听着”。3.2 第二步发送“从机地址 写”位MCU 在 SCL 的配合下在 SDA 线上逐位发出一个字节11010000(0xD0)。前 7 位是 MPU6050 的地址1101000末位0表示接下来要“写”。MPU6050 收到后在第 9 个时钟脉冲拉低 SDA 作为应答信号 (ACK)。3.3 第三步发送要读的寄存器地址MCU 再发一个字节01110101(0x75WHO_AM_I 的地址)。MPU6050 再次应答 (ACK)。3.4 第四步重复起始信号 发送“读”地址因为要转换方向从写变读MCU 再次发送一个起始信号不结束当前会话。然后发送“从机地址 读”位11010001(0xD1)。MPU6050 应答。3.5 第五步MPU6050 发送数据MCU 接收MPU6050 开始在 SDA 线上发出 WHO_AM_I 寄存器的内容01101000(0x68)。MCU 每收到一个字节都要在第 9 个时钟周期把 SDA 拉低作为应答告诉 MPU6050“我收到了继续发”。但这是最后一个字节所以 MCU不拉低 SDA非应答 NACK表示“不要发了就这一个字节”。3.6 第六步发送停止信号MCU 在 SCL 为高时把 SDA 从低电平拉高通信结束。整体写一个寄存器如唤醒更简单起始 → 写地址(0xD0) → 寄存器地址(0x6B) → 数据(0x00) → 停止。没有重启。4. 在代码中的体现伪代码风格// 软件模拟 I2C 读一个字节的简化逻辑 uint8_t MPU6050_Read_Byte(uint8_t reg_addr) { uint8_t data; I2C_Start(); // 起始信号 I2C_Send_Byte(0xD0); // 写地址 I2C_Wait_Ack(); I2C_Send_Byte(reg_addr); // 寄存器地址 I2C_Wait_Ack(); I2C_Start(); // 重复起始 I2C_Send_Byte(0xD1); // 读地址 I2C_Wait_Ack(); data I2C_Read_Byte(); // 读取数据 I2C_Send_NAck(); // 发送非应答 I2C_Stop(); // 停止信号 return data; } // 初始化时验证通信 if (MPU6050_Read_Byte(0x75) 0x68) { printf(MPU6050 连接成功\n); }5. 为什么不用 SPII2C 的取舍MPU6050 也支持 SPI但绝大多数项目都用 I2C原因是特性I2CSPI线数2 根 (SCL/SDA)最少 4 根 (SCK/MOSI/MISO/CS)多设备一条总线可以挂多个设备通过地址区分每个从设备需要一根独立的 CS 片选线速度标准 100kbps快速 400kbps可高达数 Mbps更快复杂度协议稍复杂但库函数成熟协议简单但线多对于飞控、平衡小车这种引脚紧张的场景I2C 用两根线就能同时管理 MPU6050、磁力计、气压计优势巨大。6. 常见故障排查现象原因解决读 WHO_AM_I 返回 0x00 或 0xFF芯片未唤醒上拉电阻缺失接线断路先写 0x00 到 0x6B 唤醒检查上拉电阻是否焊接良好读数全为 0芯片处于睡眠状态PWR_MGMT_1 默认 0x40初始化时写 0x00 唤醒数据跳动很大电源噪声或 I2C 总线受干扰检查 VCC 旁路电容降低 I2C 速率飞线尽量短偶尔读出错误值时序违例应答处理不当确保在 SCL 低电平时改变 SDA处理好 NACK
返回列表