Tengo un LPC1114 (FN28) para el que estoy escribiendo un 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í es básicamente una máquina de estado, pero dado que la especificación I2C no especifica tiempo de espera u otras restricciones en la velocidad del reloj 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 lo mantiene bajo cuando no se envían datos.
La idea es poder almacenar en búfer los datos que se enviarán en el bus I2C. Algunas bibliotecas que veo se ocupan de esto simplemente almacenando en búfer todo y bitbanging todo a la vez, lo cual está bien la mayor parte del tiempo ya que generalmente no envía muchos datos a través de I2C, pero quiero hacerlo correctamente.
Configuré el código base y el problema que tengo al transmitir datos es que cada vez que el controlador ingresa al modo "transmitir datos a esclavo", activa una interrupción que requiere que complete 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, ¡así que mi código principal ni siquiera puede tener la oportunidad de ejecutarse! ¡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 se lo indique desde mi código principal"!
He arreglado algo que funciona (¿ab?) usando NVIC para deshabilitar la interrupción I2C cuando estoy esperando datos y volver a habilitarlo cuando estoy listo para enviar en la interfaz I2C, pero esto parece muy poco ortodoxo y No sé si es realmente confiable o incluso correcto, especialmente si mientras tanto le suceden cosas malas al autobús (error de autobús, etc.)
Aquí está el manual para el 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 emita una interrupción hasta que lo borre nuevamente, pero aparentemente no es para eso.
¿Alguien tiene experiencia con este o controladores I2C similares y sabe cómo puedo lograr lo que estoy buscando? Claramente debe ser posible, ya que un protocolo en el que necesita tener todos los datos listos por adelantado cada vez no me parece viable.
Deshabilitar la interrupción cuando no tiene datos para enviar es exactamente el enfoque correcto a seguir con un controlador maestro I2C de hardware.
Cuando los datos estén disponibles, vuelva a habilitar la interrupción e inmediatamente la tomará, lo que transferirá el byte al controlador.
chris stratton
Wouter van Ooijen
Tomás