4. I2C总线解码实战
I2C(Inter-Integrated Circuit)是嵌入式系统中最常见的板级低速总线之一,广泛用于EEPROM、温度传感器、RTC、PMIC、OLED等器件的通信。它只用两根线——SCL(串行时钟)和SDA(串行数据),却承载了完整的寻址、读写方向、应答与数据帧语义。要在示波器上把I2C“看懂”,必须同时掌握三件事:电气层如何形成合法电平、协议层如何组织帧结构、以及Tektronix示波器如何把模拟波形翻译成地址与数据。
一、电气特性:开漏、上拉与合法电平
I2C的物理层是开漏(Open-Drain)结构:主机和从机的SDA、SCL引脚都只能把线拉低,不能主动拉高。高电平由外部上拉电阻Rp提供。这意味着总线在任意时刻只要有一个器件拉低,线就是低;只有所有器件都释放,线才被上拉为高。这种“线与”特性正是I2C支持多主多从、时钟同步和仲裁的物理基础。
上拉电阻的取值需要权衡:Rp越小,上升沿越快,但低电平灌电流越大;Rp越大,功耗越低,但上升时间变长,可能违反I2C规范的tr上限。标准模式(100 kbps)和快速模式(400 kbps)对上升时间要求不同,快速模式+(1 Mbps)更严格。典型值在1.8 V系统中常用2.2 kΩ~4.7 kΩ,3.3 V系统中常用4.7 kΩ~10 kΩ。判断波形是否合格,主要看三点:低电平是否低于VIL(通常0.3×VDD)、高电平是否高于VIH(通常0.7×VDD)、上升时间是否满足模式要求。
另一个关键电气细节是总线电容。每个器件引脚、PCB走线和连接器都会贡献电容,规范限制总线电容不超过400 pF。电容越大,上升沿越缓。若在示波器上看到上升沿明显“圆肩”,往往不是协议问题,而是上拉偏大或总线电容偏大。
二、协议帧结构:起始、地址、R/W、ACK与数据
I2C的一帧通信由若干“字节+应答位”组成。SCL为高时SDA由高变低定义为起始条件(Start,S);SCL为高时SDA由低变高定义为停止条件(Stop,P)。起始之后,主机发送7位从机地址,第8位是R/W位:0表示写(W),1表示读(R)。第9个时钟周期,被寻址的从机若存在,会把SDA拉低作为应答(ACK);若不存在或忙,SDA保持高,为NACK。
地址之后是数据字节,每个字节仍然是8位数据加1位ACK。写操作中,主机发数据、从机回ACK;读操作中,从机发数据、主机回ACK,最后一个字节主机通常回NACK再发停止条件。若需要访问从机内部寄存器,常见做法是“写寄存器地址 + 重复起始 + 读数据”,即先写一个字节的寄存器偏移,再发重复起始(Sr)并带R/W=1重新寻址,然后读取。
理解帧结构的关键是“位序”和“采样时刻”:I2C是MSB先发,数据在SCL低电平期间变化,在SCL高电平期间保持稳定并被采样。因此示波器解码时,采样点应落在SCL高电平中部,而不是边沿附近。
三、Tektronix解码设置步骤
以MSO5/6系列或DPO7000系列为例,I2C解码通常通过“Bus”菜单完成。第一步是接线:用探头分别接SCL和SDA,建议使用单端探头并保证地线尽量短;若使用差分探头则需确认共模范围。第二步是设置门限:在Bus配置中选择I2C,分别指定SCL和SDA的源通道,并设置门限电平。门限通常设为VDD/2,例如3.3 V系统设为1.65 V,1.8 V系统设为0.9 V。门限过高或过低都会导致位判决错误。
第三步是配置解码参数:包括地址宽度(7位或10位)、是否包含R/W位、以及显示格式(十六进制/二进制)。部分型号还支持“Include R/W in address”选项,若勾选,则地址显示为8位(如0x50写、0x51读);若不勾选,则地址显示为7位(0x28),R/W单独标注。第四步是触发设置:在Trigger菜单中选择Bus触发,可设置触发条件为Start、Address、Data或NACK。例如要捕获“对0x50的写操作”,可设置Address=0x50、R/W=W、Data=0x10作为触发条件。
第五步是观察与搜索:解码结果会以总线波形叠加或表格形式显示。MSO5/6支持在波形下方显示解码表格,并可开启“Search”功能,按地址、数据或NACK条件搜索整段采集。若解码出现红色错误标记,通常意味着起始/停止条件不完整、ACK缺失或门限设置不当。
四、典型读写时序的触发与捕获
实际调试中最常见的两类捕获是“写寄存器”和“读寄存器”。写操作时序为:S → 地址+W → ACK → 寄存器偏移 → ACK → 数据 → ACK → P。读操作时序为:S → 地址+W → ACK → 寄存器偏移 → ACK → Sr → 地址+R → ACK → 数据 → NACK → P。触发时,若只想看写操作,可设置Address=目标地址、R/W=W;若想看读操作,可设置R/W=R,或利用“Sr”条件触发。
捕获时还需注意采样率与存储深度。I2C速率通常为100 kHz~1 MHz,示波器采样率建议不低于10 MS/s,以保证每个SCL周期有足够采样点。若总线速率较高(如3.4 MHz高速模式),则需更高采样率和更短的地线。对于偶发NACK或总线死锁,可设置NACK触发或超时触发,配合长存储捕获异常前后的完整帧。