I2C enmarca cada grupo de bytes de mensaje en condiciones de START y STOP, definidas como SDA cambiando el estado 1>0 o 0>1 (respectivamente) mientras SCL está alto, como se describe ici .
Estoy escribiendo manejadores controlados por interrupciones para el PIC32MX170, y llegué bastante lejos usando el bit de STOP como señal al software de que el mensaje ha terminado. Esto permite cosas como la comprobación de la cuenta de bytes rx/tx y así sucesivamente. Encontré que la comprobación de la bandera de STOP en el software era bastante fiable, con la combinación de hardware y reloj que utilicé.
Sin embargo, ahora descubro que no es fiable en absoluto: el uso de un reloj más rápido o un controlador más lento significa que el ISR puede salir y perder el bit de STOP por completo. Peor aún, como el siguiente byte será el START de un nuevo mensaje, no hay manera de saber si alguna vez llegó (a menos que te sientes a sondear el bus, que no es realmente el tipo de cosa que quiero en un ISR, incluso con el tiempo de espera).
Sin embargo, el código que depende de combinaciones defectuosas de hardware y relojes también es bastante malo, así que me estoy enfrentando a un rediseño que asume que los bits de STOP no son fiables (por suerte no intento hacer cuentas de bytes variables).
(Algunos uC's siempre levantan una interrupción en STOP, pero desafortunadamente no este, por lo que puedo decir).
Pero esto plantea la pregunta: ¿debe un ISR esperar en el bit de STOP? Si es así, ¿por cuánto tiempo? ¿Hay algo en las especificaciones sobre esto?
EDITAR: Añado alguna información, ya que quizás no me expresé con total claridad en mi original. Mi pregunta se refería realmente a los medios para detectar el inicio y la parada del mensaje, lo que por supuesto es esencial. (Más adelante se discute sobre asuntos relacionados, como en qué parte del código se realiza la decodificación, lo cual también es muy valioso, pero no es lo que yo preguntaba).
El problema es básicamente que, aunque las condiciones de START y STOP (S y P) (en realidad los bits de estado que las señalan en el dispositivo) no siempre se establecen cuando el ISR se ejecuta, aunque sea la última vez para el mensaje. (También está la cuestión de si el ISR necesita mirar esos bits, lo que creo que tiene que ver más con el diseño del sistema, pero también es interesante y relevante).
Además de las banderas S/P, también hay banderas que le indican el tipo de byte que acaba de recibir: Dirección R/W y Datos R/W. Address Write siempre señala el inicio de un mensaje. Después de este punto se debe observar una cierta estructura, que puede implicar condiciones S repetidas y así sucesivamente. Dependiendo de cómo diseñes tu protocolo de mensajes (especialmente si soportas longitudes variables o no) estos también pueden ser usados para entender la estructura del mensaje. De esto trata la pregunta.