Encima intente buscar el codigo fuente del ASFv4 y no esta online , tenes que bajarte el IDE completo casi 900MB para poder inspeccionar la fuente. Pero me imagino que la fuente es correcta, pero iba a dar una idea de que estabamos haciendo mal al menos.
dime si quieres ver algo y te lo paso, por que yo no veo nada raro en la fuente, simplemente que no se actualizan correctamente los bit del registro de estado

En la interrupción de error no entra nunca, por lo tanto supongo que no hay error, ademas estoy recibiendo constantemente el "Hello world" el problema es que no tengo manera de ver cuando termina de enviar.
He monitorizado el registro US_CSR que es el registro de estado de la uart y cuando empieza a enviar ya nunca cambia

manda los 12 bytes y vuelve a empezar sin cambiar ningún byte, he mirado las erratas de nuevo (que estan en el datasheet) y no dice nada de esto.
pero lo mas importante es esta prueba, me ido a la interrupción que esta por debajo de todas las Flexcom y esas tonterias, y he colocado contadores a ver como va entrando:
un contador que cuenta al entrar, otro que cuenta en el TXRDY, TXEMPTY (supuestamente cuando acaba la transmisión), RXRDY(un dato recibido y no leido)
coloco el breakpoint en la primera linea en ASSERT(device);
unsigned int ContadorInterrupcion=0,ContadorTXRDY=0, ContadorTXEMPTY=0, ContadorRXRDY=0, Contador4=0;
static void _usart_interrupt_handler(struct _usart_async_device *device)
{
ASSERT(device);
void *hw = device->hw;
ContadorInterrupcion++;
if (hri_usart_get_US_CSR_TXRDY_bit(hw) && hri_usart_get_US_IMR_TXRDY_bit(hw))
{
ContadorTXRDY++;
hri_usart_clear_US_IMR_TXRDY_bit(hw);
device->usart_cb.tx_byte_sent(device);
device->usart_cb.tx_done_cb(device);
}
else if (hri_usart_get_US_CSR_TXEMPTY_bit(hw) && hri_usart_get_US_IMR_TXEMPTY_bit(hw))
{
ContadorTXEMPTY++;
hri_usart_clear_US_IMR_TXEMPTY_bit(hw);
}
else if (hri_usart_get_US_CSR_RXRDY_bit(hw) && hri_usart_get_US_IMR_RXRDY_bit(hw))
{
ContadorRXRDY++;
if (hri_usart_read_US_CSR_reg(hw) & (US_CSR_OVRE | US_CSR_FRAME | US_CSR_PARE))
{
hri_usart_read_US_RHR_reg(hw);
hri_usart_write_US_CR_reg(hw, US_CR_RSTSTA);
return;
}
device->usart_cb.rx_done_cb(device, (uint8_t)hri_usart_read_US_RHR_reg(hw));
}
else if (hri_usart_read_US_CSR_reg(hw) & (US_CSR_OVRE | US_CSR_FRAME | US_CSR_PARE))
{
Contador4++;
hri_usart_write_US_CR_reg(hw, US_CR_RSTSTA);
device->usart_cb.error_cb(device);
}
}
estas son las iteraciones y los valores de los Contadores, es decir cada vez que se para en el breakpoint:
PD: el main es como he puesto en mi post anterior
Primera iteración:
ContadorInterrupcion=0
ContadorTXRDY=0
ContadorTXEMPTY=0
ContadorRXRDY=0
Contador4=0
Segunda:
ContadorInterrupcion=1
ContadorTXRDY=1
ContadorTXEMPTY=0
ContadorRXRDY=0
Contador4=0
Segunda:
ContadorInterrupcion=2
ContadorTXRDY=1
ContadorTXEMPTY=1

ContadorRXRDY=0
Contador4=0
Tercera:
ContadorInterrupcion=3
ContadorTXRDY=2
ContadorTXEMPTY=1
ContadorRXRDY=0
Contador4=0
Cuarta:
ContadorInterrupcion=4
ContadorTXRDY=3
ContadorTXEMPTY=1
ContadorRXRDY=0
Contador4=0
Asi se van incrementando el ContadorTXRDY y el Contador de Interrupción hasta la iteracion 16
Iteracion 16:
ContadorInterrupcion=16
ContadorTXRDY=14
ContadorTXEMPTY=2
ContadorRXRDY=0
Contador4=0
Iteracion 17:
ContadorInterrupcion=16
ContadorTXRDY=14
ContadorTXEMPTY=2
ContadorRXRDY=1

Contador4=0
teracion 18:
ContadorInterrupcion=18
ContadorTXRDY=15
ContadorTXEMPTY=2
ContadorRXRDY=1
Contador4=0
y se repite, aqui por lo menos se incrementa el Contador TXEMPTY, no cuando debería pero lo hace cada 16 Iteraciones (que es lo que ocupa el bufer circular)
Sin embargo si pongo el breakpoint dentro de :
else if (hri_usart_get_US_CSR_TXEMPTY_bit(hw) && hri_usart_get_US_IMR_TXEMPTY_bit(hw)) vemos como antes que debería detenerse cada 16 veces que entra en la interrupcion no? Pues entra una vez, y ya no vuelve a entrar
Repito:
