ADSP-21535 Blackfin的Mem DMA高速通信
2 DMA寄存器的配置
为了描述Mem DMA序列,DMA控制器使用一套名为描述子块(Descriptor)的参数。当需要后继的DMA序列时,这些描述子块被链接起来。这样,一个DMA序列完成时能够自动初始化下一个序列,并将其启动。如果不需启动下一个序列,只要将其指向一个内容为0的地址空间即可。如果下一次链接指向原描述子块,则DMA完成后暂停。为访问整个ADSP-21535的地址空间,源地址和目的地址描述子块采用了全32位地址的基指针。两个描述子块均为5个字的连续空间,需要注意的是该连续空间必须定义在L2范围内。描述子块内包含的内容如图2所示。
Mem DMA规定,描述子块所在的首地址必须传入相关的寄存器。描述子块首地址的高16位装入DMA_DBP寄存器(DMA Descriptor Base Pointer Register,DMA描述子块基地址寄存器)内。由于该寄存器严格限定必须在0xF000~0xF003,这就限定了源和目的地址描述子块只能定义在L2存储器内,并且高16位地址相同。
描述子块首地址的低16位放在两个寄存器中,源地址描述子块低16位装入MDS_DND寄存器(Source Memory DMA Next Descriptor Pointer Register,DMA源地址下一个描述子块寄存器),而目的地址描述子块低16位装入MDD_DND寄存器(Destination Memory DMA Next Descriptor Pointer Register,DMA目的地址下一个描述子块寄存器)。其说明如图3所示。
在描述子块的地址传入相应寄存器后,后面的四项先配置,然后设置第一项。也就是对管理DMA启动参数的寄存器进行参数配置。两个配置寄存器的详细内容如图4所示。例如当目的地址寄存器为0x8003,源地址寄存器为0x8001时,传输的数据总长=DMA传输的长度×字。需要注意的是,虽然此时传输以16位(字长)传输,但DMA的带宽是32位,剩下的带宽资源将被浪费。8位传输时,带宽资源利用率更低。
下面,以一个具体的32位DMA例子说明上面的描述子块和多个寄存器的使用方法。
图4 DMA源地址和目的地址配置寄存器
3 32位DMA的例程
R0.H = 0x8009? //DMA源配置字,设置为32位传输
R0.L = 0x800? //DMA长度
R1.L = 0x2000? //DMA源地址低16位
R1.H = 0xf000? //DMA源地址高16位,这里指向L2
R2.L = RAM_READ? //DMA源描述子块首地址
低十六位,DMA读
R2.H = 0x800b? //DMA目的配置字,设置为32位传输
R3.L =0x0000? //DMA目的地址低16位
R3.H =0xff90? //DMA目的地址高16位,这里指向
L1数据存储器-Bank B
R4.L = RAM_WRITE? //DMA目的描述子块首地址低
十六位,DMA写
P0.L = RAM_READ? //将32位的源描述子块的地址
载入P0
P0.H = RAM_READ?
P1.L = RAM_WRITE? //将32位的目的描述子块的地
址载入P1
P1.H = RAM_WRITE?
《ADSP-21535 Blackfin的Mem DMA高速通信(第2页)》