Bytes faltantes de UART TX - MSP430F2274

0

He configurado un UART en ez430 (msp430f2274) para usarlo para enviar una cadena al terminal. Sin embargo, noté que algunos de los caracteres desaparecen. Por ejemplo. Si envío una cadena "Hello World", veo la salida en el terminal como "Hello" "Wod".

Probé el programa con otro hardware (ez430) y persistió el mismo problema. Luego, después de agregar un largo retraso en el código, el programa pudo imprimir todos los caracteres a una velocidad muy lenta. Esta solución es rara y fea.

Supongo que pueden faltar los caracteres porque se estaba cargando un nuevo byte en la TXBUF, reemplazando el byte anterior incluso antes de que pudiera ser bombeado al terminal (¿UCA0TXIFG siempre es '0'?). Por lo tanto, después de imprimir cada carácter en el terminal, en el código, doy una larga demora antes de escribir el siguiente byte en el TXBUF. Intenté reducir este retraso más a 100, pero luego volvió a aparecer el problema del personaje que falta.

Estoy seguro de que esto no es un problema de hardware y no estoy seguro de qué es lo que estoy haciendo mal en el software. A continuación se muestran los códigos relevantes:

1) Uart.c

/****************************************************************
 * Function Name    :uart_configure
 * Description      :Configure the UARTA0 control registers
 * Returns      :None
 * Params       :None
 ****************************************************************/
static void
uart_configure ()
{
  /* Register Settings */
  UCA0CTL0  = 0;
  UCA0CTL1 |= UCSSEL_2;
  UCA0BR0 = 0x41;           //Buad Rate 9600bps for Clock of 8 MHz
  UCA0BR1 = 0x03;
  UCA0MCTL = UCBRS0;
  UCA0CTL1 &= ~UCSWRST;

  /* Enable RXD Interrupts */
  IE2 |= UCA0RXIE;

  /* Enable Global/Maskable Interrupts */
  _BIS_SR (GIE);
}

/****************************************************************
 * Function Name    :uart_init
 * Description      :Initialize the UARTA0
 * Returns      :None
 * Params       :None
 ****************************************************************/
void
uart_init ()
{
  uart_mux_pins ();
  uart_configure ();
}

/****************************************************************
 * Function Name    :Uart_PrintStr
 * Description      :Prints a string on the terminal
 * Returns      :Length of the string
 * Params       :@str_ptr = Pointer to a string.
 ****************************************************************/
unsigned char
Uart_PrintStr (char *str_ptr)
{
  int len = 0, i = 0, ret = 0;
  len = strlen (str_ptr);
  ret = len;
  while (len != 0)
    {
      while (!(IFG2 & UCA0TXIFG));
      UCA0TXBUF = str_ptr[i++];
      len--;
       /* Bad Fix using delay */
      __delay_cycles (800000);
    }
  return (ret);
}

2) Main.c

/* Lib Includes */
#include <msp430f2274.h>
#include "common_utils.h"

/* Byte received from terminal */
extern char rec_uart_byte;

int
main ()
{
  unsigned char cnt = 0;

  WDTCTL = WDTPW + WDTHOLD;   // Stop the Watch dog

  if (CALBC1_8MHZ == 0xFF)    // If calibration constant erased
    {
      while (1);             // do not load, trap CPU!!
    }

  DCOCTL = 0;                // Select lowest DCOx and MODx settings
  BCSCTL1 = CALBC1_8MHZ;     // Set range
  DCOCTL = CALDCO_8MHZ;      // Set DCO step + modulation 
  gpio_out_initdef ();       // Initialize GPIO DIR to default
  gpio_configure (0x01, BIT0, OUTPUT);  // Configure P1.0 as output
  for (cnt = 0; cnt < 3; cnt++)
    {
/*Blink LED for 3 times with 1 second delay */
      gpio_write (0x01, BIT0);
      __delay_cycles (8000000);
      gpio_write (0x01, 0x00);
      __delay_cycles (8000000);
    }

  uart_init ();                     // Initialize the UART configuration
  Uart_PrintStr ("Welcome To DeeplyEmbedded!"); // Print string to terminal
  while (1)
    {
/* Reveive a byte from the terminal */
      if (rec_uart_byte == 'a')
      {
       rec_uart_byte = 0;
       Uart_PrintStr ("Hooray! The GPIO's and UART are up & running");
      }
    }
}

Para obtener detalles sobre los registros, consulte MSP430F2274 User Guide , página 428 en adelante. Cualquier información sobre la causa de este problema y hacer que esto funcione sin la necesidad de agregar el retraso sería útil.

    
pregunta Vinay Divakar

0 respuestas

Lea otras preguntas en las etiquetas