我面临着我想要分享的 DMA 的奇怪情况、询问您是否能找到比我所植入的解决方案更好的解决方案。
复位时、DMA 通道(16)和 DMA 请求(32)线路之间的关联为一对一、
由寄存器 DREQASI 制成。 所以:
通道 请求
0 0 0
1 1.
2 2.
3 3.
4 4.
5 5.
(笑声) (笑声)
15.
现在、如果您要使用线路 MIB3线路2和3、您会看到它们链接到 DMA 请求线路4和5 (SPNS177D 的表6-32)。
要使用这些请求、必须将它们映射到 DMA 通道。 例如、我选择了 DMA_CH2和 DMA_CH3、
然后我调用
dmaReqAssign (DMA_CH2、4)
dmaReqAssign (DMA_CH3、5)
现在是关联表
通道 请求
0 0 0
1 1.
2 4.
3 5.
4 4.
5 5.
(笑声) (笑声)
15.
现在问题开始出现:请参阅例如 REQ4、它触发 DMA_CH2 (这是我想要的)和 DMA_CH4 (不需要的/副作用)。
如果 DMA_CH4未使用、则不会执行任何操作。 即使使用了 dmaReqAssign (DMA_CH4、REQx)和、也可能会调用 dmaReqAssign
双重关联将消失。
但现在假设(正如我所做的那样)、你在 DMA_CH3的链中使用 DMA_CH4、所以没有一个与 DMA_CH4相关联的物理请求、它由 DMA_CH3触发。 没有关联的物理请求我没有调用 dmaReqAssign (DMA_CH4、REQx)、因为没有 REQx。
这样、表保持双关联、并且 DMA_CH4被两次触发:由 REQ4 (不需要)和 DMA_CH3的链触发。
我看不到任何明确的方法来应对这种情况:
- 可以初始化所有表、在 所有 DMA 通道上将 dmaReqAssign 调用给一个未使用的请求(并不是很巧妙、炸弹是隐藏的)
- 调用 dmaReqAssign (DMA_CH4、REQx)仅在链接通道上(即使它无用)、使用未 使用的 REQx (不太巧妙、炸弹是隐藏的)
我是否有清晰的方法看不到? 有什么建议吗?
如果 DMA_CH 未绑定到 REQ 线、我更愿意在切断链路的 DMA_CH 上设置一个值、表示"未链接到 REQ"(就像使用 DMA 链时发生的那样)。
按照这样的方式、寄存器 DREQASI 的原理似乎与我预期的相反:对于与 req 相关的通道、我预期会说对于要触发的通道、req 是要触发的通道(在"触发的流"之后)。
谢谢、
Valerio