Pregunta

Plataforma - ARM9

Tengo un dispositivo de terceros conectado a través de I2C al ARM9. Mi problema es que la lectura / escritura de I2C se está torciendo. Parece que la línea IRQ se afirma pero nunca se desactiva cuando hay datos para leer. La lectura falla cuando el dispositivo de terceros NACK el paquete de direcciones. Entonces, cualquier escritura posterior falla.

Me pregunto si mi manejo de interrupciones está bien. En el ISR que da servicio a la IRQ, desactivo las interrupciones, anulo el registro del controlador de interrupciones y luego señalo a la tarea que vaya a leer desde el bus I2C. Finalmente, vuelvo a habilitar las interrupciones.

Cuando la tarea da servicio a la señal publicada anteriormente, intento leer los datos del bus I2C pero esto falla. Finalmente, siempre vuelvo a registrar el ISR después de haber leído el intento. No hay interrupción de deshabilitación / habilitación que tiene lugar durante el manejo de la señal de lectura.

Mi pregunta es: ¿necesito desactivar las interrupciones al leer / escribir en el bus I2C?

El lenguaje de programación elegido es c usando RTOS de propiedad.

¿Fue útil?

Solución

Una cosa importante es si su RTOS / sistema está listo para admitir excepciones anidadas. A menos que haya una buena razón para hacerlo, las cosas son más simples si evita las excepciones anidadas y deshabilita todas las interrupciones al ingresar a un ISR y se vuelve a habilitar al salir.

Si desea permitir que ocurran otras interrupciones de mayor prioridad mientras está prestando servicio a la interrupción I2C, desactive solo la interrupción I2C. Es bastante inusual anular el registro de un controlador de interrupciones al ingresar a un ISR. Esto puede conducir a un comportamiento inesperado, cuando no hay un controlador registrado, la interrupción se habilita y se produce una interrupción. Entonces, en lugar de anular el registro del controlador, simplemente deshabilite la interrupción I2C (tal vez ya lo esté haciendo, pero como lo veo, registrar un controlador y habilitar una interrupción son dos cosas diferentes).

Una buena estrategia para resolver su problema será tratar de comunicarse con el dispositivo sin interrupciones. Intenta leer / escribir de manera serial, no importa si todo se bloquea, solo se trata de probar. Esto es mucho más fácil de depurar y después de que tenga éxito puede pasar a la versión de interrupciones.

Otros consejos

La mayoría de las interrupciones deben confirmarse o eliminarse. Usted menciona habilitar / deshabilitar, registrar / anular el registro y manejar la interrupción. Simplemente verifique que la interrupción se reconozca y / o se borre / restablezca. A menudo, esto implica escribir el número o bit de interrupción en el registro pendiente de interrupción. Consulte el manual ARM específico o su manual RTOS.

Si necesita habilitar / deshabilitar las interrupciones para su plataforma de destino depende de su implementación específica de hardware / RTOS. Desafortunadamente, cada proveedor de microcontroladores ARM (STMicro, Freescale, Oki, etc.) tiene la capacidad de implementar su hardware I2C de manera diferente y puede tener diferentes requisitos sobre cómo borrar la IRQ.

Recomiendo que encuentre una copia de la hoja de datos de hardware (y / o publique el número de pieza de hardware específico aquí para que podamos ayudarlo a revisar la documentación del proveedor, con usted).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top