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)的常见原因。
FT5x06 I2C 从机地址与读写位结构 FT5x06 I2C 从机地址与读写位结构 A6 A5 A4 A3 A2 A1 A0 R/W 0 1 1 1 0 0 0 0/1 7位地址

3.2 读写时序详解

FT5x06 的 I2C 通信遵循标准的 复合格式(Combined Format)。写操作通常用于设置寄存器地址,而读操作用于获取触摸数据。一次完整的寄存器读取需要先进行“伪写”来指定寄存器地址,然后重新发起起始条件进行读取。

3.2.1 写操作时序(向寄存器写入数据)

  1. 起始条件(S): 主机拉低 SDA,同时 SCL 为高。
  2. 发送从机地址 + 写位: 主机发送 0x70,等待 FT5x06 应答(ACK)。
  3. 发送寄存器地址: 主机发送 8 位寄存器地址(如 0x00),等待 ACK。
  4. 发送数据: 主机发送 8 位数据,等待 ACK。可连续发送多字节。
  5. 停止条件(P): 主机拉高 SDA,同时 SCL 为高。

3.2.2 读操作时序(从寄存器读取数据)

  1. 起始条件(S): 主机拉低 SDA,同时 SCL 为高。
  2. 发送从机地址 + 写位: 主机发送 0x70,等待 ACK。
  3. 发送寄存器地址: 主机发送要读取的寄存器地址,等待 ACK。
  4. 重复起始条件(Sr): 主机再次产生起始条件,不发送停止条件。
  5. 发送从机地址 + 读位: 主机发送 0x71,等待 ACK。
  6. 读取数据: 主机读取 8 位数据,每读取一个字节后发送 ACK(继续读)或 NACK(最后一个字节)。
  7. 停止条件(P): 主机发送 NACK 后,产生停止条件。
FT5x06 I2C 读操作时序图 FT5x06 I2C 读操作时序(复合格式) S 0x70 A RegAddr A Sr 0x71 A Data N P 阶段1: 伪写 阶段2: 设置地址 阶段3: 重复起始 阶段4: 读取数据 关键点:读操作必须通过“伪写”先指定寄存器地址,再通过“重复起始条件”切换为读模式。

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. 步骤1: 通过 I2C 写操作,将起始寄存器地址 0x00 写入 FT5x06。
  2. 步骤2: 通过 I2C 读操作,连续读取 0x00 到 0x06 共 7 个字节的数据。
  3. 步骤3: 解析 TD_STATUS(地址 0x02)的低 4 位,获取有效触摸点数。
  4. 步骤4: 根据触摸点数,从 TOUCH1_XH 和 TOUCH1_XL 组合出 X 坐标,从 TOUCH1_YH 和 TOUCH1_YL 组合出 Y 坐标。
  5. 步骤5: 将解析后的坐标数据上报给输入子系统。
坐标组合公式:
X = (TOUCHn_XH & 0x0F) << 8 | TOUCHn_XL;
Y = (TOUCHn_YH & 0x0F) << 8 | TOUCHn_YL;

注意:高字节寄存器的高 4 位通常用于存储触摸事件标志(如触摸ID或事件类型),因此需要掩码 0x0F 来提取有效的坐标数据。

FT5x06 寄存器访问流程 FT5x06 寄存器访问流程(读取触摸数据) 开始读取触摸数据 I2C写:发送寄存器地址 0x00 I2C读:连续读取 0x00 ~ 0x06 (7字节) 解析 TD_STATUS 获取触摸点数 组合坐标并上报输入子系统 关键寄存器 0x02: TD_STATUS 0x03-0x06: 坐标数据 掩码 0x0F 提取坐标

3.4 调试要点与常见问题

常见调试问题:
  • I2C 无应答(NACK): 检查从机地址是否正确(0x38),以及 I2C 总线是否被拉死(SCL/SDA 电平异常)。
  • 读取数据全为 0xFF: 通常是因为未正确执行“伪写”步骤,直接发送了读命令。务必先写寄存器地址,再重复起始读。
  • 坐标数据异常: 检查坐标组合时是否遗漏了高字节的掩码 0x0F,导致事件标志位污染了坐标值。
  • 时序不匹配: FT5x06 支持标准模式(100kHz)和快速模式(400kHz)。若主控 I2C 频率过高,可能导致通信失败,建议先使用 100kHz 调试。