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.

TMS320F28035: Regarding SCI

Part Number: TMS320F28035

I Have a doubt on SCI LoopBack Test..

Please advice me.

  • Hi RK,

    What's the doubt?

    Regards,
    Gautam
  • Hi,
    I am referring to the Example code:

    Example_2803xSci_FFDLB_int

    I want to increase the Data Length size.
    Here in the example code data array size is:2..

    Suppose I want a data size of 5 , I am unable to get the Sdata & Rdata correctly.

    Pls suggest me.
  • ramakrishna dutt said:
    Suppose I want a data size of 5 , I am unable to get the Sdata & Rdata correctly.

    Pls suggest me.

    What changes did you do to the code for achieving the data size of 5?

  • For your understanding on my problem, Pleass find the atttached code as below: (Example Code Original)

     

    At the bottom, I am giving the modified code, please suggest the improvements to be done.

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

    //

    //!  \addtogroup f2803x_example_list

    //!  <h1>SCI Digital Loop Back with Interrupts(scia_loopback_interrupts)</h1>

    //!

    //!  This program uses the internal loop back test mode of the peripheral.

    //!  Other then boot mode pin configuration, no other hardware configuration

    //!  is required. Both interrupts and the SCI FIFOs are used.

    //!

    //!  A stream of data is sent and then compared to the received stream.

    //!  The SCI-A sent data looks like this: \n

    //!  00 01 \n

    //!  01 02 \n

    //!  02 03 \n

    //!  .... \n

    //!  FE FF \n

    //!  FF 00 \n

    //!  etc.. \n

    //!  The pattern is repeated forever.

    //!

    //!  \b Watch \b Variables \n

    //!  - \b sdataA , Data being sent

    //!  - \b rdataA , Data received

    //!  - \b rdata_pointA ,Keep track of where we are in the datastream.

    //!    This is used to check the incoming data

    //

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

    // $TI Release: F2803x C/C++ Header Files and Peripheral Examples V127 $

    // $Release Date: March 30, 2013 $

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

    #include "DSP28x_Project.h"     // Device Headerfile and Examples Include File

    #define CPU_FREQ    60E6

    #define LSPCLK_FREQ CPU_FREQ/4

    #define SCI_FREQ    100E3

    #define SCI_PRD     (LSPCLK_FREQ/(SCI_FREQ*8))-1

    // Prototype statements for functions found within this file.

    __interrupt void sciaTxFifoIsr(void);

    __interrupt void sciaRxFifoIsr(void);

    __interrupt void scibTxFifoIsr(void);

    __interrupt void scibRxFifoIsr(void);

    void scia_fifo_init(void);

    void scib_fifo_init(void);

    void error(void);

    // Global variables

    Uint16 sdataA[2];    // Send data for SCI-A

    Uint16 rdataA[2];    // Received data for SCI-A

    Uint16 rdata_pointA; // Used for checking the received data

    void main(void)

    {

      Uint16 i;

    // Step 1. Initialize System Control:

    // PLL, WatchDog, enable Peripheral Clocks

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

      InitSysCtrl();

    // Step 2. Initalize GPIO:

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

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

    // InitGpio();

    // Setup only the GP I/O only for SCI-A and SCI-B functionality

    // This function is found in DSP2803x_Sci.c

      InitSciGpio();

    // 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 DSP2803x_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 DSP2803x_DefaultIsr.c.

    // This function is found in DSP2803x_PieVect.c.

      InitPieVectTable();

    // Interrupts that are used in this example are re-mapped to

    // ISR functions found within this file.

      EALLOW;  // This is needed to write to EALLOW protected registers

      PieVectTable.SCIRXINTA = &sciaRxFifoIsr;

      PieVectTable.SCITXINTA = &sciaTxFifoIsr;

      EDIS;   // This is needed to disable write to EALLOW protected registers

    // Step 4. Initialize all the Device Peripherals:

    // This function is found in DSP2803x_InitPeripherals.c

    // InitPeripherals(); // Not required for this example

      scia_fifo_init();  // Init SCI-A

    // Step 5. User specific code, enable interrupts:

    // Init send data.  After each transmission this data

    // will be updated for the next transmission

      for(i = 0; i<2; i++)

      {

    //      sdataA[i] = i;

      sdataA[0] = 54;

      sdataA[1] = 96;

      }

      rdata_pointA = sdataA[0];

    // Enable interrupts required for this example

      PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block

      PieCtrlRegs.PIEIER9.bit.INTx1=1;     // PIE Group 9, INT1

      PieCtrlRegs.PIEIER9.bit.INTx2=1;     // PIE Group 9, INT2

      IER = 0x100; // Enable CPU INT

      EINT;

    // Step 6. IDLE loop. Just sit and loop forever (optional):

       for(;;);

    }

    void error(void)

    {

       __asm("     ESTOP0"); // Test failed!! Stop!

       for (;;);

    }

    __interrupt void sciaTxFifoIsr(void)

    {

       Uint16 i;

       for(i=0; i< 2; i++)

       {

          SciaRegs.SCITXBUF=sdataA[i];     // Send data

       }

       for(i=0; i< 2; i++)                 //Increment send data for next cycle

       {

          sdataA[i] = (sdataA[i]+1) & 0x00FF;

       }

       SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;  // Clear SCI Interrupt flag

       PieCtrlRegs.PIEACK.all|=0x100;      // Issue PIE ACK

    }

    __interrupt void sciaRxFifoIsr(void)

    {

       Uint16 i;

       for(i=0;i<2;i++)

       {

          rdataA[i]=SciaRegs.SCIRXBUF.all;  // Read data

       }

       for(i=0;i<2;i++)                     // Check received data

       {

          if(rdataA[i] != ( (rdata_pointA+i) & 0x00FF) ) error();

       }

       rdata_pointA = (rdata_pointA+1) & 0x00FF;

       SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag

       SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag

       PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack

    }

    void scia_fifo_init()

    {

      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.bit.TXINTENA =1;

      SciaRegs.SCICTL2.bit.RXBKINTENA =1;

      SciaRegs.SCIHBAUD = 0x0000;

    //  SciaRegs.SCILBAUD = SCI_PRD;

      SciaRegs.SCILBAUD = 0x00C2;

      SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back

      SciaRegs.SCIFFTX.all=0xC022;

      SciaRegs.SCIFFRX.all=0x0022;

      SciaRegs.SCIFFCT.all=0x00;

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

      SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;

      SciaRegs.SCIFFRX.bit.RXFIFORESET=1;

    }

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

    // No more.

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

    Note: Here I am changing  the following lines:

    Uint16 sdataA[5];    // Send data for SCI-A

    Uint16 rdataA[5];    // Received data for SCI-A

    Uint16 rdata_pointA; // Used for checking the received data

    --> In the main loop the change is:

    for(i = 0; i<5; i++)

      {

        sdataA[i] = i;

     }

    --> In the TX  ISR the change is:

    for(i=0; i< 5; i++)

       {

          SciaRegs.SCITXBUF=sdataA[i];     // Send data

       }

       for(i=0; i<5; i++)                 //Increment send data for next cycle

       {

          sdataA[i] = (sdataA[i]+1) & 0x00FF;

       }

    --> In the RX  ISR the change is:

       for(i=0;i<5;i++)

       {

          rdataA[i]=SciaRegs.SCIRXBUF.all;  // Read data

       }

       for(i=0;i<5;i++)                     // Check received data

       {

          if(rdataA[i] != ( (rdata_pointA+i) & 0x00FF) ) error();

       }

  • Pls give me reply any one..