Cómo hacer que I2C se cierre mientras espera datos en el modo de transmisión maestra en LPC1114

3

Tengo un LPC1114 (FN28) para el que estoy escribiendo algún código. Actualmente estoy tratando de proporcionar una vista asíncrona de la interfaz I2C a mi código (el chip tiene un controlador I2C incorporado). El controlador en sí mismo es básicamente una máquina de estado, pero como la especificación I2C no especifica tiempo de espera u otras restricciones en la velocidad de reloj de SCL, debería poder retrasar el envío (no tiene que ser perfectamente sincrónico) siempre que el controlador controle SCL correctamente cuando se envían datos, y se mantiene bajo cuando no se envían datos.

La idea es poder almacenar datos en búfer para ser enviados en el bus I2C. Algunas bibliotecas que veo a mi alrededor se ocupan de esto simplemente almacenando en búfer todo y pegándolo todo a la vez, lo cual está bien la mayoría de las veces, ya que generalmente no se envían muchos datos a través de I2C, pero quiero hacerlo correctamente.

He configurado el código base y el problema que tengo cuando transmito datos es que cada vez que el controlador ingresa en el modo "transmitir datos al esclavo", activa una interrupción que me obliga a completar un byte de datos para enviar (o enviar una señal de parada). El problema es que si no hago nada, inmediatamente emite la misma interrupción, por lo que mi código principal no puede tener la oportunidad de ejecutar. Lo que quiero es la capacidad de decirle al controlador "No tengo bytes para enviar en este momento, así que no emita otra interrupción hasta que le diga que lo haga desde mi código principal".

He manipulado algo que funciona (ab?) usando el NVIC para deshabilitar la interrupción de I2C cuando estoy esperando datos y volver a habilitarlos cuando estoy listo para enviar en la interfaz de I2C, pero esto parece muy poco ortodoxo y no sé si es realmente confiable o incluso correcto, especialmente si, mientras tanto, al autobús se le ocurren cosas malas (error del bus, etc.)

Aquí está el manual del chip , los documentos para el controlador I2C están en la página 239. Pensé que podría usar el bit de control SI para decirle que no produzca una interrupción hasta que lo borre de nuevo, pero aparentemente no es para eso.

¿Alguien tiene experiencia con este u otros controladores I2C similares y sabe cómo puedo lograr lo que estoy buscando? Claramente, debe ser posible, ya que un protocolo en el que necesitas tener todos los datos listos por adelantado cada vez no me parece viable.

    
pregunta Thomas

1 respuesta

4

Desactivar la interrupción cuando no tienes datos para enviar es exactamente el enfoque correcto que debes tomar con un controlador maestro I2C de hardware.

Cuando los datos estén disponibles, vuelva a habilitar la interrupción y la tomará de inmediato, lo que transferirá el byte al controlador.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas