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
相关产品推荐
相关产品推荐

