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.

Can't read characters in hyperterminal using the given code



Dear TI,

I'm trying to use the SCI  to send characters to computer and vice-versa - reason is using RS-232 to control something

Using the given example, I couldn't get the hyperterminal to display the example that has been given by TI. I'm getting some random character in my hyperterminal, and I know that there is something wrong/incorrect during this process.

I am quite happy to upload a screenshot of it.

Could someone give me a hand to get this RS-232 connection going?

Kind regards,

Sucahyo

  • Hi,

        Please paste the code what ur using for RS-232 Communication,so that one can help u.

     

    Regards

    kshatriya.

  • Kshatriya,

    Following is the code that's given from TMS.

    // TI File $Revision: /main/3 $
    // Checkin $Date: July 2, 2007   11:35:00 $
    //###########################################################################
    //
    // FILE:    Example_281xSci_Echoback.c
    //
    // TITLE:   DSP281x Device SCI Echoback.
    //
    // ASSUMPTIONS:
    //
    //    This program requires the DSP281x header files.
    //    As supplied, this project is configured for "boot to H0 RAM" operation.
    //
    //    Connect the SCI-A port to a PC via a transciever and cable.
    //    The PC application 'hypterterminal' can be used to view the data
    //    from the SCI and to send information to the SCI.  Characters recieved
    //    by the SCI port are sent back to the host.
    //
    //    As supplied, this project is configured for "boot to H0 RAM"
    //    operation.
    //
    //
    // DESCRIPTION:
    //
    //
    //    This test recieves and echo-backs data through the SCI-A port.
    //
    //    1) Configure hyperterminal:
    //       Use the included hyperterminal configuration file SCI_96.ht.
    //       To load this configuration in hyperterminal: file->open
    //       and then select the SCI_96.ht file.
    //    2) Check the COM port.
    //       The configuration file is currently setup for COM1.
    //       If this is not correct, disconnect Call->Disconnect
    //       Open the File-Properties dialog and select the correct COM port.
    //    3) Connect hyperterminal Call->Call
    //       and then start the 281x SCI echoback program execution.
    //    4) The program will print out a greeting and then ask you to
    //       enter a character which it will echo back to hyperterminal.
    //
    //    As is, the program configures SCI-A for 9600 baud with
    //    SYSCLKOUT = 150MHz and LSPCLK = 37.5 MHz
    //
    //
    //    Watch Variables:
    //       LoopCount for the number of characters sent
    //       ErrorCount
    //
    //
    //###########################################################################
    // $TI Release: DSP281x C/C++ Header Files V1.20 $
    // $Release Date: July 27, 2009 $
    //###########################################################################

    #include "DSP281x_Device.h"     // DSP281x Headerfile Include File
    #include "DSP281x_Examples.h"   // DSP281x Examples Include File

    // Prototype statements for functions found within this file.
    void scia_echoback_init(void);
    void scia_fifo_init(void);
    void scia_xmit(int a);
    void scia_msg(char *msg);

    // Global counts used in this example
    Uint16 LoopCount;
    Uint16 ErrorCount;

    void main(void)
    {

        Uint16 ReceivedChar;
        char *msg;

    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the DSP281x_SysCtrl.c file.
       InitSysCtrl();

    // Step 2. Initalize GPIO:
    // This example function is found in the DSP281x_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
       // InitGpio(); Skipped for this example

    // For this example, only init the pins for the SCI-A port.
    // This function is found in the DSP281x_Sci.c file.
       EALLOW;
       GpioMuxRegs.GPFMUX.all=0x0030;    // Select GPIOs to be Scia pins
                                        // Port F MUX - x000 0000 0011 0000
       GpioMuxRegs.GPGMUX.all=0x0030;    // Select GPIOs to be Scib pins
                                        // Port G MUX - x000 0000 0011 0000
       EDIS;

    // 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 DSP281x_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 DSP281x_DefaultIsr.c.
    // This function is found in DSP281x_PieVect.c.
       InitPieVectTable();

    // Step 4. Initialize all the Device Peripherals:
    // This function is found in DSP281x_InitPeripherals.c
    // InitPeripherals(); // Not required for this example

    // Step 5. User specific code:

        LoopCount = 0;
        ErrorCount = 0;

        scia_fifo_init();       // Initialize the SCI FIFO
        scia_echoback_init();  // Initalize SCI for echoback

        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.RXFIFST!=1) { } // 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++;
        }

    }


    // 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 =0x0003;
        SciaRegs.SCICTL2.bit.TXINTENA =1;
        SciaRegs.SCICTL2.bit.RXBKINTENA =1;

        SciaRegs.SCIHBAUD    =0x0000;  // 9600 baud @LSPCLK = 37.5MHz.
        SciaRegs.SCILBAUD    =0x0079;

        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=a;

    }

    void scia_msg(char * msg)
    {
        int i;
        i = 0;
        while(msg[i] != '\0')
        {
            scia_xmit(msg[i]);
            i++;
        }
    }

    // Initalize the SCI FIFO
    void scia_fifo_init()
    {
        SciaRegs.SCIFFTX.all=0xE040;
        SciaRegs.SCIFFRX.all=0x204f;
        SciaRegs.SCIFFCT.all=0x0;

    }






    //===========================================================================
    // No more.
    //===========================================================================

     

    I was expecting to see something similar to the string *char, but instead I got funny random characters in my hyperterminal.

    Is my setting of baud rate wrong?

    Kind regards,

    Sucahyo

  • Sucahyo,

     

    Below given are the register settings to achieve 9600 baudrate at LSPCLK of 37.5MHz:

           SciaRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 37.5MHz.

           SciaRegs.SCILBAUD    =0x00E7;

     

    Baudrate setting in your code is not correct.

     

    Please look at Baud-Select Register Field Description in SCI reference guide for baud rate calculation equation.

     

    Regards,

    Vamsi

  • Vamsi,

    I do apologize for the incorrect setting - the code from TI was modified to give a different baud rate, but I didn't change the comment

    The baud rate was changed to 38400. I was able to get some readings from the hyperterminal using both baud rate setting (9600 and 38400), but as I explained above the characters appeared to be random.

    For example, sending a character "a" and this was interpreted to be "=" by the hyperterminal.

    I am not entirely sure whether it is my computer settings/damaged serial cable/ or the setting in the baud rate.

    I look forward for your advice

    Sucahyo

  • Sucahyo,

    Did you use the hyperterminal config file given with echoback headerfile example?  If not, try using that.  You need to change hyperterminal settings for the correct baud rate.  By default, the hyperterminal config file that is provided with the example configures the hyperterminal for 9600 baud rate. 

    Regards,
    Vamsi

  • Thanks all for the help.

    Just managed to get it working. :)