No se puede escribir en el registro SC1DRL en 68HC12 bordo - lo que me estoy perdiendo?
Pregunta
Estoy intentando escribir en utilizar la interfaz serie múltiple en el 68HC12, pero mañana no puede conseguir que se hable. Creo que he aislado el problema de no ser capaz de escribir en el registro SC1DRL (SCI Registro de Datos Bajo).
El siguiente es de mi SCI ISR:
else if (HWRegPtr->SCI.sc1sr1.bit.tdre) {
/* Transmit the next byte in TX_Buffer. */
if (TX_Buffer.in != TX_Buffer.out || TX_Buffer.full) {
HWRegPtr->SCI.sc1drl.byte = TX_Buffer.buffer[TX_Buffer.out];
TX_Buffer.out++;
if (TX_Buffer.out >= SCI_Buffer_Size) {
TX_Buffer.out = 0;
}
TX_Buffer.full = 0;
}
/* Disable the transmit interrupt if the buffer is empty. */
if (TX_Buffer.in == TX_Buffer.out && !TX_Buffer.full) {
Disable_SCI_TX();
}
}
TX_Buffer.buffer tiene lo correcto en el índice TX_Buffer.out cuando su contenido se escriben en HWRegPtr-> SCI.sc1drl.byte, pero mi depurador no muestra un cambio, y no se están transmitiendo datos a través de la serie interfaz.
Alguien sabe lo que me falta?
editar
HWRegPtr se define como:
extern HARDWARE_REGISTER *HWRegPtr;
HARDWARE_REGISTER es un struct gigante con todos los registros en el mismo, y es volátil.
Solución
Es probable que SC1DRL es un registro de sólo escritura (verifique en los documentos oficiales de registro para asegurarse - Google no es subir el PDF adecuado para mí). Esto significa que no puede leer de nuevo (incluso con un depurador en destino) para verificar su código.
¿Cómo se define HWRegPtr? ¿Tiene volatile
en los lugares adecuados para asegurar que los compilador trata cada escritura a través de ese puntero como algo que debe suceder inmediatamente?