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.

How to enable UART1 of TMS320C6748 lcdk board?

Other Parts Discussed in Thread: TMS320C6748, OMAPL138

Dear Community,

I am trying to use UART1 of TMS320C6748 LCDK.

After suggestion? I have made shorted R206 and R209 . and opened R205 and R208.

but I am getting voltage at UART1_TX 0-0.5 V .

Is hardware bug? or It is software problem? 

DO I need to disable other peripherals  like SPI. If yes how?

With regards,

AS

  • Hi,

    Please elloborate your issue little bit ?

    What was the suggestion proposed and I think, you have not provided any details of the previous cause?

    Kindly provide more info. to move forward.

    Thanks & regards,
    Sivaraj K
  • Amlan,

    That is the only change required in the hardware to enable UART1 to the J15 connector. Are you configured the pinmux properly ?

    Regards,
    Senthil
  • I hope it won't be HW issue.
    I think, it may be the PINMUX (as of now it might have configured to some other peripheral) i.e pull down.

    Did you ru n the UART1 code on target board and checked the PINMUX4 register ?

  • Dear Amlan,
    I'm able to make it work the UART1 on OMAPL138 LCDK board.
    I didn't change anything on HW. Just I probed at R205 via CRO for UART1_TXD data and found the signal toggling while UART1 transmitting "StarterWare UART echo application".

    You need to do that HW change to get the UART1 outputs via J15 connector.
    I hope, that change won't cause the problem for you.

    I'm getting 3.3V on UART1_TXD line.

    I've used the following code.

    /**
     * \file  uartEcho.c
     *
     * \brief This is a sample application file which invokes some APIs
     *        from the UART device abstraction library to perform configuration,
     *        transmission and reception operations.
     */

    /*
    * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
    *
    *  Redistribution and use in source and binary forms, with or without
    *  modification, are permitted provided that the following conditions
    *  are met:
    *
    *    Redistributions of source code must retain the above copyright
    *    notice, this list of conditions and the following disclaimer.
    *
    *    Redistributions in binary form must reproduce the above copyright
    *    notice, this list of conditions and the following disclaimer in the
    *    documentation and/or other materials provided with the  
    *    distribution.
    *
    *    Neither the name of Texas Instruments Incorporated nor the names of
    *    its contributors may be used to endorse or promote products derived
    *    from this software without specific prior written permission.
    *
    *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    */

    #include "hw_psc_OMAPL138.h"
    #include "soc_OMAPL138.h"
    #include "interrupt.h"
    #include "lcdkOMAPL138.h"
    #include "hw_types.h"
    #include "uart.h"
    #include "psc.h"

    /****************************************************************************/
    /*                      LOCAL FUNCTION PROTOTYPES                           */
    /****************************************************************************/
    static void ConfigureIntUART(void);
    static void SetupInt(void);
    static void UARTIsr(void);

    /****************************************************************************/
    /*                      GLOBAL VARIABLES                                    */
    /****************************************************************************/
    char txArray[] = "StarterWare UART echo application\n\r";

    /****************************************************************************/
    /*                      LOCAL FUNCTION DEFINITIONS                          */
    /****************************************************************************/

    int main(void)
    {
        unsigned int intFlags = 0;
        unsigned int config = 0;

        /* Enabling the PSC for UART1.*/
        PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON,
                 PSC_MDCTL_NEXT_ENABLE);

        /* Setup PINMUX */
        UARTPinMuxSetup(1, FALSE);
       
        /* Enabling the transmitter and receiver*/
        UARTEnable(SOC_UART_1_REGS);

        /* 1 stopbit, 8-bit character, no parity */
        config = UART_WORDL_8BITS;

        /* Configuring the UART parameters*/
        UARTConfigSetExpClk(SOC_UART_1_REGS, SOC_UART_2_MODULE_FREQ,
                            BAUD_115200, config,
                            UART_OVER_SAMP_RATE_16);

        /* Enabling the FIFO and flushing the Tx and Rx FIFOs.*/
        UARTFIFOEnable(SOC_UART_1_REGS);

        /* Setting the UART Receiver Trigger Level*/
        UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
       
        /*
        ** Enable AINTC to handle interrupts. Also enable IRQ interrupt in ARM
        ** processor.
        */
        SetupInt();

        /* Configure AINTC to receive and handle UART interrupts. */
        ConfigureIntUART();

        /* Preparing the 'intFlags' variable to be passed as an argument.*/
        intFlags |= (UART_INT_LINE_STAT  |  \
                     UART_INT_TX_EMPTY |    \
                     UART_INT_RXDATA_CTI);

        /* Enable the Interrupts in UART.*/
        UARTIntEnable(SOC_UART_1_REGS, intFlags);


        /* Preparing the 'intFlags' variable to be passed as an argument.*/
        intFlags |= (UART_INT_LINE_STAT  |  \
                     UART_INT_TX_EMPTY |    \
                     UART_INT_RXDATA_CTI);

        /* Enable the Interrupts in UART.*/
        UARTIntEnable(SOC_UART_1_REGS, intFlags);

        while(1);
    }

    /*
    ** \brief   Interrupt Service Routine(ISR) to be executed on UART interrupts.
    **          Depending on the source of interrupt, this
    **          1> writes to the serial communication console, or
    **          2> reads from the serial communication console, or
    **          3> reads the byte in RBR if receiver line error has occured.
    */

    static void UARTIsr()
    {
        static unsigned int length = sizeof(txArray);
        static unsigned int count = 0;
        unsigned char rxData = 0;
        unsigned int int_id = 0;

        /* This determines the cause of UART1 interrupt.*/
        int_id = UARTIntStatus(SOC_UART_1_REGS);

    #ifdef _TMS320C6X
        // Clear UART1 system interrupt in DSPINTC
        IntEventClear(SYS_INT_UART1_INT);
    #else
        /* Clears the system interupt status of UART1 in AINTC. */
        IntSystemStatusClear(SYS_INT_UARTINT1);
    #endif
     
        /* Checked if the cause is transmitter empty condition.*/
        if(UART_INTID_TX_EMPTY == int_id)
        {
            if(0 < length)
            {
                /* Write a byte into the THR if THR is free. */
                UARTCharPutNonBlocking(SOC_UART_1_REGS, txArray[count]);
                length--;
                count++;
            }
            if(0 == length)
            {
                /* Disable the Transmitter interrupt in UART.*/
                UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
            }
         }

        /* Check if the cause is receiver data condition.*/
        if(UART_INTID_RX_DATA == int_id)
        {
            rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
            UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
        }


        /* Check if the cause is receiver line error condition.*/
        if(UART_INTID_RX_LINE_STAT == int_id)
        {
            while(UARTRxErrorGet(SOC_UART_1_REGS))
            {
                /* Read a byte from the RBR if RBR has data.*/
                UARTCharGetNonBlocking(SOC_UART_1_REGS);
            }
        }

        return;
    }

    /*
    ** \brief   This function invokes necessary functions to configure the ARM
    **          processor and ARM Interrupt Controller(AINTC) to receive and
    **          handle interrupts.
    */


    static void SetupInt(void)
    {
    #ifdef _TMS320C6X
        // Initialize the DSP INTC
        IntDSPINTCInit();

        // Enable DSP interrupts globally
        IntGlobalEnable();
    #else
        /* Initialize the ARM Interrupt Controller(AINTC). */
        IntAINTCInit();

        /* Enable IRQ in CPSR.*/    
        IntMasterIRQEnable();

        /* Enable the interrupts in GER of AINTC.*/
        IntGlobalEnable();

        /* Enable the interrupts in HIER of AINTC.*/
        IntIRQEnable();
    #endif
    }

    /*
    ** \brief  This function confiugres the AINTC to receive UART interrupts.
    */
    static void ConfigureIntUART(void)
    {
    #ifdef _TMS320C6X
        IntRegister(C674X_MASK_INT4, UARTIsr);
        IntEventMap(C674X_MASK_INT4, SYS_INT_UART1_INT);
        IntEnable(C674X_MASK_INT4);
    #else
        /* Registers the UARTIsr in the Interrupt Vector Table of AINTC. */
        IntRegister(SYS_INT_UARTINT1, UARTIsr);

        /* Map the channel number 2 of AINTC to UART1 system interrupt. */
        IntChannelSet(SYS_INT_UARTINT1, 2);

        IntSystemEnable(SYS_INT_UARTINT1);
    #endif
    }

    /****************************END OF FILE*************************************/

    Dear Amlan,
    I'm able to make it work the UART1 on OMAPL138 LCDK board.
    I didn't change anything on HW. Just I probed at R205 via CRO for UART1_TXD data and found the signal toggling while UART1 transmitting "StarterWare UART echo application".

    You need to do that HW change to get the UART1 outputs via J15 connector.
    I hope, that change won't cause the problem for you.

    I'm getting 3.3V on UART1_TXD line.

    I've used the following code.

  • Dear Titu,
    After hardware modification on OMAPL138 getting 3.3V at UART1_TX but not got at C6748 board .
    When I am debugging your provided code on OMAPL138 getting error on library as there is no lcdkomapl138.h library and after changing the library to lcdkC6748.h error removed but console error resulted.

    C674X_0: File Loader: Data verification failed at address 0xC0000000 Please verify target memory and memory map.
    C674X_0: GEL: File: C:\ti\myworkspace\uart_c674x_c6748_lcdkC6748\Debug\uartEcho.out: a data verification error occurred, file load failed.

    Do I need lcdkomapl138.h library to run the code? i.e. OMAPL138 board will not work with lcdkC6748.h.
    What is the web location of lcdkomapl138.h ? Do I need to install entire Startware for OMAP or pasting only the header file is sufficent?

    With regards,
    AS
  • Dear Amlan,
    Actually I have tested with OMAPL138 LCDK board.

    It would work in C6748 as well.

    You have to modify the code like below for C6748 board.

    #include "hw_psc_OMAPL138.h"
    #include "soc_OMAPL138.h"
    #include "interrupt.h"
    #include "lcdkOMAPL138.h"

    TO

    #include "hw_psc_C6748.h"
    #include "soc_C6748.h"
    #include "interrupt.h"
    #include "lcdkC6748.h"