myFPGA.com.cnFPGA 技术与产业观察
← 返回栏目

FPGA I²C 接口入门:开漏、起止条件与握手

myfpga.com.cn 编辑部 · 2026-10-05

I²C 用 SDA 传数据、SCL 提供时序。本文以 Standard-mode、Fast-mode 和 Fast-mode Plus 的常见双向总线为范围,不涵盖所有高速或单向变体。FPGA 设计既要管理协议状态,也要观察引脚上的真实电平。

开漏:发送 1 是释放线路

常见 I²C 总线用开漏/开集输出配合上拉:参与者拉低表示 0,释放后由上拉建立高电平。FPGA 的引脚输出控制应区分“拉低”和“高阻释放”,并保留读取线路的通路,不能把发送 1 直接做成推挽输出高电平。相关电气定义见 NXP UM10204 第 3.1.1 节。

示意控制关系为 pull_low ? 0 : Z;三态应在顶层引脚或目标器件的 I/O 缓冲资源处实现,内部状态机传递的是输出使能与输入读回信号。实际 HDL 写法、引脚资源和电压兼容性需按器件手册核对。

上拉阻值不是固定通用值。阻值过大可能使上升过慢,过小则增加拉低时的电流要求;还要计入总线电容和并联上拉。应依据电源电压、低电平灌电流与上升时间要求计算并测量,方法见 TI 的上拉电阻计算说明。

START、STOP 与字节传输

在 SCL 为高时,SDA 从高变低定义 START,从低变高定义 STOP。普通数据位在 SCL 高期间应稳定,在低期间改变;不能把 START/STOP 的变化误认为数据位。

每个数据字节为 8 位,最高位先传,随后是第 9 个时钟上的应答位。以常见 7 位寻址为例,地址阶段发送的是“7 位地址 + 读写方向位”,不要混淆数据手册中的 7 位地址与包含方向位的地址字节。规则见 TI 的 I²C 总线介绍。

ACK/NACK:先确认谁是接收方

应答周期中,发送方释放 SDA,接收方拉低表示 ACK,保持释放表示 NACK。写数据时,通常由目标器件应答;读数据时,由控制器应答,控制器在读完最后一个字节后通常发送 NACK,告知目标不再继续发送。

NACK 不一定是故障:末字节读操作的 NACK 可以是预期动作。地址或写数据阶段的 NACK 则需结合器件是否存在、是否忙、是否接受该命令等条件判断。ACK 也不能直接当作外设内部操作已经完成的证明。应答规则及 NACK 情形见 UM10204 第 3.1.6 节。

建议让事务接口返回“哪一阶段 NACK”和超时原因,避免上层只得到一个含义不清的失败标志。

重复起始与时钟延展

重复起始(Sr)是在未先发送 STOP 的情况下再产生 START,总线保持忙状态。某些寄存器读事务采用:

START → 地址+写 → ACK → 寄存器索引 → ACK
      → Sr → 地址+读 → ACK → 数据 → NACK → STOP

这里只示意读一个字节;索引长度、是否需要 Sr、读写格式均由目标器件定义。不能把所有器件的读操作都套成同一条序列。重复起始的总线含义见 UM10204 第 3.1.4 节。

部分目标器件通过持续拉低 SCL 延长低电平,称为时钟延展。支持它的控制器在释放 SCL 后,要等待引脚读回为高,再开始有效高电平阶段并推进采样。单纯计满内部计数器就认定 SCL 已升高,会忽略目标仍在拉低或线路上升尚未完成的情况。延展属于需按系统配置确认的能力,见 UM10204 第 3.1.9 节。

FPGA 实现与上板检查

可先划分引脚读回/同步、位时序、字节握手和事务状态机。输入同步或滤波会引入延迟,应结合系统时钟和协议时序预算。若只实现单控制器,应明确不支持多控制器仲裁,不能把该模块直接称为适用所有 I²C 系统。

调试时先测 SDA/SCL 空闲电平及上升沿,再观察地址、应答和 Sr。仿真可让目标模型延展 SCL、产生 NACK 或保持总线忙;工程上为等待过程设计可配置超时及退出状态,具体期限按目标器件和应用确定。复位后的模块先释放线路,不要未经检查就强行驱动总线。

内部状态机不会替代上拉、电平转换器、缓冲器或隔离器。使用外部接口器件时,还需检查双向传输、延展兼容性与传播延迟;仅靠 RTL 仿真无法验证这些板级条件。

延伸阅读

信息来源