在I2C中,“收到NACK”是什么意思?


8

我正在阅读有关I2C的信息。在此站点上:

http://playground.arduino.cc/Main/WireLibraryDetailedReference#endTransmission

它说endTransmission()可以返回以下状态代码之一:

  • 0:发送成功。
  • 1:发送缓冲区对于twi缓冲区而言太大。这不会发生,因为在twi.h中设置的TWI缓冲区长度等于在Wire.h中设置的发送缓冲区长度。
  • 2:地址已发送,并且收到了NACK。这是一个问题,主机应发送一个STOP条件。
  • 3:发送数据并接收到NACK。这意味着从站不再有要发送的信息。主机可以发送STOP条件,或重复启动。4:发生另一次twi错误(例如,主机丢失总线仲裁)。

如果我没有在Arduino上连接任何东西(或者在SDA / SCL上都带有上拉电阻),我将始终处于状态2。但是,当没有任何可通信的内容时,如何接收NACK(或其他任何东西)呢?这还意味着其他吗?

这是我的示例代码

#include "Wire.h"
void setup() {
  Serial.begin(9600);
  Wire.begin();
}
void loop()  {
  Wire.beginTransmission(42);
  Wire.write(0);
  byte status = Wire.endTransmission();
  Serial.println(status); // always prints 2
}

Answers:


9

A NACK由确认时隙发出信号,该确认时隙在主机控制下SDA保持高电平SCL

由于上拉总线的非驱动状态为高电平,因此在所选地址上没有外设以通过下拉将其肯定地确认时,NACK被动产生条件。


您能详细说明一下吗?您的意思是外围设备未连接?如何能够获取数据一段时间,然后停止工作并保持返回0x02?
Dzung Nguyen

3
意味着外设无法响应的任何事情都可能导致此情况-没有外设,断线或断线,错误的地址,使地址看起来不正确的噪声,弱上拉使数据失真,不可思议的强上拉使信号失真,电源不良,软件故障或硅片外设的设计,甚至对时钟扩展等扩展的支持都不匹配。
克里斯·斯特拉顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.