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.

[参考译文] TM4C123GH6PM:Tiva C UART 未接收数据

Guru**** 2551570 points
Other Parts Discussed in Thread: EK-TM4C123GXL, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1255454/tm4c123gh6pm-tiva-c-uart-not-receiving-data

器件型号:TM4C123GH6PM
主题中讨论的其他器件:EK-TM4C123GXLUNIFLASH

我正在尝试使用 UART 将 Tiva C 与 FTDI 连接起来。 我能够从 Tiva 中发送数据并在 FTDI 中接收、但无法从 FTDI 中读取 Tiva 中的数据。 我正在使用以下配置:

115200bps、8个数据位、1个停止位、无奇偶校验

我的硬件连接有:

TX (FTDI)、带有 RX - PC4 (TIVA)
RX (FTDI)、带有 TX - PC5 (TIVA)

两者的接地引脚相互连接。

我已经使用 UART 通过 ESP32测试了 FTDI、它可以正常工作。 请帮助我解决此问题。 我有附加代码、以防软件配置错误。

#include <string.h>
#include "color_generator.h"
#include "inc/hw_ints.h"
#include "driverlib/uart.h"
#include "driverlib/interrupt.h"

#define MAX_SIZE 17
#define BAUD_RATE 115200
#define DELAY 50000000

char received_message[MAX_SIZE];
uint8_t loop_var = 0;
uint32_t len = 0;
const char* messages[] = {"WiFi started", "HTTP started", "WiFi connected"};
const char* text = "Received message: ";
const char* clear_screen = "\033[2J";
const char* newline_carriage_return = "\n\r";
const char* acknowledgement = "Indicating status...";

void uart_setup()
{
    // enable interrupts
    IntEnable(INT_UART4_TM4C123);

    // logging
    // enable gpio port A
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOA))
    {
        // wait till peripheral is ready
    }
    GPIOPinConfigure(GPIO_PA0_U0RX | GPIO_PA1_U0TX);
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    // enable UART0
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    while (!SysCtlPeripheralReady(SYSCTL_PERIPH_UART0))
    {
        // wait till peripheral is ready
    }
    UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), BAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);
    UARTEnable(UART0_BASE);

    // communication with FTDI
    // enable gpio port C
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
    while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOC))
    {
        // wait till peripheral is ready
    }
    GPIOPinConfigure(GPIO_PC4_U4RX | GPIO_PC5_U4TX);
    GPIOPinTypeUART(GPIO_PORTC_BASE, GPIO_PIN_4 | GPIO_PIN_5);

    // enable UART4
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART4);
    while (!SysCtlPeripheralReady(SYSCTL_PERIPH_UART4))
    {
        // wait till peripheral is ready
    }
    UARTIntEnable(UART4_BASE, UART_INT_RT);
    // UARTLoopbackEnable(UART4_BASE);
    UARTConfigSetExpClk(UART4_BASE, SysCtlClockGet(), BAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);
    UARTEnable(UART4_BASE);
}

void debug_led()
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    while (!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF))
    {
        // wait till peripheral is ready
    }
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
    GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, 0);
}

void uart_handler()
{
    UARTIntClear(UART4_BASE, UART_INT_RT);

    loop_var = 0;

    while (UARTCharsAvail(UART4_BASE) && loop_var < MAX_SIZE)
    {
        // GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);
        int32_t ch = UARTCharGet(UART4_BASE);
        // log_to_uart(&ch);
        received_message[loop_var] = ch;
        loop_var++;
    }

    // write received text to console
    log_to_uart(newline_carriage_return);
    log_to_uart(text);
    // GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);
    log_to_uart(received_message);

    write_to_uart(acknowledgement);
}

void write_to_uart(const char* text)
{
    len = strlen(text);
    for (loop_var = 0; loop_var < len; loop_var++)
    {
        UARTCharPut(UART4_BASE, text[loop_var]);
        while (UARTBusy(UART4_BASE))
        {
            // wait till transmit FIFO is empty
        }
    }
}

void log_to_uart(const char* text)
{
    len = strlen(text);
    for (loop_var = 0; loop_var < len; loop_var++)
    {
        UARTCharPut(UART0_BASE, text[loop_var]);
        while (UARTBusy(UART0_BASE))
        {
            // wait till transmit FIFO is empty
        }
    }
}

