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.

[参考译文] (引脚 84/85)上的 UART (SCI-A) 通信问题–无输出。

Guru**** 2538930 points
Other Parts Discussed in Thread: TMS320F28379S, CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1550024/uart-sci-a-communication-issue-on-pins-84-85-no-output

器件型号:TMS320F28379S
Thread 中讨论的其他器件: controlSUITE

工具/软件:

尊敬的 TI 支持团队:

                                 我在 TMS320F28379S 微控制器上使用 SCI-A 进行 UART 通信时遇到了问题。

尽管初始化正确、但我的应用固件中没有通过引脚 84 (SCITXDA) 和 85 (SCIRXDA) 发送或接收数据。


主要问题:
在我的固件中正确配置 SCI-A、执行到达 UART 发送函数、在调试窗口中观察、该值到达 SCI TX 寄存器(“SciaRegs.SCITXBUF.all")“)。

但是、通过 TTL 至 USB 转换器或示波器进行监控时、TX(引脚 84)上没有可观察到的输出。

但是、当使用  具有相同代码(仅修改引脚)的 GPIO 引脚 28 和 29 时、我可以发送和接收数据。

我还尝试使用 controlSUITE 提供的示例代码、结果是相同的。   

同一 USB-TTL 适配器可以与其他电路板一起工作、从而确认其正常工作。


硬件设置:
MCU:TMS320F28379S 位于定制 PCB 上
UART 接口:SCI-A
路由到板载 FT232 TTL 到 USB 转换器(确认为 3.3V 逻辑)的 SCI-A TX(引脚 84)和 RX(引脚 85)。
波特率:115200
PC COM 端口设置:已验证–无奇偶校验、1 个停止位

问题:-

1.在应用程序固件中将引脚 84/85 用于 SCI-A TX/RX 是否存在任何已知问题?
2.这些针脚在复位后是否需要特殊的处理或解锁序列?
是否存在可能阻止 UART 输出的内部冲突(例如时钟配置或引脚多路复用问题)?
4.是否有建议的方法来验证引脚电平上的 SCI-A 输出?

感谢您提供任何文档参考或调试建议。 下面是我的代码供参考

#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
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rajamurugan:

    如果选择了正确的引脚多路复用和 GPIO 设置、则是、SCIA 应能够在 GPIO 84/85 上输出。

    [引述 userid=“515467" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1550024/uart-sci-a-communication-issue-on-pins-84-85-no-output

    我还尝试使用 controlSUITE 提供的示例代码、结果是相同的。   

    [/报价]

    您尝试了 controlSUITE 中的哪个示例? 仅验证 — 在示例中,您所更改的只是选择了 GPIO、是这样吗?

    此致、

    Delaney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Delaney:

    我只更改了 GPIO  

    为了便于参考、我刚刚使用我的上述代码发送了一个字符、在调试时、我可以在 Tx 寄存器中看到数据、但看不到微控制器引脚的任何变化

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rajamurgugan:

    在写入 TX 缓冲区(持续刷新打开)以及 SCIFFTX 中的所有字段后、您能否共享 SCICTL2 中 TXRDY、TXEMPTY 和 TXINTENA 寄存器字段的值?

    此致、

    Delaney