【问题标题】:PIC I2C slave ack on dataPIC I2C 从机确认数据
【发布时间】:2010-10-30 22:18:40
【问题描述】:

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

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

在以下通信中:

Start - I2c_Addr+write/ACK - Register_value/Nack

我希望从站能够根据 Register_value 中的值进行 Ack 或 Nack。如果slave不理解Register_value,就不应该Ack。

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

【问题讨论】:

  • 快速澄清问题:在这个 I2C 交易中,您的 PIC 将成为主机还是从机(或两者兼而有之)?
  • 两个 PIC,一个从属和一个主控。问题似乎出在从属设备上(决定 NAck 一个不相关的寄存器)。你可能在考虑多主?如果您是并且您有信息要提供,请不要犹豫回复...

标签: embedded pic i2c


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    假设您使用 MSSP 外设

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

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

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

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

    【讨论】:

    • 感谢您的精彩回答,这是我所期望的(不幸的是)。我也想到了 BF 位,如果在 BF 上有一个中断就好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多