I2C enmarca cada grupo de bytes de mensaje en START y STOP, definidos como SDA que cambia el estado 1 > 0 o 0 > 1 (respectivamente) mientras que SCL es alto, como se describe aquí .
Estoy escribiendo controladores de interrupción para PIC32MX170, y llegué bastante lejos al usar el bit STOP como la señal al software de que el mensaje está listo. Esto permite, por ejemplo, verificar el recuento de bytes rx / tx y así sucesivamente. Encontré que probar el indicador de PARADA en el software es bastante confiable, con la combinación de hardware y reloj que usé.
Sin embargo, ahora descubro que no es confiable en absoluto: usar un reloj más rápido o un controlador más lento significa que el ISR puede salir y perder el bit STOP por completo. Peor aún, ya que el próximo byte será el INICIO de un nuevo mensaje, no hay forma de saber si alguna vez llegó (a menos que se siente allí a sondear el autobús, que no es realmente el tipo de cosa que quiero en un ISR, incluso con tiempo límite) ).
Sin embargo, el código que depende de combinaciones escandalosas de hardware y relojes también es bastante malo, por lo que me enfrento a un rediseño que asume que los bits de PARADA no son confiables (por suerte, no intento hacer cuentas de bytes variables).
(Algunos uC siempre provocan una interrupción en STOP, pero desafortunadamente no esta, por lo que puedo decir)
Pero esto plantea la pregunta: ¿debería un ISR esperar en el bit STOP? Si es asi, por cuanto tiempo? ¿Hay algo en la especificación sobre esto?
EDITAR: Estoy agregando información, ya que quizás no me expresé completamente en mi original. Mi pregunta fue realmente acerca de los medios para detectar el inicio y finalización del mensaje, lo cual, por supuesto, es esencial. (A continuación, se analizan algunos temas relacionados, como por ejemplo, en qué parte del código se realiza la decodificación, también es muy valioso, pero no es lo que pregunté).
El problema es básicamente que, aunque las condiciones de INICIO y DETENCIÓN (S y P) (en realidad los bits de estado que los señalan en el dispositivo) no siempre se configuran cuando se ejecuta el ISR, aunque esta podría ser la última vez que mensaje. (También está la cuestión de si el ISR necesita ver esos bits, lo que creo que es más sobre el diseño del sistema, pero también es interesante y relevante).
Además de los indicadores S / P, también hay indicadores que le indican qué tipo de byte acaba de recibir: Dirección R / W y Datos R / W. La dirección de escritura siempre indica el inicio de un mensaje. Después de este punto, debe observarse una cierta estructura, que puede implicar condiciones S repetidas y así sucesivamente. Dependiendo de cómo diseñe su protocolo de mensaje (especialmente si soporta longitud variable o no), estos también se pueden utilizar para comprender la estructura del mensaje. De esto se trata la pregunta.