En el PIC16F1829, FERR
refleje el estado de error de trama del byte superior en el FIFO de recepción en serie de dos bytes. Por lo tanto, suponiendo que no lleguen nuevos bytes con errores de trama, dos lecturas de RCREG siempre deberían borrar FERR.
Sin embargo, es posible que esté leyendo demasiado en esta Nota en la hoja de datos PIC16F1829 para USART. La sección relevante es 26.1.2.4 en la página 287:
Si todos los caracteres recibidos en el FIFO de recepción tienen errores de trama, las lecturas repetidas del RCREG no borrarán el bit FERR.
Esto parece implicar que si ambos bytes en el FIFO tuvieran errores de trama, FERR se quedaría atascado para siempre. Esto me parece un poco improbable pero, al mismo tiempo, la hoja de datos describe cómo forzar la eliminación de FERR reiniciando el EUSART.
¿Alguien tiene alguna aclaración? Iba a contar si los bytes consecutivos resultaban en un error de trama, pero si no tengo que hacerlo, ¡sería bueno!
Aquí hay una sutileza que la hoja de datos no aclara, pero sí una de las notas de aplicación ( AN774 ).
El FIFO, hasta donde llega, es RCREG + un búfer de 1 byte. Plus RSR: el registro de desplazamiento de recepción.
FERR nunca se actualiza a menos que RCREG lo esté. El acto de leer RCREG permite que cualquier byte del búfer de espera se mueva a RCREG; esto actualiza simultáneamente FERR (siempre) y RX9D (si corresponde). Así tenemos tres escenarios de tipo de error:
Un byte incorrecto en RCREG y un byte correcto en el búfer: FERR
está configurado, RCIF
está configurado.
La lectura de RCREG hace que el byte de búfer bueno se mueva a RCREG junto con su estado de trama.
Ahora FERR
está claro, RCIF
está listo.
FERR
Se establece un byte erróneo en RCREG y ningún byte en el búfer . RCIF
Está establecido.
La lectura de RCREG hace RCIF
que se borre. No se establece ninguna acción FERR
. Permanece configurado hasta que llega un byte bueno a RCREG.
FERR
Se establece un byte incorrecto en RCREG y un byte incorrecto en el búfer . RCIF
Está establecido.
La lectura de RCREG hace que el byte del búfer se mueva a RCREG junto con su estado de trama incorrecto.
Ahora FERR
está listo, RCIF
está listo. El búfer es transparente. La situación es ahora según (2) arriba.
Para la situación 3, las lecturas repetidas del RCREG no borrarán el bit FERR. Que es exactamente lo que dice la nota.
Editar: tenga en cuenta la implicación del escenario (1). Si lee RCREG en este caso, FERR no es válido para el byte que acaba de leer. Debe verificar FERR antes de leer RCREG.
tallarines