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.

UART (SCI-A) Communication Issue on (Pins 84/85) – No Output.

Part Number: TMS320F28379S
Other Parts Discussed in Thread: CONTROLSUITE

Tool/software:

Dear TI Support Team,

                                            I’m encountering an issue with UART communication using SCI-A on the TMS320F28379S micro controller.

Despite proper initialization, no data is being transmitted or received via pins 84 (SCITXDA) and 85 (SCIRXDA) in my application firmware.


Main Issue:
SCI-A is configured correctly in my firmware, and execution reaches the UART transmit function and while observing in debug window the value reaches the SCI TX register("SciaRegs.SCITXBUF.all").

However, there is no observable output on TX (pin 84) when monitored through a TTL to USB converter or oscilloscope.

But while using GPIO pin 28 and 29 with same code(only pin modified) i can send and receive data.

I've also tried using the example code provided with controlSUITE and result is same.  

The same USB-TTL adapter works fine with other boards, confirming it's functional.


Hardware Setup:
MCU: TMS320F28379S on a custom PCB
UART Interface: SCI-A
SCI-A TX (Pin 84) and RX (Pin 85) routed to a FT232 TTL-to-USB converter (3.3V logic confirmed) on board.
Baud rate: 115200
PC COM port settings: Verified – No parity, 1 stop bit

Questions:-

1. Are there any known issues with using pins 84/85 for SCI-A TX/RX in application firmware?
2. Do these pins require special handling or unlock sequences after reset?
3. Are there internal conflicts (e.g., clock configuration or pin mux issues) that could block UART output?
4. Is there a recommended method to verify SCI-A output at pin level?

I’d appreciate any documentation references or debugging suggestions. Below is my code for reference

#include "F28x_Project.h"

#define SCI_A_BAUD_RATE    115200UL
#define LSPCLK_FREQ        50000000UL  // LSPCLK is 50 MHz
#define GPIO_LED_TOGGLE    88
#define GPIO_HEARTBEAT     99

// Function Prototypes
void system_init(void);
void gpio_init(void);
void sci_init(void);
void scia_tx_char(unsigned int a);
__interrupt void sciaRxFifoIsr(void);

// Main Function
void main(void)
{
    system_init();
    gpio_init();
    sci_init();

    EALLOW;
    PieVectTable.SCIA_RX_INT = &sciaRxFifoIsr;
    EDIS;

    PieCtrlRegs.PIEIER9.bit.INTx1 = 1; // Enable SCIRXINTA in PIE group 9
    IER |= M_INT9;                    // Enable CPU INT9
    EINT;                             // Enable global interrupt INTM
    ERTM;                             // Enable real-time DBGM

    while (1)
    {
        GpioDataRegs.GPDTOGGLE.bit.GPIO99 = 1; // Heartbeat toggle
        scia_tx_char('A');      // Send 'A' as well
        DELAY_US(500000); // 0.5s delay
    }
}

// Initializes system control and interrupts
void system_init(void)
{
    InitSysCtrl();      // Clock, PLL, watchdog
    DINT;               // Disable interrupts
    InitPieCtrl();      // Default PIE setup
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable(); // Populate vector table
}

// GPIO Initialization for LED and SCI
void gpio_init(void)
{
    EALLOW;

    // LED Toggle Output GPIO88
    GpioCtrlRegs.GPCGMUX2.bit.GPIO88 = 0;
    GpioCtrlRegs.GPCMUX2.bit.GPIO88 = 0;
    GpioCtrlRegs.GPCDIR.bit.GPIO88 = 1;

//    GpioCtrlRegs.GPCGMUX2.bit.GPIO84 = 0;
//    GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 0;
//    GpioCtrlRegs.GPCDIR.bit.GPIO84 = 1;

    // Heartbeat GPIO99
    GpioCtrlRegs.GPDGMUX1.bit.GPIO99 = 0;
    GpioCtrlRegs.GPDMUX1.bit.GPIO99 = 0;
    GpioCtrlRegs.GPDDIR.bit.GPIO99 = 1;

    // SCIA_TX = GPIO84, SCIA_RX = GPIO85
    GpioCtrlRegs.GPCGMUX2.bit.GPIO84 = 1;  // 01: SCITXDA
    GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 1; // SCITXDA
    GpioCtrlRegs.GPCDIR.bit.GPIO84 = 1;

    GpioCtrlRegs.GPCGMUX2.bit.GPIO85 = 1;  // 01: SCIRXDA
    GpioCtrlRegs.GPCMUX2.bit.GPIO85 = 1; // SCIRXDA
    GpioCtrlRegs.GPCDIR.bit.GPIO85 = 0;
    GpioCtrlRegs.GPCQSEL2.bit.GPIO85 = 3; // Asynchronous

    EDIS;
}

// SCI Initialization
void sci_init(void)
{
    uint16_t brr = (LSPCLK_FREQ / (SCI_A_BAUD_RATE * 8UL)) - 1;

    // FIFO Init
    SciaRegs.SCIFFTX.all = 0xE040; // Enable FIFO, reset TX FIFO
    SciaRegs.SCIFFRX.all = 0x2061; // Enable RX FIFO, interrupt after 1 byte
//    SciaRegs.SCIFFCT.all = 0x0;
    SciaRegs.SCIFFCT.all = 0x00;

    // Communication Config
    SciaRegs.SCICCR.all = 0x07; // 1 stop bit, no parity, 8-bit char, async
    SciaRegs.SCICTL1.all = 0x0003; // Enable TX, RX
    SciaRegs.SCICTL2.all = 0x0003; // RX/TX interrupt enable

    // Baud rate
    SciaRegs.SCIHBAUD.all = (brr >> 8) & 0xFF;
    SciaRegs.SCILBAUD.all = brr & 0xFF;

    // Release from Reset
    SciaRegs.SCICTL1.all = 0x0023;
}

// Send one byte via SCI
void scia_tx_char(unsigned int a)
{
//    while (SciaRegs.SCIFFTX.bit.TXFFST == 16); // Wait for space
//    while (SciaRegs.SCIFFTX.bit.TXFFST >= 16); // Wait for space
    while (SciaRegs.SCIFFTX.bit.TXFFST != 0) {}
    SciaRegs.SCITXBUF.all = a;
}

// RX Interrupt Service Routine
__interrupt void sciaRxFifoIsr(void)
{
    unsigned int rx_data;

    while (SciaRegs.SCIFFRX.bit.RXFFST == 0); // Wait for data
    rx_data = SciaRegs.SCIRXBUF.all; // Read received byte

    scia_tx_char(rx_data);  // Echo back
    scia_tx_char('A');      // Send 'A' as well
    GpioDataRegs.GPCTOGGLE.bit.GPIO88 = 1; // Toggle GPIO88 on RX

    // Clear flags
    SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;     // Overflow
    SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;     // Interrupt flag
    PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9; // Acknowledge interrupt group
}