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.

[参考译文] CC2340R5:UART、发送和接收期间丢失的字节。

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1430261/cc2340r5-uart-bytes-lost-during-transmission-and-reception

器件型号:CC2340R5
主题中讨论的其他器件: SysConfig

工具与软件:

你(们)好 我在很久之后才回来处理这个问题。 不幸的是问题仍然存在。  

我之前说过、在回调模式下接收数据时会出现问题。 在接收长帧(大于用户缓冲区大小、我在回调中将接收到的数据复制到较大的缓冲区)时会发生该问题。 当用户缓冲区大小为64时、有时在此期间会丢失一个字节、且始终为字节73 (即 DMA 传输大小+ FIFO 大小?) 这种情况并非总是发生。

在写入期间、我使用非阻塞模式、有趣的是、这里有时一个字节会丢失、并且始终是字节10。 我只需每15毫秒发送字符串"01234567890123456789123434\n"、就会收到以下信息:"0123456780123456789123434\n"  

我注意到、当问题发生(传输期间)时、在传输开始时始终会有一个 UART_INT_TXDMADONE 中断(我不知道为什么先前的传输会很长地完成)。 在随附的图像中、较低的轨迹是 UART_INT_TXDMADONE  中断(进入 UART_INT_TXDMADONE 中断时切换 GPIO 引脚)。
此项目基于带有一个 BT 堆栈的"data_stream"示例。 但是、我还进行了一项测试、按照以下方式修改了"uart2callback_LP_EM_CC2340R5_freertos_ticlang"示例、结果是相同的。

BR
Artur

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

    您好、Artur、

    我对以前的线程和回调模式不熟悉、但我知道一种竞态条件、这种情况将在即将推出的 SDK 更新中解决。  您在此处提供的非块代码也会导致竞态条件、在这种条件下、睡眠之间向 MCU 提供的唤醒时间很短(UART 在待机模式下未处于活动状态)、因此您缺少的字节可能是由于超出 SysConfig 中提供的环形缓冲区大小而过度填充 TX 缓冲区。  例如、如果您使用阻塞模式、则不会遇到此问题。

    此致、
    Ryan

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

    尊敬的 Rayan:

    感谢您的答复。
    我实际上不能使用阻塞模式、因为整个应用程序都在单线程中运行。 是否可以完全禁用 MCU 睡眠? 就功耗而言、这并不是一个关键的应用。
    关于之前的线程、我注意到在回调模式中、接收过程中还有一、两个字节丢失。 我写入的时候、始终是紧跟 DMA_BUFFER_SIZE+FIFO_SIZE 之后的一个字节。 因此、如果 DMA 缓冲区是64B、有时字节73会丢失。 这是否也与 MCU 睡眠有关?

    BR、
    Artur

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

    可尝试 在 SysConfig -> TI drivers ->电源模块中设置 PowerCC23X0_doWFI。  再一次、我还没有对上一主题进行深入评估、因此我不能做进一步评论。

    此致、
    Ryan