You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FT201X I2C-Slave内部发送缓冲区清空失效问题咨询

根因说明

FT201X工作在I2C从模式时,你调用的FT_PURGE_TX、FT_W32_PurgeComm以及FT_StopInTask/FT_RestartInTask组合仅作用于主机端的USB驱动层缓冲区,无法清空FT201X芯片内部的硬件I2C从机TX FIFO,因此I2C主设备读取时仍然会获取到FIFO中缓存的旧数据。

可行解决方案

  • 方案1:读空芯片侧TX FIFO(兼容性最高,无需修改硬件配置)
    在写入新的待发送数据前,先查询当前FIFO中积压的字节数,主动读取所有积压数据丢弃即可清空旧数据,参考代码如下:
DWORD txQueued = 0;
// 查询当前芯片侧TX FIFO中待发送的字节数
status = FT_GetQueueStatus(fthandle, &txQueued);
if (status == FT_OK && txQueued > 0) {
    BYTE* discardBuf = new BYTE[txQueued];
    DWORD bytesRead = 0;
    // 读出所有积压数据直接丢弃
    status = FT_Read(fthandle, discardBuf, txQueued, &bytesRead);
    delete[] discardBuf;
}
// 之后再写入新的待返回给I2C主设备的数据即可
  • 方案2:通过寄存器操作复位TX FIFO(执行速度更快)
    通过D2XX的厂商控制命令写FT201X的模式控制寄存器,触发内部TX FIFO硬件复位,参考操作:
// 发送I2C从机TX FIFO复位命令,0x02为FT201X厂商定义的TX FIFO复位控制码
status = FT_SendCommand(fthandle, 0x02, nullptr, 0);
if (status != FT_OK) {
    printf("FIFO reset failed %d\n", status);
}

注意事项

不要在I2C主设备正在读数据的时间段执行清空操作,避免出现读写冲突导致的异常数据;如果你每次返回给I2C主设备的数据包长度固定,也可以每次写入新数据前先写入相同长度的无效数据覆盖旧数据,也能达到类似效果。

内容的提问来源于stack exchange,提问作者boodoooo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:54:04