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.

[参考译文] CC3235SF:具有更大缓冲器的更快 UART

Guru**** 2561190 points
Other Parts Discussed in Thread: CC3235SF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1019110/cc3235sf-a-faster-uart-with-larger-buffer

器件型号:CC3235SF

为了实现更高的 UART 通信速度、我们希望查看是否有一个实现方案使用 DMA 和中断、而不是阻止和轮询。

我们还需要~32kB 的循环缓冲 器、以便 MCU 在具有时钟周期时处理传入的信息。

这是已经完成的吗?

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

    您好!

    我们将对此进行研究并返回给您。

    最棒的

    Saurabh

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

    Nicholas、您好!

    DMA 可与 UART 配合使用(请参阅 TRM 的第6章)。

    请查看 uart2callback 驱动程序示例作为参考。

    它使用 uart2驱动程序(https://software-dl.ti.com/ecs/SIMPLELINK_CC32XX_SDK/5_20_00_06/exports/docs/drivers/doxygen/html/_u_a_r_t2_8h.html)。

    这 可能是您正在寻找的(尽管原始 UART 驱动程序也可以与 DMA 配合使用)。

    UART2_Mode_callback 似乎  符合您的应用要求。  

     

    BR、

    Kobi

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

    你好、Kobi、我相信你的答案是不正确的。

    细节就是魔鬼。 让我们来看看一些。

    1A。 UART 数据是异步的、字节数也不同。1字节上的中断将不起作用。(请参阅下一条语句)

    2A。 波特率为3、000、000 =每秒30、000字节。

      1/300000处的不合理中断。 或甚至是8、30000和 fifo

    3A。 连续数据包大小可以从1字节到16k 字节不等。

    回调不起作用。

    这是我多次使用其他硬件来解决这个问题的方法...我知道如何使用其他 UART 和 DMA IP 块来解决这个问题、但我是 CC3235SF 的新手。

    1b.创建大小为32k 的 DMA 循环缓冲器。

     (或两个16k 乒乓缓冲器)

    2b.通过前台任务循环维护头/尾指针。

    3b.每20ms 创建一个计时器中断并检查头/尾指针。 标记前台任务以调用进程数据函数以消耗接收到的数据并更新头指针。

    那么、这里是我没有答案、也找不到示例代码的问题。

    a. UDMA 能否处理32k (或两个16k)缓冲器?

    b.为了更新尾指针、我能否从 UDMA 外设寄存器中读取最后写入字节地址的循环缓冲器指针?

    请仅在回答问题 A 和 B 或具有处理1a-3a 中详述的数据流的工作示例代码时才作出响应。

    谢谢...Daniel

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

    有关UDMA 的详细信息、请参阅 CC3235x TRM (www.ti.com/.../swru543)。

    如果您不知道事务的大小并且需要逐字节读取、则 DMA 可能不是正确的方法。

    BR、

    Kobi

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

    您好、Kobi、

    客户之前已通读这些部分、并已在另一平台上实现此类功能。 有几个具体的问题被问及:

    • UDMA 能否处理32k (或两个16k)缓冲器?
    • 为了更新尾指针、我能否从 UDMA 外设寄存器中读取最后写入字节地址的循环缓冲器指针?

    您能直接解决这些问题吗? 但 TRM 并不清楚。  

    谢谢、
    Nick

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

    UDMA 最多可处理1024个传输项目(每个传输8/16/32位)、因此在单个传输中最多可处理4KB。

    我不确定我是否理解第二个问题、为什么软件无法计算最后写入的字节?  

    无论如何、它由 driverlib 计算(请参阅 Udma.c)以更新 控制块。

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

    我不讨论仲裁数目。

    我正在尝试构建一个循环缓冲器。

    让我尝试以不同的方式提出这个问题。

    给定:

    UART 外设将在接收到其 Rx FIFO 中的字节时生成 DMA 请求。

    仲裁数目将基于 UART DMA 请求。 (请参阅第6.2.3.5节)

    所有中断关闭。

    UDMA 从16KB 存储器位置的第一个位置的目标指针开始。

    当多个基于 UART 的 DMA 请求完成时、UDMA 将使目标指针递增。

    在 TRM 或 UDMA.C 代码中未回答的问题:

    UDMA 如何知道何时到达16KB 目标块的末尾?

    如何将其设置为循环、以便在16KB 的末尾返回到块的第一个字节?

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

    您正在讨论(循环缓冲器)软件实现、但从硬件角度来看、每个 UDMA 事务的传输项目限制为1024个。 设置下一个事务并 处理缓冲区绕回的是软件(通常在中断上下文中)。

    请参阅 UART 驱动程序实现。

    BR、

    Kobi

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

    因此 、在 UART 部分6.2.3.5中的 TI 文档 SWRU543A 中:

    当 DMA 操作被使能时、UART 在接收或发送通道上发出 DMA 请求、此时相关的 FIFO 可以传输数据。 对于接收通道、只要 RX FIFO 中有数据、就会发出单次传输请求。 只要 RX FIFO 中的数据量达到或超过 UARTIFLS 寄存器中配置的 FIFO 触发深度、就会产生猝发传输请求。

    您是否说 UART 外设无法在硬件中自动为 FIFO 断言突发 uDMA、如上述语句所示?

    您是否还说过、通过 DMA 传输 UART 硬件的唯一方法是在 UART ISR 内发出请求、因为驱动程序就是这样工作的?

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

    支持突发模式、但软件会设置每个事务、以便由 软件控制环形缓冲器的实现。

    BR、

    Kobi