DMA是DSP内的一个硬件模块,它独立于CPU在外围设备和内存之间进行数据传输,解放了CPU。每个型号的DSP有多个个DMA,每个DMA有一定数量的Channel。每个Channel两端分别绑定到外围设备和内存。每个Channel可与哪种外围设备绑定,这是在设计时固定下来的,要查询参考手册得知。
在ADSP-SC589官方资料中给出了有关于DMA的五个例程,简单的介绍了在ADI中可以直接调用的一些DMA相关函数。
例程分别是MemCopyOneShot1D(单步一维传输)、MemCopyOneShot2D(单步二维传输)、MemCopyArrayMode(块传输)、MemCopyListMode(链表传输)、MemCopyOneToMany(一到多传输)。具体程序的操作流程如下:
1.在进行数据传输前,DSP需要先进行一系列初始化的配置,配置失败则报错
2.在配置结束后打开一个DMA内存流,对传输的通道进行配置
SC589中进行DMA传输的通道共有22条,其中有四条能作为内存传输
3.对DMA是否开启回调模式进行配置。
如果启用了回调模式,内存dma管理器将使用特定的事件id向应用程序发送回调,以报告内存复制的完成情况。
在非回调模式下,该示例连续向内存dma管理器查询内存复制状态,并使用内存dma管理器来标识数据传输的结束。存储器dma流在数据传输完成时关闭。
4.在DMA中所有传输都需要进行设置的基本参数有数据源地址、目标端地址和带传送数据的个数。
如果想要将传输模式设置为二维模式要注意对于链路只有一个公共的DMA二维设置位,当设置为二维模式后所有的链路都变成了二维模式,如果想要使用一维模式,将外循环次数定为1即可。
ADI可以直接用来调用的DMA传输函数:
其中MemCopyOneShot1D、MemCopyOneShot2D为单步模式下的一维和二维DMA传输。
单步模式下每次只能对一个单元的数据进行读或写操作。
MemCopyArrayMode为块传输模式。不同于单步传输模式,块传输模式可以更改每次传输数据的大小,也可以选择一维或二维方式下进行传输。
MemCopyListMode为链表传输模式。链式DMA的优点是能够让多个DMA自动进行传输,当配置好链式DMA的各块参数后,当第一个DMA传输技术后会自动启动第二个DMA,依次执行直到链中所有的DMA执行完毕。链式DMA省去了多次配置DMA参数的时间,也使得多个DMA的执行更加的紧凑。
MemCopyOneToMany(一到多传输)为将数据从内存或单个字符串传输到多个位置,其实是基于链表传输的一种应用。
5.检查传输是否已经完成
6.检查传输后的数据是否正确,并关闭DMA通道
转载:https://blog.csdn.net/daijingxin/article/details/102470031