3. FT5x06 I2C接口时序:从机地址、读写时序与寄存器访问流程
FT5x06 作为标准的 I2C 从设备,其通信协议严格遵循 I2C 总线规范。理解其从机地址、读写操作时序以及寄存器访问流程,是驱动开发和硬件调试的基础。本节将详细拆解这三个核心要素,并配合时序图与流程图进行说明。
3.1 I2C从机地址与读写位
FT5x06 的 7 位 I2C 从机地址是固定的,由芯片内部硬件决定,用户不可更改。该地址与读写位(R/W)组合,构成完整的 8 位首字节,用于总线上的设备寻址。
| 参数 | 值 | 说明 |
|---|---|---|
| 7位从机地址 | 0x38 |
高7位为 0111 000,即 0x38 |
| 写操作首字节 | 0x70 |
7位地址左移1位,最低位R/W=0 |
| 读操作首字节 | 0x71 |
7位地址左移1位,最低位R/W=1 |
调试提示: 使用逻辑分析仪抓取 I2C 波形时,通常直接显示 7 位地址
0x38。若使用示波器手动解析,需注意首字节是 8 位,写为 0x70,读为 0x71。地址错误是导致无应答(NACK)的常见原因。
3.2 读写时序详解
FT5x06 的 I2C 通信遵循标准的 复合格式(Combined Format)。写操作通常用于设置寄存器地址,而读操作用于获取触摸数据。一次完整的寄存器读取需要先进行“伪写”来指定寄存器地址,然后重新发起起始条件进行读取。
3.2.1 写操作时序(向寄存器写入数据)
- 起始条件(S): 主机拉低 SDA,同时 SCL 为高。
- 发送从机地址 + 写位: 主机发送
0x70,等待 FT5x06 应答(ACK)。 - 发送寄存器地址: 主机发送 8 位寄存器地址(如
0x00),等待 ACK。 - 发送数据: 主机发送 8 位数据,等待 ACK。可连续发送多字节。
- 停止条件(P): 主机拉高 SDA,同时 SCL 为高。
3.2.2 读操作时序(从寄存器读取数据)
- 起始条件(S): 主机拉低 SDA,同时 SCL 为高。
- 发送从机地址 + 写位: 主机发送
0x70,等待 ACK。 - 发送寄存器地址: 主机发送要读取的寄存器地址,等待 ACK。
- 重复起始条件(Sr): 主机再次产生起始条件,不发送停止条件。
- 发送从机地址 + 读位: 主机发送
0x71,等待 ACK。 - 读取数据: 主机读取 8 位数据,每读取一个字节后发送 ACK(继续读)或 NACK(最后一个字节)。
- 停止条件(P): 主机发送 NACK 后,产生停止条件。
3.3 寄存器访问流程
FT5x06 的寄存器空间主要用于配置芯片工作模式和读取触摸状态。驱动开发中最核心的流程是 读取触摸点数据。该流程遵循“先写地址,后读数据”的复合格式。
3.3.1 核心寄存器映射
| 寄存器地址 | 寄存器名称 | 位宽 | 功能描述 |
|---|---|---|---|
0x00 |
DEVIDE_MODE | 8 bit | 设备模式控制(0x00=正常模式) |
0x01 |
GEST_ID | 8 bit | 手势ID(如双击、滑动等) |
0x02 |
TD_STATUS | 8 bit | 触摸点状态(低4位表示有效触摸点数) |
0x03 |
TOUCH1_XH | 8 bit | 触摸点1 X坐标高字节 |
0x04 |
TOUCH1_XL | 8 bit | 触摸点1 X坐标低字节 |
0x05 |
TOUCH1_YH | 8 bit | 触摸点1 Y坐标高字节 |
0x06 |
TOUCH1_YL | 8 bit | 触摸点1 Y坐标低字节 |
3.3.2 读取触摸点数据流程
以下流程是 FT5x06 驱动中 read_touch_data() 函数的典型实现逻辑:
- 步骤1: 通过 I2C 写操作,将起始寄存器地址
0x00写入 FT5x06。 - 步骤2: 通过 I2C 读操作,连续读取
0x00到0x06共 7 个字节的数据。 - 步骤3: 解析
TD_STATUS(地址0x02)的低 4 位,获取有效触摸点数。 - 步骤4: 根据触摸点数,从
TOUCH1_XH和TOUCH1_XL组合出 X 坐标,从TOUCH1_YH和TOUCH1_YL组合出 Y 坐标。 - 步骤5: 将解析后的坐标数据上报给输入子系统。
坐标组合公式:
X = (TOUCHn_XH & 0x0F) << 8 | TOUCHn_XL;
Y = (TOUCHn_YH & 0x0F) << 8 | TOUCHn_YL;
注意:高字节寄存器的高 4 位通常用于存储触摸事件标志(如触摸ID或事件类型),因此需要掩码 0x0F 来提取有效的坐标数据。
3.4 调试要点与常见问题
常见调试问题:
- I2C 无应答(NACK): 检查从机地址是否正确(0x38),以及 I2C 总线是否被拉死(SCL/SDA 电平异常)。
- 读取数据全为 0xFF: 通常是因为未正确执行“伪写”步骤,直接发送了读命令。务必先写寄存器地址,再重复起始读。
- 坐标数据异常: 检查坐标组合时是否遗漏了高字节的掩码
0x0F,导致事件标志位污染了坐标值。 - 时序不匹配: FT5x06 支持标准模式(100kHz)和快速模式(400kHz)。若主控 I2C 频率过高,可能导致通信失败,建议先使用 100kHz 调试。