La hoja de datos de PIC no está clara sobre cómo borrar el error de encuadre

En el PIC16F1829, FERRrefleje 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!

¡Ay! Ya lo tengo. Responderé para aclarar en caso de que alguien más lo esté haciendo mientras escribo.

Respuestas (1)

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:

  1. Un byte incorrecto en RCREG y un byte correcto en el búfer: FERRestá configurado, RCIFestá configurado.
    La lectura de RCREG hace que el byte de búfer bueno se mueva a RCREG junto con su estado de trama.
    Ahora FERRestá claro, RCIFestá listo.

  2. FERRSe establece un byte erróneo en RCREG y ningún byte en el búfer . RCIFEstá establecido.
    La lectura de RCREG hace RCIFque se borre. No se establece ninguna acción FERR. Permanece configurado hasta que llega un byte bueno a RCREG.

  3. FERRSe establece un byte incorrecto en RCREG y un byte incorrecto en el búfer . RCIFEstá establecido.
    La lectura de RCREG hace que el byte del búfer se mueva a RCREG junto con su estado de trama incorrecto.
    Ahora FERRestá listo, RCIFestá 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.