您好!
我正在寻找针对 SCI2和 SCI1的 DMA 请求行选择、但我没有找到任何与之相关的文档部分。 那么、我们可以说为 SCI2和 SCI1选择每个请求线路吗?
此致、
古坎
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.
您好!
我正在寻找针对 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。
您可以从附件访问项目文件。
此致、
古坎
尊敬的 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。
尊敬的 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。