PIC I2C从机确认数据

Gau*_*ier 2 embedded pic i2c

我正在研究PIC16F88X的I2C协议.我想做的是根据I2C上接收的数据启用I2C从设备ACK或NACK.

PIC可以对线路上发送的I2C地址进行ACK或NACK,但根据我的读取,它将始终在后续接收的字节上进行ACK.那是对的吗?

在以下沟通中:

Start - I2c_Addr+write/ACK - Register_value/Nack
Run Code Online (Sandbox Code Playgroud)

我希望奴隶能够根据寄存器_值中的值来确认Ack或Nack .如果从站不理解寄存器_值,则不应该Ack.

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

Mar*_*ark 9

假设您使用MSSP外设

简短的回答:使用PIC可能无法满足您的要求,至少没有比特敲击I/O线.原因是在第9个时钟沿检查ack/nack,并且直到第9个时钟结束才触发SSPIF中断.只要数据字节移入I/O寄存器(第8个时钟),就可以尝试重复检查BF位.如果您可以在第9个时钟周期之前进行比较并将SSPOV位置1,则应生成NACK,如果您正在运行任何中断,这非常粗略.

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

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

如果您的目的是保证I2C线路的完整性,那么这些方法都不起作用.您唯一的选择是在启动时发送大量字节,或者使用CRC定期发送,并检查它是否与从站匹配.一般情况下I2C线路是否工作,它们是低速的,通常有短路径并且具有高容许总线电容,如果它们不能工作,你根本看不到任何ack.