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.

[参考译文] AM3352:写入时 UART 超时问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1500123/am3352-problem-with-uart-timing-out-on-write

器件型号:AM3352

工具/软件:

您好、

我已经为 BBB 构建了定制 Yocto 图像、我使用 UART 时遇到问题。 我有两个 UART 映射的 ttyS1和 ttyS4。 但出于某种原因、我在 ttyS1超时写入数据时遇到了问题、但只有在发送第一个数据字符串后才会出现。

过程如下:写入数据->读取响应->写入数据->超时未知错误

ttyS4不会出现这种情况。 当没有任何器件连接到 UART 时、也会发生这种情况。

完全相同的代码适用于 TI Processor SDK Linux 映像以及 Raspbian。 我的问题是如何确定出问题或调试问题? dmesg 中没有任何东西可以给我提示。 我还在映像中添加了 linux-ti-staging-6.12内核、认为这可能是内核问题、但这也没有帮助。

该程序是一个小型 QT (5.15.13)控制台程序。

如果我对可能导致此问题的原因没有任何想法、我们将非常感谢您提供任何帮助。

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

    尊敬的 TJ:

    请共享您用于启用2 UART 的内核补丁。

    还请共享 Linux 引导日志。

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

    这也是我的示例串行程序的输出。 它只是这个示例有一个不同的主目录: https://code.qt.io/cgit/qt/qtserialport.git/tree/examples/serialport/cwriterasync/serialportwriter.cpp?h=5.15

    主页:

    int main(int argc, char *argv[])
    {
        QCoreApplication coreApplication(argc, argv);
    
        QSerialPort serialPort;
        // serialPort.setPortName("ttyS1");
        serialPort.setPortName("ttyS4");
        serialPort.setBaudRate(9600);
    
        if (serialPort.open(QIODevice::ReadWrite))
            qDebug() << "Opened serial port";
        else
            qDebug() << "Failed to open serial port";
    
        QByteArray data = QByteArrayLiteral("\x00\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0");
    
        SerialPortWriter serialPortWriter(&serialPort);
        serialPortWriter.write(data);
    
        return coreApplication.exec();
    }

    这是在 ttyS1和 ttyS4上运行它的输出。 如您所见、在发送数据后、一切都停止工作。 我还需要按 Ctrl+c ttyS1上的程序、在 ttyS4上它会按应该的方式退出。

    Data successfully sent to port ttyS4
    root@beaglebone:~# ./serial-tester-ttyS4
    Opened serial port
    Data successfully sent to port ttyS4
    root@beaglebone:~# ./serial-tester-ttyS4
    Opened serial port
    Data successfully sent to port ttyS4
    root@beaglebone:~# ./serial-tester-ttyS4
    Opened serial port
    Data successfully sent to port ttyS4
    
    root@beaglebone:~# ./serial-tester-ttyS1
    Opened serial port
    Data successfully sent to port ttyS1
    ^C
    root@beaglebone:~# ./serial-tester-ttyS1
    Opened serial port
    Operation timed out for port ttyS1, error: Unknown error
    ^C
    root@beaglebone:~# ./serial-tester-ttyS1
    Opened serial port
    Operation timed out for port ttyS1, error: Unknown error
    root@beaglebone:~# ^C

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

    尊敬的 TJ:

    内核启动日志在 UART 中没有任何明显的问题、您的器件树更改与我在内核4.19中所做的更改非常相似。 唯一的区别是我在引脚多路复用中设置了_pullup/_pullup、但我认为这无关紧要。

    您能否不使用 Qt 测试程序、而是运行以下简单的测试多项测试、看看它是否也有问题?

    # stty -F /dev/ttyS1 -echo 9600
    # echo "what-string-you-wang">/dev/ttyS1

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

    尊敬的 Bin Liu:

    我运行了这些命令、每次都能成功。 但回显 ttyS1需要30秒才能返回。 我运行了一个小型的纯 C 程序来通过 UART 发送数据、这个程序似乎很成功并且可以正常工作。 但关闭文件句柄需要30秒才能关闭它。 在 ttyS4上不会发生这种情况。 我将继续使用 C 进行一些测试并返回报告

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

    我已连接逻辑分析仪、看看是否可以在那里找到任何内容。 当我运行 echo 命令时、我可以看到数据。 但一旦完成,对于30秒,回显命令需要关闭它重复发送\0。 请注意、只要我将数据短接至3个字节或更少、就不会发生这种情况、那么一切似乎都在按预期运行。

    echo "te">/dev/ttyS1

    echo "test"</dev/ttyS1

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

    尊敬的 Bin Liu:

    我还没有找到解决方案、但我添加了一个较旧的 TI 内核(linux_ti_stating_6.1)、ttyS1的所有问题都已经解决。 我将尝试添加一些较新的内核、并查看是否可以确定此问题出现的位置。

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

    尊敬的 TJ:

    感谢更新内核 v6.1中未出现此问题。

    支持 AM335x 的 TI Processor SDK 的最新版本是 SDKv9.3.5.2、该版本使用内核 v6.1。 我们尚未在 AM335x 上验证任何新版本的内核。