¿Qué es el I2C ACK y cómo lo detecto?

Estoy escribiendo un controlador FPGA en Verilog para un sensor de temperatura (hoja de datos disponible aquí ). El protocolo de comunicación es SMBus, un primo cercano de I2C. Ahora, leyendo la hoja de datos, entiendo que la señal ACK se compone de dos partes (consulte la página 10, figura 5):

  1. Primero, SDA se reduce en el noveno ciclo de reloj.
  2. Luego, SDA se "aumenta" (se eleva, luego se reduce inmediatamente) entre los ciclos de reloj 9 y 1

Esto parece contradecir este tutorial donde se afirma que un ACK simplemente se realiza al reducir el SDA (no se menciona ningún "pico").

¿Este "pico" está realmente incluido en la señal ACK? Si es así, ¿cómo debo detectar el "pico"?

ingrese la descripción de la imagen aquí

Eche un vistazo a este archivo en la sección 6.2. Esa parece ser la especificación del I2C.
@AndrejaKo: Gracias, pero desde mi perspectiva, el enlace está muerto.
@AndrejaKo: ese es un documento antiguo (¡de 1995!). La versión más reciente de la especificación, febrero de 2012, está aquí
IIC ACK es efectivamente una violación del protocolo de transferencia de datos IIC que se utiliza para señalar la recepción de un bloque de datos completo. Cualquier pico es incidental. Siempre y cuando siga las instrucciones y cumpla con los requisitos de tiempo, cuando otras señales suban o bajen (generar lo que podría verse como "picos" no tiene relevancia. Tenga en cuenta que "impulsado alto e inmediatamente bajo" NO es algo que esperar obtener de una descripción de la hoja de datos. IIC es esencialmente independiente del tiempo siempre que se cumplan los tiempos de configuración y espera. Es decir, no como, por ejemplo, las comunicaciones en serie asíncronas o síncronas que dependen de la frecuencia del reloj
En un bus multipunto de drenaje abierto no hay "conducción alta". El desagüe abierto solo puede conducir bajo. Lo contrario es "liberación de autobús".
@Russell: ¿por qué lo llama una violación?
Wow, estás pasando por muchos problemas para evitar simplemente leer las especificaciones. Si solo lo lee, verá exactamente qué es el bit ACK y cuáles son sus reglas.
@Russell: no veo cómo ACK es una violación. Las secuencias de inicio y parada son violaciones deliberadas de la regla de que SDA solo puede cambiar cuando SCL es bajo, pero ACK no viola esta regla.
Olin / Steven: tal vez el desvanecimiento del cerebro y la no exposición prolongada de mi parte. El cerebro ofreció una "respuesta" como una violación y otra parte del cerebro la adjuntó a ACK y no a iniciar/detener. Mucho tiempo sin jugar IIC.
@Olin: nunca antes había golpeado I2C, así que nunca tuve que preocuparme por el lanzamiento del bus. La lectura de la hoja de datos debería responder a todas sus preguntas, pero aquí la hoja de datos es ambigua, muestra un lanzamiento de bus en un diagrama y luego nunca habla de eso. Llamo error de especificación.
¿El hardware en sí mismo no se encarga del ACK? ¿Necesitas detectarlo en el software?

Respuestas (3)

La especificación dice que el ACK consiste en un nivel bajo después del octavo pulso de reloj, como se muestra en este diagrama:

ingrese la descripción de la imagen aquí

El bus maestro generará un noveno pulso de reloj para leer el nivel. La especificación no habla de pulsar ACK, y el maestro tampoco lo notará. Siga las especificaciones y cuide la configuración de datos y los tiempos de espera (250 ns y 5 m resp. para el modo estándar) para asegurarse de que el nivel se detecte correctamente.

Lo que ve como un pico en el ACK no es parte del ACK, sino una liberación de bus entre el ACK y un primer bit de datos de bajo nivel de la siguiente palabra. La liberación del bus se produce después de que SCL vuelve a estar bajo, tanto en su diagrama como en el mío. De acuerdo con el diagrama anterior, se requiere esta versión; tenga en cuenta que el nivel bajo de SDA después de ACK se interrumpe, lo que indica que SDA debe subir.

Nota: la liberación del bus no se muestra en el diagrama de temporización, figura 38, ni se da la temporización en las características de CA. No pude encontrar ninguna referencia a él en el texto de la especificación. Tampoco hay actividad de SCL durante este máximo de SDA. Esto sugiere que la liberación del bus no es realmente necesaria. En ese caso, el diagrama contiene un error, aparentemente copiado por otros, como en la hoja de datos de TMP175.

editar
Madmanguruman comenta que el ACK proviene del esclavo, mientras que el siguiente bit de datos proviene del maestro. Este será a menudo el caso, y tiene razón. Sin embargo, el siguiente bit de datos también vendrá del esclavo, si es la respuesta del esclavo a un comando de lectura. Entonces tendría perfecto sentido que el esclavo no suelte el bus.

Ya veo, gracias. Todavía estoy desconcertado por este pico que veo en el diagrama de tiempo de la hoja de datos. ¿Qué podría ser?
@Randomblue No es un pico. El bus se libera después del ACK y sube. SCL es bajo aquí, recuerde, por lo que SDA puede cambiar. El primer bit que se transmite después del ACK es 0, por lo que SDA se reduce. Si el primer bit que se transmite después del ACK es 1, simplemente permanecerá alto.
@Madmanguruman: correcto, pero la pregunta es: ¿debe liberar el bus entre ACK (bajo) y el primer bit del siguiente byte si es cero (también bajo)? En ese caso, también podría mantener el nivel bajo. Graph dice que debe liberar el bus entre ambos niveles bajos, pero esto no se confirma en el resto de la especificación.
@stevenvh El ACK es el receptor que mantiene bajo el SDA. El receptor tiene que liberar el bus para permitir que el transmisor se comunique; ¡no tiene conocimiento previo del siguiente bit!
@Madmanguruman - Buen punto. Sin embargo, el siguiente byte puede ser una respuesta del receptor cuando el maestro ejecuta un comando de lectura.

Estaba tratando de hacer funcionar un DAC I2C el otro día y tuve esta misma pregunta. El host/maestro del bus envía un byte a un dispositivo y, una vez que el dispositivo lo recibió correctamente, baja la línea de datos (SDA) para indicarle al maestro del bus que se recibió el byte. La hoja de datos del DAC mencionó una prueba de conectividad del dispositivo al buscar el ACK del dispositivo. Al tener acceso solo a un osciloscopio analógico, rápidamente descubrí que el DAC probablemente no estaba enviando ACK, porque el marco en el bus en serie solo era lo suficientemente largo para un solo byte, mientras que esperaría tres bytes consecutivos. Además de eso, no pude encontrar un ACK convincente en la señal (un bit bajo). Pensé que el maestro/anfitrión del bus podría ser lo suficientemente inteligente como para no enviar el segundo byte si no recibía un ACK del receptor, el DAC. Eso explicaría por qué vi mensajes demasiado cortos pasando el bus I2C. Dado que el DAC es un dispositivo bastante simple, la única opción que se me ocurrió fue usar una dirección de dispositivo incorrecta. Así que comencé a tratar de direccionar el DAC con diferentes direcciones y, rápidamente, detecté un cuadro en el bus serie que era mucho más largo que los demás.

Ahora, para responder a su pregunta: una vez que pude abordar con éxito el DAC, noté un efecto interesante. Con mi sonda de alcance conectada cerca del DAC, el pulso ACK era claramente visible en el alcance analógico. Donde todos los bits enviados desde el host tenían un cierto nivel de voltaje mínimo, los pulsos ACK se extrajeron mucho mejor a 0V. Entonces, por ejemplo, los bits 0 enviados desde el host medirían alrededor de 0,2 V, los ACK medirían 0,1 V. Los valores en este ejemplo están inventados para ilustrar mi punto. Esto hizo que los pulsos ACK se destacaran claramente del resto del flujo de datos.

Cualquier transacción I2C en curso se cancelará si SDA cambia mientras SCK es alto. Cualquier dispositivo I2C que desee afirmar o liberar SDA debe hacerlo en un momento en el que pueda estar seguro de que SCK no aumentará. Hay dos formas en que un dispositivo puede estar seguro de que SCK no aumentará: (1) puede estar afirmando SCK en sí mismo, o (2) si ve un borde descendente en SCK, puede saber que SCK permanecerá bajo por un cierta cantidad mínima de tiempo (dependiendo de la velocidad del autobús). Debido a que la mayoría de los dispositivos esclavos I2C nunca afirman SCK por sí mismos, la única vez que pueden cambiar de manera segura lo que están emitiendo en SDA es inmediatamente después de un borde descendente de SCK.

Sin embargo, un maestro I2C es libre de cambiar el estado en SDA en cualquier momento en que esté afirmando SCK. Para leer el estado del bit ACK de un dispositivo remoto, el maestro debe liberar SDA antes del flanco ascendente del reloj que sigue al ACK, y debe dejarlo liberado hasta después del siguiente flanco descendente de SCK. Incluso si el primer bit transmitido después del "reconocimiento" debe ser un "0", el maestro debe demorar entre la afirmación de SCK y la afirmación de SDA. El hecho de que los esclavos reaccionen inmediatamente a un flanco descendente en SCK, mientras que los maestros deben agregar un retraso entre la activación de SCK y SDA, significa que en una "transferencia" de control del esclavo al maestro, a menudo habrá un breve momento cuando ninguno de los dispositivos considerará apropiado afirmar SDA (técnicamente, el retraso mínimo requerido entre el maestro '

Por cierto, si ningún esclavo usa la extensión del reloj, uno puede decir fácilmente en un diagrama de alcance qué cambios de SDA son causados ​​por el maestro y cuáles son causados ​​por el esclavo. Si SDA cambia al mismo tiempo que SCK cambia de alto a bajo, el cambio es causado por el esclavo. Si SDA cambia en cualquier otro momento, el cambio lo provoca el maestro.