1

我在 Atmel SAMD21G18A(在 Arduino MKR1000 中)中使用多个 DMA 通道,我看到一些明显不正确的行为。

DMA 通道 2 和 3 为 SERCOM SPI 通道提供服务,使用带有完成中断的单块传输。DMA 通道 0 连续向 DAC 写入一系列值,由 TCC 通道触发。它对块使用单个描述符,该描述符链接到自身,以便以 TCC 确定的速率连续运行(每拍 10us,但改变这一点并不能防止问题发生)。

我看到的问题是,在运行一段时间后,通常在 5 秒到几分钟之间,通道 0 停止 - 表示没有错误,只是 TCMPL(传输完成)。如果我启用 TCMPL 中断,则在通道停止时发出中断 - 但不是在此之前,而它正在愉快地重复。在 DMAC ISR 中摆动 GPIO 表明故障总是发生在通道 2 或 3 完成块传输之后。

当我检查描述符写回数组时,我发现通道 0 的通道数据已写入通道 2 或通道 3 的确切通道数据——这表示传输完成,导致通道 0 停用。周围的内存都没有受到影响,如果我分配不同的 DMA 通道,也会出现同样的问题。

我知道Silicon Errata中的第 1.7.2 项,但我通过确保启用的新通道(即通道 2 或 3)的通道号大于其他通道号(通道 0)来应用指定的解决方法)。

我假设我做错了其他事情-我怀疑自链接与它有关-但是当我正在制作一个最小的示例来分享时,我想知道是否有人遇到过类似的问题?

4

0 回答 0