sobre cómo obtener el ACK correcto en TWI

-2

está bien, soy un antiguo EE que en su mayoría solo escribe código DSP y busca en MATLAB. pero de vez en cuando me meto en cosas más concretas.

y, en realidad, este código de TWI-bit banging parece funcionar, es solo que lo estaba examinando (y refactorizando) y encontré algo que me parece dudoso.

entiendo que los dispositivos esclavos TWI hacen lo que hacen en el flanco ascendente del reloj SCL. el maestro TWI escribe el bit SDA en algún momento de configuración antes del borde ascendente de SCL y el esclavo lee la línea SDA en algún momento después del borde ascendente de SCL. También entiendo el colector abierto o el drenaje abierto.

mi pregunta es, ¿no tiene el maestro que asegurarse de que se escribe un "1" en SDA después de el último bit de datos (el LSB) está escrito y bloqueado, de modo que la línea SDA está en el estado de drenaje abierto para que cuando el esclavo escriba ACK (0) o NACK (1) el maestro pueda leerlo correctamente?

me parece que si el maestro escribe un 0 a SDA como el LSB (el último bit de datos) y lo deja en ese estado, cuando el maestro lee el bit de ACK, siempre regresará como 0 (ACK) incluso cuando el esclavo quiere enviar un NACK.

actualmente, en este código TWI, están leyendo el ACK y guardándolo en una palabra en algún lugar, lo probé y nunca sale diferente a 0 o ACK, pero Me pregunto si algo está mal y si un NACK es enviado de vuelta, nunca lo sabremos. estos son bytes de control-registro que van a un códec y muchos de esos bytes son solo cero y los que no suelen ser 0 para el LSB. así que me pregunto si estamos haciendo imposible que se detecte un NACK.

gracias por cualquier información de los bit-bangers experimentados.

    

2 respuestas

4
  

mi pregunta es, ¿no tiene el maestro que asegurarse de que se escribe un "1" en SDA después de que el último bit de datos (el LSB) esté escrito y bloqueado, de modo que la línea SDA esté en estado de drenaje abierto? que cuando el esclavo escribe ACK (0) o NACK (1) el maestro puede leerlo correctamente?

Sí, y no. Se supone que el Máster libera la línea, lo que permite que se establezca de manera predeterminada en el estado abierto, que es levantado por las resistencias de pull-up i2c. En realidad, esto es lo mismo que escribir un 1 , pero no se conoce como tal, porque es una forma confusa de expresarlo. Normalmente, se libera SDA al poner el pin en un modo de entrada High-Z.

Habiendo escrito una biblioteca i2c de bit banged, sugeriría una forma de probar tu código. Intenta escribir en una dirección de esclavo inexistente. Si recuperas un ACK (0), algo no está bien con tu código. Un esclavo inexistente no puede reducir el SDA, por lo que siempre debe obtener un NACK (1) cuando se habla con una dirección incorrecta.

    
respondido por el Passerby
2

TWI es el mismo que I2C, pero evita problemas de derechos de autor, Philips (ahora NXP) posee los derechos de autor. ( especificación I2C )

Tenga cuidado al usar la terminología Maestro y Esclavo, gran parte del protocolo es el mismo para maestro y esclavo y las diferencias dependen de si la unidad está transmitiendo o recibiendo.

El transmisor impulsa la línea SDA mientras el reloj está bajo y lo deja estable mientras el reloj está alto. De nuevo, es lo mismo si el maestro o el esclavo lo están haciendo. El único lugar donde se viola esta regla es en la generación de los bits de parada e inicio que realiza el maestro.

El ACK puede ser controlado por la unidad receptora, independientemente de si es el maestro o el esclavo. Seguir la dirección del esclavo significa que se reconoce la dirección, después de una escritura significa que el esclavo ha aceptado los datos y puede recibir más. Si no se reconoce la dirección o si no puede aceptar más datos, el pull-up deja que la línea se eleve (¡no se maneja alto!). Después de una lectura, es el maestro el que ACKS o NACKS indican si la transacción se ha completado ya que el maestro es el receptor en esa instancia.

La unidad transmisora obviamente tiene que asegurarse de que SDA no se active para el noveno bit, o la unidad receptora no podrá tirar de la línea baja o no indicar su estado.

    
respondido por el Kevin White

Lea otras preguntas en las etiquetas