1. I2C协议基础:从一根线说起

各位同学,咱们今天聊聊I2C。这玩意儿在嵌入式开发里太常见了,几乎每个工程师都绕不开它。我记得刚入行那会儿,第一次调I2C驱动,折腾了一整天,最后发现是上拉电阻没焊好。嗯,从那以后,我对I2C的物理层就特别上心。

1.1 I2C总线的起源

I2C,全称Inter-Integrated Circuit,是飞利浦(现在的NXP)在1982年搞出来的。说白了,就是为了让芯片之间能简单、高效地传数据。当时的设计目标很明确:用最少的线,连最多的设备。

你想想看,如果每个外设都像并行总线那样拉十几根线,板子早就乱成一锅粥了。I2C只用两根线——SDA(数据线)和SCL(时钟线),就能挂上一堆设备。这个设计思路,到现在看都不过时。

核心设计理念: 用两根线实现多主多从、同步串行通信。每个设备都有唯一地址,总线仲裁由硬件自动完成。

1.2 物理层特性:SDA与SCL

I2C的物理层其实不复杂,但有几个关键点必须吃透。我在项目中见过太多人栽在电平匹配和上拉电阻上。

1.2.1 总线结构

  • SDA(Serial Data Line):数据线,双向传输。发送方和接收方都靠它传比特。
  • SCL(Serial Clock Line):时钟线,由主设备驱动。所有数据同步在SCL的上升沿或下降沿采样。
  • 上拉电阻:两根线都必须接上拉电阻到VCC。空闲时,总线被拉高到高电平。

为什么会需要上拉电阻?因为I2C总线是开漏输出。设备只能把总线拉低,不能主动拉高。高电平全靠外部电阻提供。这个设计的好处是:多个设备可以安全地共用一根线,不会短路。

避坑指南: 我曾经在一个项目里,因为上拉电阻选得太小(只有1kΩ),导致总线上升沿太缓,通信时好时坏。后来换成4.7kΩ,问题立刻解决。标准模式下,上拉电阻一般选2.2kΩ~10kΩ,具体看总线电容和速率。

1.2.2 电平标准

参数 标准模式 (100kHz) 快速模式 (400kHz) 高速模式 (3.4MHz)
VIL(输入低电平) 0.3 × VDD 0.3 × VDD 0.3 × VDD
VIH(输入高电平) 0.7 × VDD 0.7 × VDD 0.7 × VDD
VOL(输出低电平) 0.4V @ 3mA 0.4V @ 3mA 0.4V @ 3mA
总线电容 ≤ 400pF ≤ 400pF ≤ 100pF

注意看,I2C的电平是相对于VDD的百分比,不是固定值。所以3.3V和5V的设备混用时要小心。我个人习惯用电平转换芯片,比如PCA9306,省心。

1.3 I2C与SPI/UART的对比

很多初学者会问:I2C、SPI、UART,到底该用哪个?我的回答是:看场景。没有万能的协议,只有合适的协议。

下面这张表,是我自己总结的,你直接拿去用。

特性 I2C SPI UART
信号线数量 2(SDA + SCL) 4(MOSI + MISO + SCLK + CS) 2(TX + RX)
通信方式 同步,半双工 同步,全双工 异步,全双工
设备寻址 7位或10位地址,软件寻址 片选信号,硬件寻址 无寻址,点对点
最大速率 3.4MHz(高速模式) 几十MHz(取决于实现) 几MHz(典型值)
总线设备数 理论最多127个(7位地址) 受限于片选引脚数 仅2个
硬件复杂度 中等(需要状态机) 低(移位寄存器即可) 低(简单移位)
典型应用 EEPROM、传感器、RTC ADC、DAC、LCD、SD卡 GPS、蓝牙、调试串口

1.3.1 什么时候选I2C?

  • 设备多,引脚少:你只有两个空闲IO,却要挂5个传感器。I2C是唯一选择。
  • 速度要求不高:100kHz或400kHz足够用。别拿I2C传视频流,那是自找麻烦。
  • 需要多主通信:多个MCU共享总线数据,I2C的仲裁机制天然支持。

1.3.2 什么时候选SPI?

  • 需要高速传输:比如刷LCD屏幕、读写SD卡。SPI轻松跑几十MHz。
  • 全双工通信:同时收发数据,比如音频编解码器。
  • 设备少,引脚够:每个设备一个片选,简单粗暴。

1.3.3 什么时候选UART?

  • 点对点通信:MCU和PC、MCU和GPS模块。UART最经典。
  • 长距离传输:配合RS232/RS485,UART能传几十米。
  • 调试输出:printf打印日志,UART是标配。

个人经验: 我一般这样选:调试用UART,传感器用I2C,高速外设用SPI。如果板子空间紧张,I2C优先。如果对实时性要求高,SPI优先。没有绝对的好坏,只有合不合适。

1.4 I2C协议知识结构图

下面这张图,帮你把I2C的核心知识点串起来。建议你保存下来,后面调试的时候对照着看。

I2C协议知识结构图 I2C协议基础 物理层特性 SDA数据线 SCL时钟线 上拉电阻 通信机制 起始/停止条件 地址+读写位 应答/非应答 协议对比 SPI UART 选型建议 核心要点 两根线、多设备、同步半双工、7位地址、上拉电阻不能省

1.5 小结

这一章咱们把I2C的底子打好了。从起源到物理层,再到和SPI、UART的对比,你应该能感受到:I2C是个优雅的协议,用最少的资源解决最多的问题。但优雅背后也有代价——速度慢、协议复杂、调试麻烦。后面几章,我会带你一步步把这些坑都填平。

记住一句话:理解物理层,是写好驱动的第一步。上拉电阻选对,电平匹配做好,你的I2C通信就成功了一半。