当从机被请求发送时、我有一些 I2C 从机代码可以轮询 I2CSTR 中的 XRDY 位。
已注意到、在首次调用时、从器件发送工作符合预期。 在后续调用中、不设置 XRDY、并且从器件发送的第一个数据字节是来自上次调用的 Tx 缓冲区末尾的过时字节。
似乎在最后一次调用期间、从器件写入 I2CDXR、但主器件 NACKd 指示传输已完成、因此从器件从未将数据发送到 I2CXSR、数据仍在 I2CDXR 中、XRDY 位未设置。 因此、在下一次调用时、会首先发送这个旧字节。 在从器件发送循环之前将1写入 XRDY 似乎可以解决过时字节问题、但我注意到在 TRM 中 XRDY 指示为只读(R)、但在说明中它会输入 R/W。 根据我能告诉的信息、我可以向 XRDY 写入1、而不是0。
想知道在开始传输之前强制 XRDY 为1是否存在任何问题、或者是否有更干净的方法可以避免最后一个字节写入 I2CDXR? 谢谢!
如果(I2caRegs.I2CSTR.bit.AAS = 1 & I2caRegs.I2CSTR.bit.SDIR = 1)
{
I2caRegs.I2CMDR.bit.TRx = 1;
//I2caRegs.I2CSTR.bit.XRDY = 1; //取消此行的注释后,过时字节问题消失
while (I2caRegs.I2CSTR.bit.SCD == 0)
{
如果(I2caRegs.I2CSTR.bit.XRDY =>= 1)
{
I2caRegs.I2CDXR.all =*数据++;
}
}
I2caRegs.I2CSTR.bit.SCD = 1;
I2caRegs.I2CMDR.bit.TRX = 0;
}

