IIC总线原理详解

I²C总线通信原理详解

1. I²C是什么?

I²C(Inter-Integrated Circuit,读作"I-squared-C")是一种由飞利浦 (现恩智浦)设计的同步、串行、半双工通信协议,主要用于短距离、低速设备间的通信(如传感器、EEPROM、LCD驱动芯片等)。

核心特点

  • 两根线 :仅需SDA (数据线)和SCL(时钟线)。
  • 多主多从:支持多个主设备(Master)和从设备(Slave)共享总线。
  • 地址寻址:每个从设备有唯一地址(如0x68),主设备通过地址选择通信对象。
2. 硬件连接
  • 开漏输出 :SDA和SCL均为开漏结构,需外接上拉电阻(通常4.7kΩ),避免信号冲突。
  • 设备地址:7位或10位地址(如0x1A),支持广播寻址(所有从机响应)。

SCL SDA SCL SDA 上拉电阻 上拉电阻 Master Slave1 Slave2 SDA SCL VCC


3. 通信流程(以读取传感器数据为例)
步骤1:起始条件(START)
  • SCL为高电平 时,主设备将SDA从高拉低 ,表示通信开始。

    waveform SCL: 1-1-1-1-1-1-1-1-1 SDA: 1-1-1-1-1-0-0-0-0 START: ^
步骤2:发送从机地址 + 读写位
  • 7位地址 + 1位方向 (0=写,1=读)。例如:
    • 写操作:地址0x68(二进制1101000)→ 发送1101000 0
    • 从机回应ACK(拉低SDA表示确认)。
步骤3:数据传输
  • 主设备发送命令 (如寄存器地址0x01),从机ACK。
  • 主设备发送重复起始条件(Repeated START),切换为读模式。
  • 从机返回数据 (如温度值0x25),主设备ACK或NACK(结束读取)。
步骤4:停止条件(STOP)
  • SCL为高电平 时,主设备将SDA从低拉高 ,结束通信。

    waveform SCL: 1-1-1-1-1-1-1-1-1 SDA: 0-0-0-0-0-1-1-1-1 STOP: ^

4. 关键机制
时钟同步(SCL)
  • 多个主设备可通过"线与"逻辑协商时钟速率(慢速设备拉低SCL强制等待)。
仲裁(多主竞争)
  • 若两个主设备同时发送数据,SDA先输出高电平的设备退出(无破坏性冲突)。
错误处理
  • 无ACK:从机未响应(地址错误或设备故障)。
  • 超时:SCL被长时间拉低(从机卡死)。

5. 典型时序图

Master Slave START + 地址(写) + ACK 寄存器地址 + ACK REPEATED START + 地址(读) + ACK 数据字节1 + ACK 数据字节2 + NACK STOP Master Slave


6. 优缺点
优点 缺点
硬件简单(两根线) 速度较慢(标准模式100kbps)
支持多主从 地址冲突需手动管理
无需片选信号(CS) 长距离通信需加驱动

7. 实际应用
  • 读取传感器 (如BMP280气压计):主设备读取从机地址0x77的校准数据。
  • 配置外设 (如OLED屏幕):主设备向地址0x3C发送显示指令。

8. 动手实验
  1. 硬件连接

    • Arduino(主) + MPU6050(从,地址0x68) + 4.7kΩ上拉电阻。
  2. 代码示例 (Arduino):

    cpp 复制代码
    #include <Wire.h>
    void setup() {
      Wire.begin(); // 主设备模式
      Wire.beginTransmission(0x68); // 指定从机地址
      Wire.write(0x3B); // 寄存器地址
      Wire.endTransmission(false); // 保持连接
      Wire.requestFrom(0x68, 6); // 请求6字节数据
      while (Wire.available()) {
        byte data = Wire.read(); // 读取数据
      }
    }
相关推荐
计算机安禾10 小时前
【Linux从入门到精通】第33篇:数据库MySQL/MariaDB安装与基础调优
linux·数据库·mysql
楼兰公子11 小时前
读取rpi摄像头
linux·服务器·算法
李景琰11 小时前
Debian12安装配置Mqtt之EMQX
linux·运维·服务器
测试员周周11 小时前
【AI测试系统】第1篇:LangGraph 实战:用 State Graph 搭建 AI测试流水线(4 步编排 + RAG 增强 + 完整代码)
linux·windows·python·功能测试·microsoft·单元测试·多轮对话
不做无法实现的梦~11 小时前
PX4 机载电脑 Linux 环境安装、串口、网络、ROS 完整配置
linux·运维·网络
嵌入式×边缘AI:打怪升级日志11 小时前
嵌入式Linux开发(了解交叉编译工具链的组成)
java·linux·运维
李小白2020020211 小时前
RK3568 linux6.1 死机
linux·运维·服务器
FreeGo~11 小时前
Linux 系统编程 进程篇 (五)
java·linux·服务器
杨云龙UP11 小时前
Oracle数据库启动失败:ORA-29701、ORA-01565、ORA-17503故障处理记录_20260429
linux·运维·数据库·oracle·centos
handler0112 小时前
Git 核心指令速查
linux·c语言·c++·笔记·git·学习