Tengo un microcontrolador TM4C123GXL Launchpad, que tiene 8 puertos UART serie. Estoy usando Keil uVision5 con Tiva Ware para la programación.
Quería conectar 3 dispositivos UART con el microcontrolador sin ninguna pérdida de bytes. La velocidad de transmisión se ha establecido en 115200 bits / seg sin paridad, como se muestra en la siguiente figura. Todos los dispositivos envían marcos de datos periódicamente cada 5ms.
El tiempo de TX y RX se calcula utilizando No_0f_bytes * 10 / BaudRate
He conectado con éxito los dispositivos con el UART de µC. El problema en la comunicación es que estoy perdiendo los bytes. Si hago una comunicación con un solo dispositivo (Dispositivo 2) todavía estoy perdiendo los bytes de todo el marco (20 bytes).
¿Se debe a la limitación FIFO de 16 bytes de Tm4c123 o cualquier otra cosa?
También he implementado la función µDMA de TM4C123. Pero aún así, los bytes se pierden. ¿Qué puedo hacer para mejorar el sistema para la transmisión y recepción sin pérdida de marcos de datos?
Editar:
Aquí está la arquitectura del software:
Estoy utilizando la interrupción periódica del temporizador de 5 ms para recibir y transmitir la trama. Todas las tramas tienen el primer encabezado de 2 bytes y un byte contador como el último byte.
void Timer1IntHandler(void) // Periodic Service Routine every 5ms
{
DisableIntrupts();
bool Correct=ReadJoystick(); //10 bytes Device 1
if(Correct)
{
GenerateServoCardsFrame();
SendServo1Frame(); //20 bytes Device 2
SendServo2Frame(); //17 bytes Device 3
ReadServo1Frame(); //15 bytes Device 2
ReadServo2Frame(); //20 bytes Device 3
GenerateJoystickFrame();
SendJoystickFrame(); //10 bytes Device 1
EnableIntrupts();
}
}
main()
{
SetupClock() ; //Setup 16 MHz Clock
SetupJoystick(); //Initalize uart1 port for Device1
SetupServoCard1(); //Initalize uart2 port for Device2
SetupServoCard2(); //Initalize uart3 port for Device3
InitalizePeriodicTimerHandler(5); //Periodic Service Routine every 5ms (Timer1IntHandler)
while(1)
{
}
}
bool ReadJoystick(void)
{
int BytePos=0;
int CountInvalid=0;
int LoopoutTime=0;
while(1)
{
if (ROM_UARTCharsAvail(UART1))
{
ByteRX = ROM_UARTCharGetNonBlocking(UART1);
if (BytePos==0)
{
if (ByteRX== 0xA1) //Header1 found
{
KArray[0] = Bytebuf ;
BytePos ++;
}
else
{
CountInvalid++;
if (CountInvalid>5)
return 0;
}
}
else if (BytePos ==1)
{
if (ByteRX == 0x66) //Header2 found
{
KArray[1] = ByteRX;
BytePos ++;
}
else
BytePos=0;
}
else
{
KArray[BytePos++] = ByteRX;
if (BytePos==10)
return 1; //Frame Recived
}
}
else
{
SysCtlDelay(0.25*SysCtlClockGet()/3 / 1000); // 0.25ms delay
LoopoutTime++;
if (LoopoutTime > 10)
return 0;
}
}
}
Según mi cálculo, 1 byte requiere 10/115200 = 0.08680ms y para leer un FIFO de 16 bytes requiere 1.38ms. La tabla de la figura muestra el tiempo total de Tx de 4.08 ms y el tiempo de respuesta de 3.91 ms, que suma 8 ms. Esto es mayor que mi Rutina de servicio de interrupción periódica.
¿Tengo que aumentar el tiempo de interrupción periódica?