假设您使用 MSSP 外设
简短的回答:使用 PIC 可能无法实现您的要求,至少在 I/O 线路没有一点敲打的情况下。原因是在第 9 个时钟沿检查 ack/nack,直到第 9 个时钟结束才触发 SSPIF 中断。您可以尝试在数据字节移入 I/O 寄存器(第 8 个时钟)后立即重复检查 BF 位。如果您可以在第 9 个时钟周期之前进行比较并设置 SSPOV 位,这应该会产生 NACK,如果您有任何中断正在运行,这将是非常粗略的。
更长的答案:听起来您试图验证从站接收到的数据字节是否有效或不使用 ack。我个人不会这样做,ack 是为了表示线路的完整性,而不是验证数据的完整性。如果设备是从设备,则根据定义,主设备必须确切地知道它是如何工作的,并且可以在将字节推送到 I2C 线路之前检查字节的有效性。在这种情况下,我假设您还可以控制 I2C 主控代码,使用一个通用头文件来定义可以发送的所有命令或有效数据字节,以避免代码中的不匹配。
如果出于某种原因必须保证发送了正确的字节,请让主机向从机请求响应字节,让从机返回一个代码,指示先前传输的结果。
如果您的目的是保证 I2C 线路的完整性,那么这些方法都没有真正起作用。您唯一的选择是在启动时发送大量字节或定期使用 CRC 并检查它是否与从机匹配。通常 I2C 线要么工作要么不工作,它们速度低,通常走线短,允许的总线电容很高,如果它们不工作,你根本看不到任何 ack。