2

我正在研究 PIC16F88X 的 I2C 协议。我想做的是根据 I2C 上接收到的数据使 I2C 从机能够进行 ACK 或 NACK。

PIC 可以对在线发送的 I2C 地址进行 ACK 或 NACK,但从我读到的内容来看,它总是会在后续接收到的字节上进行 ACK。那是对的吗?

在以下通讯中:

Start - I2c_Addr+write/ACK - Register_value/Nack

我希望从站能够根据寄存器_值中的值进行确认或确认。如果从机不了解寄存器_值,它不应该 Ack。

有人可以确认这是不可能的,还是告诉我该怎么做?

4

2 回答 2

9

假设您使用 MSSP 外设

简短的回答:使用 PIC 可能无法实现您的要求,至少在 I/O 线路没有一点敲打的情况下。原因是在第 9 个时钟沿检查 ack/nack,直到第 9 个时钟结束才触发 SSPIF 中断。您可以尝试在数据字节移入 I/O 寄存器(第 8 个时钟)后立即重复检查 BF 位。如果您可以在第 9 个时钟周期之前进行比较并设置 SSPOV 位,这应该会产生 NACK,如果您有任何中断正在运行,这将是非常粗略的。

更长的答案:听起来您试图验证从站接收到的数据字节是否有效或不使用 ack。我个人不会这样做,ack 是为了表示线路的完整性,而不是验证数据的完整性。如果设备是从设备,则根据定义,主设备必须确切地知道它是如何工作的,并且可以在将字节推送到 I2C 线路之前检查字节的有效性。在这种情况下,我假设您还可以控制 I2C 主控代码,使用一个通用头文件来定义可以发送的所有命令或有效数据字节,以避免代码中的不匹配。

如果出于某种原因必须保证发送了正确的字节,请让主机向从机请求响应字节,让从机返回一个代码,指示先前传输的结果。

如果您的目的是保证 I2C 线路的完整性,那么这些方法都没有真正起作用。您唯一的选择是在启动时发送大量字节或定期使用 CRC 并检查它是否与从机匹配。通常 I2C 线要么工作要么不工作,它们速度低,通常走线短,允许的总线电容很高,如果它们不工作,你根本看不到任何 ack。

于 2009-06-04T05:10:53.470 回答
1

如果 I2C 硬件内置在 PIC 中,我的猜测是没有。我使用过的所有硬件解决方案都有一个状态机,除非传输出现问题(例如丢失一点),否则它会不由自主地确认第二个字节。您最好在软件中使用 bit-banging 和用于 ACK 的开放式收集器缓冲区来实现自己的 I2C。然后你可以做任何你想做的事情。它不是 I2C 标准,因此请注意是否将任何不符合您的规格的设备放在总线上。我不确定,但我认为对于任何标准 I2C 设备,如果它没有收到 ACK,它可能会重新传输数据或只是故障,因为它不确定故障后谁控制了总线(由 NAK 表示)。

于 2009-06-04T01:06:42.160 回答