2. I2C总线协议基础:物理层、时序与地址
I2C(Inter-Integrated Circuit)总线是嵌入式系统中使用最广泛的板级通信协议之一。FT5x06触摸屏控制器正是通过I2C接口与主控CPU交换触摸坐标数据。理解I2C的物理层特性、时序信号和数据帧格式,是编写正确驱动和排查硬件故障的前提。
2.1 I2C物理层:双线与开漏
I2C总线仅使用两根信号线:SCL(串行时钟线)和SDA(串行数据线)。所有设备都挂接在这两根线上,采用开漏(Open-Drain)输出结构,配合外部上拉电阻实现线与逻辑。
| 信号线 | 方向 | 电气特性 | 空闲状态 |
|---|---|---|---|
| SCL | 主设备输出,从设备可选时钟拉伸 | 开漏 + 上拉电阻 | 高电平 |
| SDA | 双向(主→从或从→主) | 开漏 + 上拉电阻 | 高电平 |
开漏结构的核心优势:多主设备仲裁。当两个主设备同时尝试驱动总线时,谁先输出低电平谁就赢得仲裁,输的一方自动释放总线。这种机制不需要额外的片选线。
2.2 起始条件与停止条件
I2C总线的数据传输由两个特殊的信号序列界定:起始条件(START)和停止条件(STOP)。这两个条件由主设备产生,且SCL和SDA的时序关系有严格定义。
- 起始条件(S):SCL为高电平时,SDA从高电平切换到低电平。
- 停止条件(P):SCL为高电平时,SDA从低电平切换到高电平。
- 重复起始条件(Sr):在未产生停止条件的情况下,再次产生起始条件。用于改变数据传输方向或切换从设备。
2.3 数据帧格式与有效窗口
I2C的数据传输以字节(8位)为单位,每个字节后跟随一个应答位(ACK/NACK)。数据在SCL的上升沿被采样,因此SDA必须在SCL低电平时变化,在SCL高电平时保持稳定。
- 数据有效窗口:SCL高电平期间,SDA必须保持稳定;SCL低电平期间,SDA允许变化。
- 字节传输顺序:MSB(最高位)先传输,LSB(最低位)最后传输。
- 应答位:第9个SCL时钟周期,接收方将SDA拉低表示ACK,保持高电平表示NACK。
2.4 7位地址与10位地址
I2C总线上的每个从设备都有一个唯一的地址。标准模式使用7位地址,最多支持112个设备(保留16个地址)。扩展模式使用10位地址,最多支持1024个设备。
2.4.1 7位地址帧结构
主设备发送起始条件后,首先发送7位从设备地址 + 1位读写位(R/W)。读写位为0表示写操作,为1表示读操作。这8位数据构成地址字节。
| 位序号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 含义 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | R/W |
| FT5x06示例 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0(写) |
FT5x06的7位I2C地址为0x38(二进制0111000)。写操作的地址字节为0x70,读操作的地址字节为0x71。
2.4.2 10位地址帧结构
10位地址使用两个字节传输。第一个字节的前5位固定为11110,后2位是地址的高2位(A9和A8),第8位是R/W。第二个字节是地址的低8位(A7~A0)。
| 字节 | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
|---|---|---|---|---|---|---|---|---|
| 第1字节 | 1 | 1 | 1 | 1 | 0 | A9 | A8 | R/W |
| 第2字节 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
i2c_client.addr字段存储7位地址。如果使用10位地址,需要设置I2C_CLIENT_TEN标志。FT5x06仅支持7位地址,驱动中直接使用0x38即可。
2.5 完整读写时序流程
结合上述知识点,一个完整的I2C写操作时序如下:
- 主设备产生起始条件(S)。
- 主设备发送7位地址 + 写位(0),等待从设备ACK。
- 主设备发送寄存器地址字节(如FT5x06的触摸点数据寄存器),等待ACK。
- 主设备发送数据字节(写操作时),每字节后等待ACK。
- 主设备产生停止条件(P)。
读操作在发送寄存器地址后,需要产生重复起始条件(Sr),然后发送7位地址 + 读位(1),之后主设备转为接收模式,每接收一个字节后发送ACK(最后一个字节发送NACK),最后产生停止条件。
2.6 常见I2C调试问题速查
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| SCL/SDA空闲电平为0V | 上拉电阻缺失或损坏 | 用万用表测量电阻两端,确认上拉到VDDIO |
| 起始条件后无ACK | 地址错误、从设备未上电、SCL/SDA短路 | 用逻辑分析仪抓取地址字节,核对FT5x06地址0x38 |
| 数据读取全为0xFF | 从设备未响应、时钟拉伸超时 | 检查FT5x06复位引脚和中断引脚电平 |
| 总线死锁(SCL被拉低) | 从设备时钟拉伸超时、主设备未释放总线 | 连续发送9个SCL时钟脉冲复位从设备状态机 |
| 数据错位或丢失 | SCL频率过高、总线电容过大 | 降低I2C时钟频率至100kHz测试 |