ST意法半导体
直播中

lalajie

9年用户 1279经验值
擅长:模拟技术 存储技术
私信 关注
[问答]

为什么在Linux环境下DMA2会中断SPI3通信呢?如何解决

我们正在研究 ST32MP1。当电路板在工程模式下工作时,SPI3 可以与结合了 DMA2 和 FIFO 的 CubeMX 软件一起正常工作。但是如果我执行由 Linux 加载的相同软件(rproc 启动),如果我使用函数 HAL_SPI_Transmit_DMA() 而不是使用 HAL_SPI_TransmitReceive_DMA(),则 DMA2 SPI 流停止工作。例如,如果要传输的字节数大于 33,则 DMA 将在 NDTR DMA 寄存器中的字节数处停止。
在工程模式下,这可以在相同的设置下正常工作。我测试了很多(链接器、堆栈、内存、FIFO 开/关...),但不知道为什么在 M4 only 模式下,一切正常。此外,如果我占用 30 个字节,则第一批数据由 DMA 传输,然后 SPI_ISR 被更新大约 15 次以发送其余数据......对于 40 个字节,DMA IRQ 是一个,但在大约 15 个字节之后并且不调用 SPI IRQ。
有点好奇,但实际上,我不知道仅在生产模式下使用传输会出现什么问题。
有任何想法吗?


回帖(1)

时忠晨

2022-12-19 14:05:16
我们收到一位 DMA 专家的回复,其中解释说如果 A7 内核不使用这两个 DMA,则可以不重置设备。
下面是他的部分回复:
“当 M4 使用 dma2 并且重置属性位于设备树中时,我们应该避免重置 dmamux。

请注意,稍后在探测中,CxCR 寄存器会根据 dma_requests 被清除:
        /* 重置 dmamux */
        for (i = 0; i < stm32_dmamux->dma_requests; i++)
stm32_dmamux_write(stm32_dmamux->iomem, STM32_DMAMUX_CCR(i), 0);

dma requests 是 dma-masters 节点中 dma-requests 属性的总和,因此 dma1 和 dma2。如果为 M4 使用禁用 dma2,则不会清除 x = [8:15] 的 CxCR。”
提案补丁附在本邮件中。
如果在 dma-masters 中仅指定一个或少于一个 dma,此补丁将禁用重置:


  • - } else {

  • + } else if (count > 1) { /* Don't reset if there is only one dma-master */

举报

更多回帖

发帖
×
20
完善资料,
赚取积分