Quiero implementar el protocolo SMBUS en mi dispositivo AVR (ATMega1284P), que tendrá el rol de esclavo. Necesito admitir la función PEC (código de error del paquete), lo que significa que el dispositivo maestro (que no es mío) enviará un byte de "suma de comprobación" después del último byte de su comando, al que debo responder con ACK o NACK Dependiendo de su validez.
Tengo algo de experiencia con I²C / SMBUS / TWI como la he usado antes, pero parece que no puedo resolver este problema en particular. Aparentemente, con la implementación TWI de AVR necesito decidir por ACK o NACK en el byte recibido anterior al valor PEC; es decir, en respuesta a un TWSR anterior = 0x80 (se han recibido datos). El problema es que no sé de antemano si el PEC que recibiré a continuación será válido o no. Aparentemente, establecer o borrar el bit TWEA solo es efectivo para recibir el siguiente byte. Ejemplo:
1 - ME = Prepare for TWI slave operation; set address and ACK
2 - MASTER = Writes SLA+W (gets ACK from step #1)
3 - ME = INT with TWSR 0x60; Sets ACK/NACK for next byte (ACK)
4 - MASTER = Sends Byte (gets ACK/NACK from step #3)
5 - ME = INT with TWSR 0x80; Sets ACK/NACK for next byte (ACK)
6 - MASTER = Sends Byte (gets ACK/NACK from step #5)
7 - ME = INT with TWSR 0x80; Sets ACK/NACK for next byte (ACK)
8 - MASTER = Sends PEC Byte (gets ACK/NACK from step #7)
9 - ME = INT with TWSR 0x80 (PEC); too late to ACK/NACK PEC value!
Como puede ver, debo decidir por ACK / NACK en el paso # 9, ¡pero el maestro ya tiene un ACK establecido en el paso # 7!
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 implementar una biblioteca de SMBUS que golpea los bits, ¿hay alguna manera de resolver esto?
Gracias.