Tengo algo de experiencia con I²C (TWI) como la he usado antes, pero parece que no puedo resolver este problema en particular. Tengo la intención de comunicar dos CPU a través de I²C. Uno es siempre el amo y el otro es el esclavo. Yo mismo estoy definiendo el protocolo de comunicación, así que es algo flexible, pero pretendo que sea lo más eficiente posible (es decir, cuantos menos bytes, mejor).
Quiero que el esclavo establezca NACK para ciertos valores; por ejemplo:
MASTER = START + sends SLAVE ADDRESS
SLAVE = sets ACK
MASTER = sends any one "byte" command
SLAVE = sets ACK or NACK depending if "byte" was a valid command or not.
La última declaración es el problema, porque aparentemente, como el esclavo, tengo que decidir por ACK o NACK antes de recibir el comando de un "byte"; es decir, en respuesta a TWSR = 0x60 (SLA + W recibido). El problema es que no sé de antemano si el comando será válido o no. Aparentemente, establecer o borrar el bit TWEA solo es efectivo para que se reciba el siguiente byte.
Por mucho que haya investigado en los documentos, no puedo encontrar una manera de responder con NACK "sobre la marcha" porque ATMega establece la interrupción DESPUÉS de enviar el ACK (o NACK). TWSR será 0x80 o 0x88, lo que significa "byte recibido, ACK enviado" y "byte recibido, NACK enviado" respectivamente.
Aparte de agregar bytes de relleno o de implementar una biblioteca I²C de bit banging, ¿hay alguna manera de resolver esto?
El controlador maestro es un NXP LPC2148, mientras que el controlador esclavo es un ATMega1284P.
Gracias.