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.

[参考译文] TMS570LS3137:针对 SCI 的 TMS570LS3137 DMA 请求线配置

Guru**** 2529970 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1339422/tms570ls3137-tms570ls3137-dma-request-line-configuration-for-sci

器件型号:TMS570LS3137

您好!

我正在寻找针对 SCI2和 SCI1的 DMA 请求行选择、但我没有找到任何与之相关的文档部分。 那么、我们可以说为 SCI2和 SCI1选择每个请求线路吗?

此致、

古坎

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

    尊敬的 Furkan:

    Unknown 说:
    我正在查找针对 SCI2和 SCI1的 DMA 请求行选择、但我没有找到有关它的任何文档部分。 那么、我们可以说每个可为 SCI2和 SCI1选择的请求行吗?

    否、您无法为 SCI2和 SCI1使用所有 DMA 请求行。

    我想您已经知道、器件中有两个 SCI、一个是与 LIN 模块(SCI2)多路复用的、另一个是独立 SCI (SCI1/SCI)。

    以下是它们的 DMA 请求行:

    如果 LIN/SCI 模块配置到 SCI 中、则在上表中 LIN 发送 请求行 [第29话] 还将用作 SCI2发送 请求行。 同样、  LIN 接收  请求行  [第28话]  还将用作  SCI2接收  请求行。

    和上表 SCI 发送 只不过是 SCI1发送 此引脚已打开 [编辑] SCI 接收 只不过是 SCI1接收 此引脚已打开 [第30话]

    如果您需要、我具有 SCI DMA 的参考代码

    (+)[常见问题解答] RM48L952:如何使用 DMA 在 SCI 多缓冲模式下执行8字节传输-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    但请记住、这里、我们还将 SCI 配置为多缓冲模式、但在您的情况下、它可能不需要。

    --
    谢谢。此致、
    Jagadish。

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

    您好 Jagadish:

    我们解决了 DMA 请求问题。 在这里、我们遇到了有关帧的一些问题。 我按照 SCI_DMA 示例所示设置了100个帧和1个元素、然后我从串行监视器定期发送8个字节。 我仅从目标地址获得第一个索引值(LIN 的寄存器值)。  

    例如:

    我发送1、2、3、4、5、6、7、8 作为 ASCII、我只得到1。

    您可以从附件访问项目文件。

    此致、

    古坎

     e2e.ti.com/.../1351.TMS570LS3137_5F00_UART_5F00_Example.zip

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

    尊敬的 Furkan:

    您的代码有多处错误。

    1.您的源地址错误:

    此处不使用 RD 寄存器地址、而是使用多缓冲区地址。

    多缓冲器具有不同的功能。

    如果您在上面通过 pic 进行验证、您可以看到、从串行终端发送8个字节后、所有字节都按顺序存储在多缓冲寄存器 RD0和 RD1中。 而在 RD 寄存器中、一次将存储一个字节、并且在发送所有字节后、最后发送的字节由 RD 寄存器指向。

    2.帧计数和元素计数值错误:

    您在这里提到了具有帧传输权限的1个帧和8个元素? 这意味着每当 DMA 发生 SCI 触发事件时、DMA 就需要

    移动8个单元。 如果是这种情况、数据移位将如下所示:

    正如您所看到的、我只发送了1个字节、但接收到的缓冲区中的所有元素都被复制为1。

    该错误不正确、因为对于一个触发器、它应该只传输一个字节、而不是8个字节。

    3.在您的代码中,您启用了 SCI 中断。 如果您使用 DMA 进行接收、则不应启用中断。 如果两者都启用(SCI 中断和 DMA)、则 DMA 将不能正常工作。

    请验证此修改的代码:

    e2e.ti.com/.../0243.TMS570LS3137_5F00_UART_5F00_Example.zip

    --
    谢谢。此致、
    雅加迪什

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

    您好 Jagadish:

    首先,感谢很多解释。 我们根据 TMS570LC43x 的 sci_dma 示例编写了我们的代码。 但找不到为多缓冲区 DMA 指定的任何示例。 因此、我们在这里应用了我们的解决方案、假设我们必须使用 LINRX 和 LINTX 寄存器来获取数据或传输数据。 如上图所示、多缓冲器解决方案得到了相同的结果。 当我们从串行监视器发送消息时、我们仅接收第一个索引或所有索引具有与第一个索引相同的值。  

    根据文档、我们可以将 DMA 与多缓冲器结合使用。 但是我们无法成功解决多缓冲的问题?

    如果我对您的问题有如下回答:

    1 - SCI 通信具有恒定的大小(8个字节)。   

    参考手册中提到的框架架构。 我们假设可以使用字节作为元素、 8字节等于一帧。

    2 -在 DMA 之前、我们使用了中断、但在 DMA 实施之后、我们不想使用 DMA 来获取接收数据。 因此对我们来说不是必需的。

    还有一个问题、我们如何在没有中断(轮询)的情况下使用发送 DMA?我们是否必须为此设置一些 FIFO 标志?

    最后,我们尝试了您的代码,我们无法获取数据。 我们只得到一次8个字节。  

    此致、

    古坎

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

    尊敬的 Furkan:

    但我们找不到任何指定多缓冲 DMA 的示例

    (+)[常见问题解答] RM48L952:如何使用 DMA 在 SCI 多缓冲模式下执行8字节传输-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    以上链接包含 SCI 上的多次缓冲 DMA 示例。 如果您验证上述代码、就可以清楚地了解如何在 DMA 模式下使用多缓冲 SCI 传输数据。

    --
    谢谢。此致、
    Jagadish。

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

    您好 Jagadish:

    我在器件上检查了该代码、但它不起作用。 我没有为此项目发送一条消息。 在我们的项目代码中、dma_FLAG 条件停留在一段时间内。

    此致、

    古坎

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

    尊敬的 Furkan:

    我根据您的要求创建了一个示例。

    我正在执行以下步骤:

    1.我启用了8字节多缓冲区长度的多缓冲区。 这意味着我们将在向接收缓冲区 RD0和 RD1接收8个字节后收到 DMA 触发。

    2.在接收缓冲区中接收8个字节后,我将使用两次32位的传输把8个字节输入到目的缓冲区中。 这就是我初始化每个元素大小为32位、元素数量为2、帧数为1的原因。 并且我的 DMA 传输将在移动1个包含2个元素的帧后完成。

    3.在无限循环中,我验证块传输是否完成(在本例中,块传输是1个有两个元素的帧),如果块传输完成,那么我将设置一个标志。 在这里、除了轮询、您还可以使用 DMA BTC 中断。

    测试结果:

    我从串行端口发送了8个字节、如下所示:

    您还可以在 RD 寄存器和目标缓冲区中看到8个字节:

    注:

    您应该了解以下内容、即使 DMA 支持64  位传输、但无法将64位数据从 SCI 的多缓冲区直接移动到目标地址。 这是因为 RD0的起始地址

    您可以看到、RD0起始地址是0x64 (100)。 该值不是8的倍数、因此我们无法从此地址进行8字节传输。 正因为如此、在将8个字节移入 RD 寄存器后、我将进行两次32位传输。

    参考代码如下:

    e2e.ti.com/.../SCI_5F00_Multibuffer_5F00_DMA_5F00_LS3137.zip

    --
    谢谢。此致、
    Jagadish。

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

    非常感谢 jagadish。 我验证了代码。 它工作得非常好。

    此致、

    古坎