This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMX320F28377D SCI: RXRDY can't be set but the value of RXFFST is changed

Other Parts Discussed in Thread: CONTROLSUITE

Hi colleagues,

Hope anybody can help me.

I work with the TMX320F28377D and try to implement a SCI to work with PC. I did a lot of different examples. The current one is the Example (without Interupts)about AutobaudLock and I have always the same problem: I receive all the sendet chars but RXRDY can't be set,the value of RXFFST is changed.

I can't insert the screen capture of ccs debug.

Occurrence:

PC stop :while(SciaRegs.SCIRXST.bit.RXRDY != 1) { }

Expressions : SciaRegs.SCIFFRX.bit.RXFFST  = 9 ;

                        SciaRegs.SCIRXBUF.bit.SAR  = 'A';

Why?

The code :

void main(void)

{

 

   Uint16 ReceivedChar;

   char *msg;

 

// Step 1. Initialize System Control:

// PLL, WatchDog, enable Peripheral Clocks

// This example function is found in the F2837xD_SysCtrl.c file.

   InitSysCtrl();

 

// Step 2. Initialize GPIO:

// This example function is found in the F2837xD_Gpio.c file and

// illustrates how to set the GPIO to it's default state.

   InitGpio();

 

// For this example, only init the pins for the SCI-A port.

// GPIO_SetupPinMux() - Sets the GPxMUX1/2 and GPyMUX1/2 register bits

// GPIO_SetupPinOptions() - Sets the direction and configuration of the GPIOS

// These functions are found in the F2837xD_Gpio.c file.

   GPIO_SetupPinMux(28, GPIO_MUX_CPU1, 1);

   GPIO_SetupPinOptions(28, GPIO_INPUT, GPIO_PUSHPULL);

   GPIO_SetupPinMux(29, GPIO_MUX_CPU1, 1);

   GPIO_SetupPinOptions(29, GPIO_OUTPUT, GPIO_ASYNC);

 

// Step 3. Clear all __interrupts and initialize PIE vector table:

// Disable CPU __interrupts

   DINT;

 

// Initialize PIE control registers to their default state.

// The default state is all PIE __interrupts disabled and flags

// are cleared.

// This function is found in the F2837xD_PieCtrl.c file.

   InitPieCtrl();

 

// Disable CPU __interrupts and clear all CPU __interrupt flags:

   IER = 0x0000;

   IFR = 0x0000;

 

// Initialize the PIE vector table with pointers to the shell Interrupt

// Service Routines (ISR).

// This will populate the entire table, even if the __interrupt

// is not used in this example. This is useful for debug purposes.

// The shell ISR routines are found in F2837xD_DefaultIsr.c.

// This function is found in F2837xD_PieVect.c.

   InitPieVectTable();

 

// Step 4. User specific code:

 

   LoopCount = 0;

   EALLOW;

   SciaRegs.SCIFFTX.all=0x8000;

 

   scia_fifo_init();    // Initialize the SCI FIFO

   scia_echoback_init(); // Initialize SCI for echoback

   msg = "\n\r Type 'a' to relock baud-rate: ";

   scia_msg(msg);

   EDIS;

   EALLOW;

   SCIA_AutobaudLock();

   EDIS;

   msg = "\r\n\n\nHello World!\0";

   scia_msg(msg);

 

   msg = "\r\nYou will enter a character, and the DSP will echo it back! \n\0";

   scia_msg(msg);

 

  for(;;)

   {

       msg = "\r\nEnter a character: \0";

       scia_msg(msg);

 

       // Wait for inc character

       while(SciaRegs.SCIFFRX.bit.RXFFST == 0) { } // wait for XRDY =1 for empty state

 

       // Get character

       ReceivedChar = SciaRegs.SCIRXBUF.all;

 

       // Echo character back

       msg = " You sent: \0";

       scia_msg(msg);

       scia_xmit(ReceivedChar);

 

       LoopCount++;

   }

 

}

//#################################################

// Uint16 SCIA_AutobaudLock(void)

//------------------------------------------------

// Perform autobaud lock with the host.

// Note that if autobaud never occurs

// the program will hang in this routine as there

// is no timeout mechanism included.

//------------------------------------------------

void SCIA_AutobaudLock(void)

{

  Uint16 byteData;

  // Must prime baud register with >= 1

  SciaRegs.SCIHBAUD.bit.BAUD = 0;

  SciaRegs.SCILBAUD.bit.BAUD = 1;

  // Prepare for autobaud detection

  // Set the CDC bit to enable autobaud detection

  // and clear the ABD bit

  SciaRegs.SCIFFCT.bit.CDC = 1;

  SciaRegs.SCIFFCT.bit.ABDCLR = 1;

  // Wait until we correctly read an

  // 'A' or 'a' and lock

  while(SciaRegs.SCIFFCT.bit.ABD != 1) {}

  // After autobaud lock, clear the ABD and CDC bits

  SciaRegs.SCIFFCT.bit.ABDCLR = 1;

  SciaRegs.SCIFFCT.bit.CDC = 0;

  while(SciaRegs.SCIRXST.bit.RXRDY != 1) { }

  byteData = SciaRegs.SCIRXBUF.bit.SAR;

  SciaRegs.SCITXBUF.bit.TXDT = byteData;

  return;

}

// Test 1,SCIA DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity

void scia_echoback_init()

{

   // Note: Clocks were turned on to the SCIA peripheral

   // in the InitSysCtrl() function

 

  SciaRegs.SCICCR.all =0x0007;   // 1 stop bit, No loopback

                                   // No parity,8 char bits,

                                   // async mode, idle-line protocol

  SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,

                                  // Disable RX ERR, SLEEP, TXWAKE

  SciaRegs.SCICTL2.all =0x0000;

  SciaRegs.SCIHBAUD.all   =0x0002;

   SciaRegs.SCILBAUD.all   =0x008B;

 

  SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset

}

 

// Transmit a character from the SCI

void scia_xmit(int a)

{

   while (SciaRegs.SCIFFTX.bit.TXFFST != 0) {}

   SciaRegs.SCITXBUF.all =a;

}

 

void scia_msg(char * msg)

{

   int i;

   i = 0;

   while(msg[i] != '\0')

   {

       scia_xmit(msg[i]);

       i++;

   }

}

 

// Initialize the SCI FIFO

void scia_fifo_init()

{

   SciaRegs.SCIFFTX.all=0xE040;

   SciaRegs.SCIFFRX.all=0x2044;

   SciaRegs.SCIFFCT.all=0x0;

}

 

//===========================================================================

// No more.

//===========================================================================