int main(int argc, char const *argv[])
{
    // set system clock frequency to 16 MHz
    SysCtlClockSet(SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

    // setup
    uart_setup();

    log_to_uart(clear_screen);
    
    debug_led();    // debug

    while (true)
    {
        // listen for input
        // write_to_uart("loopback");
        // SysCtlDelay(DELAY);
    }
       
    return 0;
}

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

    您好!

     抱歉、我目前在8/3不在办公室。 明天我回来的时候、我会仔细研究你的问题。  

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

    您好!

     -可以展示示波器或逻辑分析仪对 UART4的 TX 和 RX 引脚的捕捉吗? 您是否在 RX 引脚上看到来自 FTDI 的预期数据?

     -在 LaunchPad 上运行代码时遇到同样的问题吗?

     -如果你在 uart_handler()上放置一个断点,处理器会在那里停止吗?

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

    尊敬的 Charles:  

    我无法使用示波器或逻辑分析仪、因此无法检查 Tx 和 Rx 电平。 不过、

    1. FTDI 接收使用 Tiva C 可以正常工作、因为我可以向它发送数据、数据显示在连接到 FTDI 的串行监视器中。

    2.我还在 Tiva C 上尝试了回送功能,并且能够在 UART4中发送和接收数据。  

    3. UART_Handler()在复位后只进入一次,并且串行监视器上正在打印"Received message:"文本。 此后不会进入。

    4.连接到 FTDI 时、不接收任何数据、并且组帧错误和线中止错误位被置位。

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

    您好!

     您所演示的就是 UART4可以向终端发送数据、终端可以显示字符。 如果没有示波器、就很难调试 RX 引脚上发送的内容。 您还说过会出现中断和帧错误。 示波器可以很方便地调试这种类型的问题。  

     查看您的代码时、我只看到您 为接收超时中断启用了 UART_INT_RT。 您没有 为接收中断启用 UART_INT_RX。 这可能是您无法接收数据的问题。 你需要先解决这个问题。  

     我建议您 首先运行 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c123gxl\uart_echo 示例。 您将需要修改此 UART4示例。 您能否让该示例正常运行? 如果可以使用此示例、则表示您的代码有问题。  

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

    尊敬的 Charles:

    Rx 线保持高电平。 当我输入数据时、将不会接收到任何位。 使用示例 UART 回显程序验证了这一点。

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

    尊敬的 Dyutinmoy:

     uart_echo 是一个非常基本的示例、并从软件的角度进行了验证。 如果 Rx 保持高电平、则需要调试您所拥有的 FTDI。 您需要了解为什么 FTDI 在 RX 线路上输出高电平。  

    -你有另一个 FTDI USB 转 UART 转换器尝试吗? 我不支持任何转换器、而是在需要尝试不同的 UART 端口时使用类似此产品的器件连接到 LaunchPad。  https://www.amazon.com/DSD-TECH-SH CRID-U09C5-转换器-Support/DP/B07WX2DSVB/ref=SR_1_4?CRID=3F3MP1VQP3SV9&keywords=USB+TO+UART+converter&qid=1691158413&spref=USB+TO+UART%2C148&SR=8-4

    -我还建议您将程序从 UART4修改为 UART0,以便您可以在 LaunchPad 板上试用它。 LaunchPad 板具有内置的 USB 转 UART 转换器、该转换器是 ICDI 调试探针的一部分。 但是、ICDI 调试探针仅接受 UART0进行 COM 端口枚举。   

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

    我的主要目标是将 Tiva C 与 ESP32 Pico 连接。 由于这不起作用、我尝试了 ESP32与 FTDI、这实际上是有效的。 然后、当我尝试将 Tiva 与 FTDI 连接时、失败了。 这就是我怀疑这是 Tiva C 的问题。

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

    如果将 TIVA 与 ESP32连接、则不涉及 FTDI。 您只需使用 UARTTX 和 UARTRX 引脚进行连接。 什么功能无法正常工作? 同样、如果没有示波器或逻辑分析仪、调试问题将会困难得多。 我认为设备值得投资、但这就是您的需求。  

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

    尊敬的 Charles:

    在连接到 ESP32的 Tx 引脚后、我有一个逻辑分析仪、尝试在 PC4中读取、然后我能够读取从 ESP 发送的数据。 但是、当我打开连接到 UART0的串行监视器时、没有显示任何数据。 我连接了逻辑分析仪输出。 如果我的代码有任何问题、请提供建议。

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

    您好!

     首先、您没有 在逻辑分析仪捕获上显示每个通道的标签? 确定哪个通道是 UART0TX、UART0RX、UART4TX 和 UART4RX。 其次、它们都是平坦的线、就这些波形显示的情况而言、没有任何活动。 您需要缩小、或者这实际上就是 UART4RX 上接收到的内容。 如果是这种情况、就 Tiva MCU 而言、它不会接收任何数据。  

     为什么不做一些简单的实验呢。

     -您使用的是定制板吗? 如果要向 PC 上的终端发送数据、是否为 UART0提供了 FTDI?

     -修改您的代码以调用 log_to_uart()并发送一个字符。 您是否可以在 UART0TX 引脚上看到该操作? 终端是否显示字符? 请注意、如果您使用自己的定制板、则必须具有 FTDI。 如果您使用的是 LaunchPad、则不需要 FTDI。 在 LaunchPad 和您自己的自定义板上运行该实验。

     - 修改代码以调用 write_to_uart()并发送一个字符。 您能在 UART4TX 引脚上看到它吗? ESP 是否接收此字符?

     -在 uart_handler 上设置一个断点。  当处理器从 ESP 接收到字符时、是否进入 UART_handler。 您将需要执行一些单步操作来调试系统。  

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

    尊敬的 Charles:

    -我使用的是 https://www.ti.com/tool/EK-TM4C123GXL 板。 我未将 FTDI 与 UART0配合使用来与电路板通信。

    -我可以在调用 log_to_uart()时查看字符。

    -当我调用 write_to_uart ()时,我可以看到 UART4TX 管脚上的字符。 我还可以在 ESP32串行控制台中看到此字符、这意味着它正在接收该字符。

    -代码在从 ESP32接收数据时根本不输入 uart_handler()。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    -从 ESP32接收数据时,代码根本没有输入 uart_handler()。

    在六天前我给你的答复中,我写了以下内容。 您是否启用了 UART_INT_RX 以生成接收中断?

     查看您的代码时、我只看到您 为接收超时中断启用了 UART_INT_RT。 您没有 为接收中断启用 UART_INT_RX。 这可能是您无法接收数据的问题。 你需要先解决这个问题。  

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

    我做了。 仍然无法进入。

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

    需要检查的几个方面。  

    -您在您的逻辑分析仪上看到 UART4RX 活动了吗? RX 引脚上必须进行从高电平到低电平的转换、以指示每个 UART 协议的有效起始位、从而识别为帧的开始。

    -您看到 UARTRIS 位的 RXRIS 位置位了吗? 请参见下方的。  

     -显示整个 UART4转储。 请参阅下面的 CCS 内容。  

    -显示您的 startup_ccs.c 文件。 您是否已将 UART_handler 映射至中断矢量表中的 UART4? 请参见以下示例。  

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

    我正在 Debian 上使用 VSCode、通过 Uniflash 软件刷写。 您能就此提供相关建议吗? 我已经在启动文件(startup_gcc.c)中针对"UART4 Rx 和 Tx"添加了 uart_handler、而未设置 RXRIS。

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

    您尚未回答我的第一个问题。 UART4RX 在逻辑分析仪上显示了什么? 您看到有任何活动吗? 如果 RXRIS 位从未置位、则表示它没有接收到任何数据。 RXRIS 是指示字符正在接收的原始标志。 如果 对 UARTIM 寄存器中的 RXIM 位进行了置位、则表示启用了中断 RX 接收。 如果 RXRIS 和 RXIM 都为高电平、您还会看到 UARTMIS 寄存器的 RXMIS 位设置。  

    您还需要检查 ESP 的配置波特率是否与 Tiva 相同以及停止位数和奇偶校验设置相同。 它们必须相互匹配。  

    还可通过检查 UARTSR 寄存器来检查是否收到任何错误。 如果遇到错误、则需要调查检测到这些错误的原因。 首先显示您的 UART4RX 引脚。  

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

    为 UART4 Rx 引脚连接逻辑分析仪的捕捉

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

    您好!

     好的、UART4RX 上有数据。 您能展示一下我之前请求的 UART4的完整寄存器转储吗?

     您是否启用了 FIFO? 我在我们的代码中没有看到启用 FIFO。 是这样吗? 如果您启用了 FIFO、则需要等待 FIFO 至少半满 (8个字节)、然后它才会生成中断。 检查 UARTLCRH 寄存器中的 FEN 位。 默认情况下、复位后、FEN 为0。  

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

    尊敬的 Charles:

    我决定根据我的要求采取不同的方法。 感谢您的时间和帮助。