Estoy implementando un I 2 esclavo de solo lectura en un PIC18F4620 . He hecho un controlador ISR de trabajo para el módulo MSSP:
unsigned char dataFromMaster;
unsigned char SSPISR(void) {
unsigned char temp = SSPSTAT & 0x2d;
if ((temp ^ 0x09) == 0x00) {
// State 1: write operation, last byte was address
ReadI2C();
return 1;
} else if ((temp ^ 0x29) == 0x00) {
// State 2: write operation, last byte was data
dataFromMaster = ReadI2C();
return 2;
} else if (((temp & 0x2c) ^ 0x0c) == 0x00) {
// State 3: read operation, last byte was address
WriteI2C(0x00);
return 3;
} else if (!SSPCON1bits.CKP) {
// State 4: read operation, last byte was data
WriteI2C(0x00);
return 4;
} else {
// State 5: slave logic reset by NACK from master
return 5;
}
}
Esto es solo un puerto a C desde una parte del código ASM en el apéndice B de AN734 .
En mi bucle principal, estoy comprobando si hay datos nuevos, como este:
void main(void) {
if (dataFromMaster != 0x00) {
doSomething(dataFromMaster);
dataFromMaster = 0x00;
}
}
Esto genera un problema cuando el maestro envía bytes muy rápido y entran nuevos datos antes de que el bucle principal llegue a doSomething
. Por lo tanto, quiero implementar un búfer donde se almacenan los datos del maestro. Necesito una matriz terminada en nulo de 16 caracteres (el null
no se usará como comando para el esclavo). El ISR tiene que escribir nuevos datos en esa matriz, y el bucle principal debe leerlos de la matriz en el orden en que se recibió, y borrar la matriz.
No tengo idea de cómo implementar esto. ¿Usted?