¿cuánto tiempo debe esperar un esclavo I2C por un bit de STOP (si es que lo hace)?

1

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.

    
pregunta dmb

4 respuestas

2

Realmente necesitas una arquitectura de firmware adecuada para algo como esto donde reaccionas ante eventos asíncronos externos que no están bajo tu control.

Las rutinas de interrupción deben atender el evento de hardware inmediato, y luego salirse del camino. Esto NO es donde se debe tratar el tiempo arbitrario entre eventos. Tampoco estoy donde deberías estar tratando de entender los eventos individuales a un nivel superior, como un mensaje completo de la CII.

La última vez que tuve que implementar un esclavo IIC en un dsPIC, usé el hardware para recibir eventos en una rutina de interrupción. Sin embargo, esa rutina de interrupción en su mayoría incluyó eventos en un FIFO. Ese FIFO fue luego drenado en tareas dedicadas separadas para interpretar los eventos como secuencias IIC y actuar sobre ellos. Esto funcionó bastante bien.

Respuesta a los comentarios

"Primer plano" significa ejecutar una tarea desde su bucle principal, ¿verdad?

Significa ejecutar desde el código de no interrumpir. Ya sea que se trate del bucle de eventos principal o de una tarea diferente, depende del diseño del firmware.

¿el ISR I2c tiene una prioridad más alta o más baja?

Más alto, obviamente. Eso es parte del punto de interrupciones. Si no estuvieran en una prioridad más alta, no podrían interrumpir nada.

si se está alargando el reloj mientras espera el mensaje, ¿no es eso lo que hace que funcione más, no más corto?

No. La rutina de interrupción no se ejecuta en absoluto durante el tiempo de estiramiento del reloj. La rutina de interrupción obtiene el byte de dirección. Empuja eso en un FIFO y sale. El código de primer plano interpreta el inicio del mensaje IIC, se da cuenta de que debe responder, llena un búfer de bytes de respuesta y habilita la interrupción del envío de bytes IIC. Esa interrupción ocurre inmediatamente. La rutina de interrupción recupera el primer byte del búfer y lo escribe en el hardware IIC. Eso termina el estiramiento del reloj e inicia el envío del primer byte de datos. La rutina de interrupción se cierra y se ejecuta nuevamente cuando el hardware IIC está listo para aceptar el siguiente byte de datos.

    
respondido por el Olin Lathrop
2

I 2 C tiene un bit de reconocimiento y una condición de parada . Estoy asumiendo operativamente que usted está preguntando por eso. Por favor, corrígeme si me equivoco.
(I 2 C no tiene un bit de parada .)

  

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?

La especificación I 2 C no cubre ningún tiempo de espera. En teoría, el esclavo esperará indefinidamente. Del mismo modo, el maestro esperará indefinidamente cuando el esclavo haga el estiramiento del reloj.

Podría introducir un tiempo de espera en el dispositivo esclavo. Sin embargo, tendría que abordar la siguiente capa de preguntas sobre el manejo general del tiempo de espera. Si el esclavo se había agotado, eso significa que la comunicación se corrompió. ¿Cómo enviará ese tipo de excepción al controlador maestro? ¿Intentas recuperarte? ¿Intenta apagar todo el sistema con gracia?

  

... combinaciones escandalosas de hardware y relojes ..., por lo que me enfrento a un rediseño que asume que los bits de PARADA no son confiables (por suerte no intento hacer conteos de bytes variables).

He estado en una situación similar . Consiga el hardware arreglado. Debe tener la condición de parada en I 2 C.

    
respondido por el Nick Alexeev
1

ISR debería no esperar. Siempre.

De hecho, no debería hacer ningún procesamiento de mensajes. Debe rellenar los datos recibidos en el búfer, ACKing cuando sea necesario, activar el indicador "listo" cuando se encuentre con una condición de parada y restablecer el contador del búfer al principio en la condición de inicio.

El programa principal puede comenzar a procesar el mensaje en paralelo. Puede controlar ISR mediante indicadores como "alargar el reloj, todavía no estoy listo para responder", etc.

O, si quieres ser elegante, crea varios buffers para que uno pueda llenarse mientras que el otro (s) se procesa en main (asumiendo que los mensajes entrantes no requieren una respuesta inmediata).

    
respondido por el Maple
0

No confíe en que el bit de parada esté presente en absoluto. No es necesario que una transferencia termine con un bit de parada. En muchos casos, las transferencias terminarán con un inicio repetido al comienzo de la próxima transferencia.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas