2398412_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2398412_zh-CN

2398412_zh-CN

使用 IMXRT1172 LPSPI EDMA 传输 API 时,DMA IRQ 处理程序在 SPI 传输完成之前被调用。

您好,

我一直在使用 IMXRT1172 上的 SDK (2.16.100) 中的 LPSPI EDMA 传输 API 同时读取和写入 SPI 数据(即在两个大小相同的缓冲区的两个 DMA 通道上进行 TX+RX 传输)。不幸的是,EDMA 回调似乎在传输实际完成之前就被调用了。在回调中,检查 LPSPI 的 SR、FSR 和 RSR 显示,即使 DMA 认为它已完成,SPI 仍然认为它很忙。IEMBF 仍然已设置,TXCOUNT 为 1。

SR = 0x01000100(MBF、WCF)

FSR TXCOUNT = 1,RXCOUNT = 0

RSR = 0x00000002 (RXEMPTY, !SOF)

如果我只执行 TX 操作,这在某种程度上是有意义的,因为 SPI 外设可能仍然会输出从 DMA 加载的最后一个字节。因此,在这种情况下,DMA 外设实际上已经完成了将最后一个字节从 RAM 加载到 SPI 数据 TX 寄存器,但 SPI 仍然需要做一些工作才能将其发送出去。

但是,当同时执行 TX 和 RX 时,我原本预期如果 TXCOUNT 为 1,那么 RXCOUNT 也应该为 1。也就是说,在所有 TX 数据时钟输出完毕之前,DMA 不应该完成 RX,因为最后一个字节需要通过 DMA 从 SPI RX 数据寄存器传输到 RAM 中,而这只会在传输的最后一个时钟周期发生。

这真的是个问题吗?

如果是这样,是用SDK实现的吗?还是用硬件IP实现的?

我希望能够在 DMA 回调中检查 LPSPI SR,以确定是否存在任何 SPI 错误。

谢谢!

-m

Re: Using IMXRT1172 LPSPI EDMA transfer API, DMA IRQ handler called before SPI transfer is done

@nxp16

非常感谢您对我们产品的关注以及对我们社区的使用。

DMA 完成和 SPI 总线完成是两个不同的概念。

eDMA 回调表明 DMA 引擎已完成在内存和 LPSPI FIFO/寄存器路径之间移动配置的字节数。这并不一定意味着 LPSPI 总线状态机已经完成最后一帧或返回空闲状态。

对于 LPSPI 总线完成情况,请检查 SR[TCF] 或等待 SR[MBF] 清除。

mayliu1_0-1784876065178.png

mayliu1_1-1784876092476.png


希望对你有帮助

顺祝商祺!

5月

Re: Using IMXRT1172 LPSPI EDMA transfer API, DMA IRQ handler called before SPI transfer is done

是的,但在 TX/RX 传输中,我预期 DMA 完成后 TX_COUNT 和 RX_COUNT 都应为零。也就是说,RX DMA 不可能在最后一个 SPI 时钟之前完成,因为 SPI 外设要到那时才会将数据的最后一位移入 RX FIFO,而 DMA 要到最后一位移入 RX FIFO 后才能将最后一个字节复制到 RAM 中。因此,在这种情况下,TX 和 RX 都应该在 DMA 完成之前完成。如果只是 TX 传输,那么是的,DMA 可能在 SPI 完成之前完成,TX_COUNT 仍然可能为 1。

谢谢!

-m

Re: Using IMXRT1172 LPSPI EDMA transfer API, DMA IRQ handler called before SPI transfer is done

@Mike_M3

感谢您的反馈。

你的观点对于 RX 数据路径是有效的:一旦 RX EDMA 通道完成,预期的 RX 数据就已经被移动到 RAM 中。然而,这仍然与 LPSPI 总线完成不同。

TXCOUNT/RXCOUNT 是先进先出 (FIFO) 占用指示符。RXCOUNT=0 表示 RX FIFO 已被 DMA 清空,而 TXCOUNT=1 可能仍然表示发送/命令 FIFO 中有一个待处理的条目。在 LPSPI 中,发送 FIFO 也用于命令/TCR 条目,因此 TXCOUNT 不仅仅是 RX 完成的镜像。MBF=1 表示 LPSPI 总线状态机尚未完全恢复到空闲状态。

因此,我不会使用 TXCOUNT/RXCOUNT 相等作为转账完成的条件。对于 LPSPI 总线完成条件,请改用 SR[TCF]=1 或 SR[MBF]=0。如果更倾向于基于中断的指示,请启用 kLPSPI_TransferCompleteInterruptEnable,并将 EDMA 回调仅保留为 DMA 完成指示。


顺祝商祺!

5月

Tags (1)
No ratings
Version history
Last update:
a week ago
Updated by: