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.

[参考译文] CC2642R:UART2 接收中断触发器具有过长的延迟

Guru**** 2794765 points

Other Parts Discussed in Thread: CC2642R, LAUNCHXL-CC26X2R1, SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1620412/cc2642r-uart2-receive-interrupt-triger-has-a-excessive-delay

器件型号: CC2642R
主题中讨论的其他器件: LAUNCHXL-CC26X2R1SysConfig

您好、张:

目前、我们需要使用 CC2642 UART 来模拟 LIN 总线以进行数据传输。 在测试过程中、我们发现 UART 数据接收存在过度延迟。 详情如下:

测试演示:
SDK 示例: examples\rtos\CC26X2R1_LAUNCHXL\drivers\uart2callback

UART 配置:
波特率:19200bps

测试程序:
PC 一次发送一个字节。 CC2642 在接收到该字节后、会立即发回一个字节(回显:接收发送的内容)。

测试结果:
对于从 PC 发送的数据、CC2642 需要超过 2ms 的时间来接收和重新发送该字节。 当波特率增加到 115200bps 时、延迟降低到大约 400µs。 如下图所示(黄色波形:PC 发送的数据;粉色波形:CC2642 返回的数据)。

此外、根据本演示切换到阻塞模式接收会产生相同的结果。

要求:
对于 LIN 仿真、19200bps 的 2ms 接收延迟是不可接受的。此问题可能与 UART 空闲中断有关。 是否有办法缩短 UART 接收中断触发延迟?

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

    尊敬的 runfa:

    这是 UART2 TI 驱动程序的一个预期行为 、仅依赖于 RT(读取超时)中断来处理读取事件。  TRM 的第 21.4.6 节提供了对中断的准确描述、但您最感兴趣的是下面两个部分:

    • Rx:当发生以下事件之一时、接收中断会改变状态:–如果 FIFO 启用且接收 FIFO 达到编程的触发电平。 当发生这种情况时、接收中断会置为高电平。 可以通过从接收 FIFO 读取数据直至其低于触发电平来清除接收中断、或者通过清除中断来清除该中断。 –如果 FIFO 禁用(深度为一个位置)并且接收到数据、从而填充该位置、则接收中断置为高电平。 可以通过对接收 FIFO 执行单次读取或清除中断来清除接收中断。
    • RX 超时:当接收 FIFO 不为空且在 32 位周期内没有接收到更多数据时、接收超时中断将置为有效。 当 FIFO 通过读取所有数据变为空(或通过读取保持寄存器)、或者当 1 被写入中断清除寄存器 (UART:ICR) 的相应位时、接收超时中断会被清除。

    本质上、UART2 驱动程序当前将使用 RX 超时值在接收到用于 FIFO 存储的数据超时后等待 32 位周期。  这考虑了在接收到初始字节后额外的 1.67ms、即 1/19200 = 52.08us * 32 = 1.67ms。

    通过将 UART2CC26X2.c 文件直接复制到我的工程工作区、禁用 FIFO 启用(即删除了 HWREG (hwAttrs->baseAddr + UART_O_LCRH)|= UART_LCRH_FEN;从 UART2CC26X2_initHw 交换 UART_INT_RT 使用情况)、我能够观察到最短的延迟

    我在下面提供了样片修改。  当然、这是一个初步演示、需要进行更多的开发工作、才能根据您的需求全面测试和验证此解决方案。  例如、我担心字节连续出现时、没有 FIFO 可用于存储在读取/处理前一个字节时可能错过的字节。  如果不使用读取超时中断、您确实应该考虑设计中 FIFO 阈值的可能性。

    e2e.ti.com/.../UART2CC26X2.c

    此致、
    Ryan

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

    您好、Ryan、

    感谢您的答复。

    按照您的建议、我将UART2CC26X2.c SDK 中的原始文件替换为您提供的修改版本、然后再次运行演示 (examples\rtos\CC26X2R1_LAUNCHXL\drivers\uart2callback)。 但是、结果表明延迟没有改善。

    此外UART2CC26X2.c、是否有其他需要修改的文件或配置?

    期待您的答复。
    此致。

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

    您好、Ryan、

    我想提供另一个最新情况。

    我注意到在修改文件后
    /source/ti/drivers/uart2/UART2CC26X2.c在 SDK 中、更改在编译期间不会生效。 即使我删除了该文件、工程仍然会成功构建而没有任何影响。

    此外,在 CCS 生成的映射文件中,我发现UART2CC26X2_hwiIntFxn函数(在中定义)UART2CC26X2.c实际上是从以下库链接的:

    (/source/ti/drivers/lib/iar/m4f/drivers_cc26x2.a)

    这表明工程使用的是预编译的驱动程序库、而不是源文件。

    在这种情况下、我应该如何正确集成修改后的UART2CC26X2.c文件以使其在编译中生效?

    此致。

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

    尊敬的 runfa:

    将 UART2CC26X2.c 文件直接复制到我的工程工作区

    在实践中表现为:

    这是我对默认项目所做的唯一更改。  我已确认我正在使用发行版 SDK、并且我向您提供的.c 文件进行了相应的更改。  我在 LAUNCHXL-CC26X2R1 上进行了测试、该器件应相当于该意义上的 CC2642R。

    此致、
    Ryan

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

    您好、Ryan、

    感谢您的答复。 添加UART2CC26X2.c到工程后、对此文件的修改按预期生效。

    在演示 (examples\rtos\CC26X2R1_LAUNCHXL\drivers\uart2callback) 中、UART 接收延迟已显著降低。 接下来、我将尝试将此修改应用于使用 UART2 模拟 LIN 总线的设计。

    顺便说一下、贵公司是否提供有关使用 CC2642 UART2 模拟 LIN 的示例项目或文档?

    此外、我想与你确认一点:

    UART2CC26X2_hwiIntFxn()为例—

    • 如果UART2CC26X2.c没有添加到 CCS 项目中、则映射文件显示的实现UART2CC26X2_hwiIntFxn()来自预编译的库source/ti/drivers/lib/iar/m4f/drivers_cc26x2.a

    • 添加UART2CC26X2.c到 CCS 项目后、映射文件显示的实现UART2CC26X2_hwiIntFxn()直接来自UART2CC26X2.c

    这是我第一次在此平台上进行开发、因此这种配置机制会感觉有点容易出错。 是否有任何详细的文档说明此驱动程序库和源覆盖机制的工作原理?

    此致。

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

    SimpleLink 连接没有任何有关 CC2642R UART2 上 LIN 仿真的开箱即用示例。  这里 提供了其他 MCU 产品线的一些 TI 应用手册和用户指南。  我还知道 CC27X5X10 的 UART 硬件中包含 LIN 功能、而 TI 驱动程序支持应在今年晚些时候发布。

    默认情况下、TI 驱动程序会对默认工程使用预编译的库 (drivers_cc26x2.a)。  您可以在 SysConfig 生成的 ti_utils_build_linker.cmd.genlibs 文件中看到这一点。  这就是  工程不引用源文件 (/source/ti/drivers/uart2/UART2CC26X2.c) 的原因。  我们可以通过 将 UART2CC26X2.c 文件添加到工程的 Arm 构建包含选项路径来更改此配置。  由于我不想更改源 UART2CC26X2.c 或添加额外的构建路径、因此将文件本地复制到我的工程工作区并进行相应的编辑是最有意义的。  此本地文件将覆盖预编译库中的用法。

    此致、
    Ryan