2009-06-03 76 views
2

我正在研究PIC16F88X的I2C协议。 我想要做的是根据I2C上接收到的数据,使I2C从器件发送ACK或NACK信号。PIC I2C从器件数据确认

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

在下面的通信:

Start - I2c_Addr+write/ACK - Register_value/Nack 

我想从能够ACK或NACK取决于注册_值的值。如果从设备不了解Register _的值,则不应该确认。

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

+0

快速说明问题:您的PIC将成为此I2C事务中的主器件还是从器件(或两者)? – Nate 2009-06-03 11:59:12

+0

两个PIC,一个从机和一个主机。问题似乎在奴隶(决定NAck一个不相关的登记册)。 你可能在想多个主人?如果你是和你有信息给,不要犹豫,回答... – Gauthier 2009-06-03 12:57:22

回答

7

假设你使用MSSP外设

简短的回答:是你的要求可能不能够以PIC,至少在没有位模拟I/O线。原因是在第9个时钟边沿检查ack/nack,直到第9个时钟结束才触发SSPIF中断。当数据字节移入I/O寄存器(第8个时钟)后,您可以尝试重复检查BF位,因为它会被置位。如果您可以在第9个时钟周期之前关闭比较并设置SSPOV位,则会产生一个NACK,如果您有任何中断正在运行,则这非常粗略。

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

如果您必须保证由于某种原因发送了正确的字节,请让主设备向从设备询问响应字节,让从设备返回一个代码,指示上次传输的结果。

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

1

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