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.

Library RS232 for tms320f28335

Other Parts Discussed in Thread: TMS320F28335

Hi all,

Don't exist port of comunication RS232 in TMS320f28335  implemented as hardware and I need this port.

Can you use any software library to communicate by RS232?

Thanks and regards.

  • Hi!

    You can use SCI (UART).

    // TI File $Revision: /main/3 $
    // Checkin $Date: April 21, 2008   16:04:59 $
    //###########################################################################
    //
    // FILE:   Example_2823xSci_FFDLB_int.c
    //
    // TITLE:  DSP2823x Device SCI Digital Loop Back porgram.
    //
    //
    // ASSUMPTIONS:
    //
    //    This program requires the DSP2823x header files.
    //
    //    This program uses the internal loop back test mode of the peripheral.
    //    Other then boot mode pin configuration, no other hardware configuration
    //    is required.
    //
    //    As supplied, this project is configured for "boot to SARAM"
    //    operation.  The 2823x Boot Mode table is shown below.
    //    For information on configuring the boot mode of an eZdsp,
    //    please refer to the documentation included with the eZdsp,
    //
    //       $Boot_Table:
    //
    //         GPIO87   GPIO86     GPIO85   GPIO84
    //          XA15     XA14       XA13     XA12
    //           PU       PU         PU       PU
    //        ==========================================
    //            1        1          1        1    Jump to Flash
    //            1        1          1        0    SCI-A boot
    //            1        1          0        1    SPI-A boot
    //            1        1          0        0    I2C-A boot
    //            1        0          1        1    eCAN-A boot
    //            1        0          1        0    McBSP-A boot
    //            1        0          0        1    Jump to XINTF x16
    //            1        0          0        0    Jump to XINTF x32
    //            0        1          1        1    Jump to OTP
    //            0        1          1        0    Parallel GPIO I/O boot
    //            0        1          0        1    Parallel XINTF boot
    //            0        1          0        0    Jump to SARAM	    <- "boot to SARAM"
    //            0        0          1        1    Branch to check boot mode
    //            0        0          1        0    Boot to flash, bypass ADC cal
    //            0        0          0        1    Boot to SARAM, bypass ADC cal
    //            0        0          0        0    Boot to SCI-A, bypass ADC cal
    //                                              Boot_Table_End$
    //
    // DESCRIPTION:
    //
    //    This program is a SCI example that uses the internal loopback of
    //    the peripheral.  Both interrupts and the SCI FIFOs are used.
    //
    //    A stream of data is sent and then compared to the recieved stream.
    //
    //    The SCI-A sent data looks like this:
    //    00 01 02 03 04 05 06 07
    //    01 02 03 04 05 06 07 08
    //    02 03 04 05 06 07 08 09
    //    ....
    //    FE FF 00 01 02 03 04 05
    //    FF 00 01 02 03 04 05 06
    //    etc..
    //
    //
    //    The SCI-B sent data looks like this:
    //    FF FE FD FC FB FA F9 F8
    //    FE FD FC FB FA F9 F8 F7
    //    FD FC FB FA F9 F8 F7 F6
    //    ....
    //    01 00 FF FE FD FC FB FA
    //    00 FF FE FD FC FB FA F9
    //    etc..
    //
    //    Both patterns are repeated forever.
    //
    //    Watch Variables:
    //
    //       SCI-A           SCI-B
    //       ----------------------
    //       sdataA          sdataB           Data being sent
    //       rdataA          rdataB           Data received
    //       rdata_pointA    rdata_pointB     Keep track of where we are in the datastream
    //                                        This is used to check the incoming data
    //###########################################################################
    // Original Source by S.D.
    //
    // $TI Release: DSP2833x/DSP2823x Header Files V1.20 $
    // $Release Date: August 1, 2008 $
    //###########################################################################
    
    
    
    #include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
    
    //#define SCIA_INTERNAL_LOOPBACK
    
    #define CPU_FREQ 	 150E6
    #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[8];    // Send data for SCI-A
    Uint16 sdataB[8];    // Send data for SCI-B
    Uint16 rdataA[8];    // Received data for SCI-A
    Uint16 rdataB[8];    // Received data for SCI-A
    Uint16 rdata_pointA; // Used for checking the received data
    Uint16 rdata_pointB;
    #ifndef SCIA_INTERNAL_LOOPBACK
    Uint16 sdata_pointA;
    #endif // #ifndef SCIA_INTERNAL_LOOPBACK
    
    
    void main(void)
    {
    #ifdef SCIA_INTERNAL_LOOPBACK
       Uint16 i;
    #endif // #ifdef SCIA_INTERNAL_LOOPBACK
    
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the DSP2833x_SysCtrl.c file.
       InitSysCtrl();
    
    // Step 2. Initalize GPIO:
    // This example function is found in the DSP2833x_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 DSP2833x_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 DSP2833x_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 DSP2833x_DefaultIsr.c.
    // This function is found in DSP2833x_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;
       PieVectTable.SCIRXINTB = &scibRxFifoIsr;
       PieVectTable.SCITXINTB = &scibTxFifoIsr;
       EDIS;   // This is needed to disable write to EALLOW protected registers
    
    
    // Step 4. Initialize all the Device Peripherals:
    // This function is found in DSP2833x_InitPeripherals.c
    // InitPeripherals(); // Not required for this example
       scia_fifo_init();  // Init SCI-A
    #ifdef SCIA_INTERNAL_LOOPBACK
       scib_fifo_init();  // Init SCI-B
    #endif // #ifdef SCIA_INTERNAL_LOOPBACK
    
    // Step 5. User specific code, enable interrupts:
    
    #ifdef SCIA_INTERNAL_LOOPBACK
    // Init send data.  After each transmission this data
    // will be updated for the next transmission
       for(i = 0; i<8; i++)
       {
          sdataA[i] = i;
       }
    
       for(i = 0; i<8; i++)
       {
          sdataB[i] = 0xFF - i;
       }
    #endif // #ifdef SCIA_INTERNAL_LOOPBACK
    
    #ifdef SCIA_INTERNAL_LOOPBACK
       rdata_pointA = sdataA[0];
       rdata_pointB = sdataB[0];
    #else // #ifdef SCIA_INTERNAL_LOOPBACK
       rdata_pointA = 0;
       sdata_pointA = 0;
    #endif // #ifdef SCIA_INTERNAL_LOOPBACK
    
    // 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
       PieCtrlRegs.PIEIER9.bit.INTx3=1;     // PIE Group 9, INT3
       PieCtrlRegs.PIEIER9.bit.INTx4=1;     // PIE Group 9, INT4
       IER = 0x100;	// Enable CPU INT
    
    #ifndef SCIA_INTERNAL_LOOPBACK
      SciaRegs.SCIFFTX.bit.TXFFIENA = 0; // disable TX interrupt
    #endif // #ifndef SCIA_INTERNAL_LOOPBACK
    
       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)
    {
    #ifdef SCIA_INTERNAL_LOOPBACK
        Uint16 i;
        for(i=0; i< 8; i++)
        {
     	   SciaRegs.SCITXBUF=sdataA[i];     // Send data
    	}
    
        for(i=0; i< 8; i++)                 //Increment send data for next cycle
        {
     	   sdataA[i] = (sdataA[i]+1) & 0x00FF;
    	}
    #else // #ifdef SCIA_INTERNAL_LOOPBACK
      while (sdata_pointA != rdata_pointA)
      {
        if (SciaRegs.SCIFFTX.bit.TXFFST == 16)
        {
          break;
        }
        SciaRegs.SCITXBUF = rdataA[sdata_pointA];     // Send data
        sdata_pointA++;
        if (sdata_pointA >= sizeof(rdataA))
        {
          sdata_pointA = 0;
        }
      }
      SciaRegs.SCIFFTX.bit.TXFFIENA = 0; // disable TX interrupt
    #endif // #ifdef SCIA_INTERNAL_LOOPBACK
    
    	SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;	// Clear SCI Interrupt flag
    	PieCtrlRegs.PIEACK.all|=0x100;      // Issue PIE ACK
    }
    
    interrupt void sciaRxFifoIsr(void)
    {
    #ifdef SCIA_INTERNAL_LOOPBACK
        Uint16 i;
    	for(i=0;i<8;i++)
    	{
    	   rdataA[i]=SciaRegs.SCIRXBUF.all;	 // Read data
    	}
    	for(i=0;i<8;i++)                     // Check received data
    	{
    	   if(rdataA[i] != ( (rdata_pointA+i) & 0x00FF) ) error();
    	}
    	rdata_pointA = (rdata_pointA+1) & 0x00FF;
    #else // #ifdef SCIA_INTERNAL_LOOPBACK
      rdataA[rdata_pointA] = SciaRegs.SCIRXBUF.all;	 // Read data
      rdata_pointA++;
      if (rdata_pointA >= sizeof(rdataA))
      {
        rdata_pointA = 0;
      }
      SciaRegs.SCIFFTX.bit.TXFFIENA = 1; // enable TX interrupt
    #endif // #ifdef SCIA_INTERNAL_LOOPBACK
    
    	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;
    #if 0
       SciaRegs.SCIHBAUD = 0x0000;
       SciaRegs.SCILBAUD = SCI_PRD;
    #else
    	{
        long temp;
        // setup baud rate
        // formula = lspclk/(baud*8) - 1;
        temp = 25000000L / (115200 * 8) - 1;
    
        SciaRegs.SCIHBAUD = (temp>>8) & 0xFF;
        SciaRegs.SCILBAUD = (temp) & 0xFF;
    	}
    #endif
    
    #ifdef SCIA_INTERNAL_LOOPBACK
       SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
    #else // #ifdef SCIA_INTERNAL_LOOPBACK
       ScibRegs.SCIFFTX.bit.TXFFIENA = 0; // disable TX interrupt
    #endif // #ifdef SCIA_INTERNAL_LOOPBACK
    
    #ifdef SCIA_INTERNAL_LOOPBACK
       SciaRegs.SCIFFTX.all=0xC028;
       SciaRegs.SCIFFRX.all=0x0028;
    #else // #ifdef SCIA_INTERNAL_LOOPBACK
       SciaRegs.SCIFFTX.all=0xC02e;
       SciaRegs.SCIFFRX.all=0x0021;
    #endif // #ifdef SCIA_INTERNAL_LOOPBACK
       SciaRegs.SCIFFCT.all=0x00;
    
       SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset
       SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
       SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
    }
    
    interrupt void scibTxFifoIsr(void)
    {
        Uint16 i;
        for(i=0; i< 8; i++)
        {
     	   ScibRegs.SCITXBUF=sdataB[i];     // Send data
    	}
    
        for(i=0; i< 8; i++)                 //Increment send data for next cycle
        {
     	   sdataB[i] = (sdataB[i]-1) & 0x00FF;
    	}
    
    	ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
    	PieCtrlRegs.PIEACK.all|=0x100;      // Issue PIE ACK
    }
    
    interrupt void scibRxFifoIsr(void)
    {
        Uint16 i;
    	for(i=0;i<8;i++)
    	{
    	   rdataB[i]=ScibRegs.SCIRXBUF.all;	 // Read data
    	}
    	for(i=0;i<8;i++)                     // Check received data
    	{
    	   if(rdataB[i] != ( (rdata_pointB-i) & 0x00FF) ) error();
    	}
    	rdata_pointB = (rdata_pointB-1) & 0x00FF;
    
    	ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;  // Clear Overflow flag
    	ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; 	// Clear Interrupt flag
    	PieCtrlRegs.PIEACK.all|=0x100;  	// Issue PIE ack
    }
    
    void scib_fifo_init()
    {
       ScibRegs.SCICCR.all =0x0007;    // 1 stop bit,  No loopback
                                       // No parity,8 char bits,
                                       // async mode, idle-line protocol
       ScibRegs.SCICTL1.all =0x0003;   // enable TX, RX, internal SCICLK,
                                       // Disable RX ERR, SLEEP, TXWAKE
       ScibRegs.SCICTL2.bit.TXINTENA =1;
       ScibRegs.SCICTL2.bit.RXBKINTENA =1;
    #if 0
       SciaRegs.SCIHBAUD = 0x0000;
       SciaRegs.SCILBAUD = SCI_PRD;
    #else
    	{
        long temp;
        // setup baud rate
        // formula = lspclk/(baud*8) - 1;
        temp = 25000000L / (115200 * 8) - 1;
    
        SciaRegs.SCIHBAUD = (temp>>8) & 0xFF;
        SciaRegs.SCILBAUD = (temp) & 0xFF;
    	}
    #endif
    
       ScibRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
    
       ScibRegs.SCIFFTX.all=0xC028;
       ScibRegs.SCIFFRX.all=0x0028;
       ScibRegs.SCIFFCT.all=0x00;
    
       ScibRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset
       ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;
       ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
    
    }
    
    //===========================================================================
    // No more.
    //===========================================================================
    
    

    Regards,

    Igor

  • Thank you very much Igor,

    But I have o problem, I use the TMDSHVMTRPFCKIT and the SCI port is used for the USB comunication.

    I need some library that understands the RS232 protocol and be able to communicate via the GPIO. In

    micropic exist this type of library for pics and don't need specific hardware.

    Regards.

  • Hi

    F28335 has 3 SCI (SCI-A, SCI-B, SCI-C).

    Regards,

    Igor

  • Hi

    Yes, I know, but the GPIO 19 and GPIO 18 is used for (SPI), and the rest of GPIO 

    for SCI is used for PWM. The GPIO 62 and GPIO 63 is not used but it's impossible connect  to the kit.

    So I need the library, if exist.

    Thanks.

  • Hi!

    And how about GPIO14,15 or 22,23 for SCI-B? Is it impossible to connect too?

    Igor

  • There are numerous UART implementations on the net. Ex: http://supp.iar.com/Support/?note=88469

    Generally search for "software UART"

    Please remember that RS-232 defines not only logical serial interface but electrical standard as well.

    Regards,
    Maciej