IC验证之DMA使用

DMA分为标准DMA和集成DMA。比如SD模块内部集成了DMA功能模块,其使用方法与标准DMA存在不同。此外DMA搬运数据过程是不借助于中断进行的!
一、标准DMA使用
1.DMA配置寄存器CONFIG中使能DMA。
2.中断控制寄存器INTTCLR中清掉所有中断。
3.通道0的源地址寄存器C0SRCADDR中设置数据源地址。
4.通道0的目的地址寄存器C0DESTADD中设置数据目的地址。
5.通道0链接列表寄存器C0LLI中设置为零(仅发送一个package的情况),如果使用多个通道,该寄存器的值设置高30位,即reg[31:2]设置第二个通道连接列表寄存器C1LLI的地址,低两位即reg[1:0]设置为0。
6.通道0的控制寄存器中设置tranfer size、burstsize、
tranfer width和source increment 和destnation increment等。
其中,tranfer size为总的传输数据量大小,其计算方法为tranfer size= N* source tranfer width;burst size 就是DMA请求一次总线完成的数据传输量;tranfer width分为source tranfer width 和destnation tranfer size,source tranfer size 就是数据源读取时的位宽,destnation tranfer size 就是向目的地址写数据时的数据宽度;increment代表在读写数据时地址是否递增,而在从memroy向peripheral搬运时,source increment置高,即地址递增,而destnation increment 置低,即地址不变,一直是数据发送寄存器的地址(如I2C、UART)。
7.通道0的配置寄存器C0CONFIG中使能通道0,并且配置source request peripheral 和 destnation request peripheral,也就是DMA控制器分配好的外设(如I2C、UART、CAN和SPI等,如果是SRAM和DDR等MEMORY,则不需要设置)读写编号。
如果仅发送一个package,以上配置就结束了,如果需要发送多个package,需要使用别的channel,即DMA的channel1-7,需要继续以下操作:
8.通道n的源地址寄存器CnSRCADDR中设置数据源地址。
9.通道n的目的地址寄存器CnDESTADD中设置数据目的地址。
10.通道n链接列表寄存器CnLLI中设置为下一个通道n+1的链接列表寄存器的地址,若该通道为最后一个通道,其值设置为0,代表是最后一个通道。就实际观察来看,该寄存器设置的正确与否,不影响通道1-7的使用。
11.通道n的控制寄存器中设置tranfer size、burstsize、
tranfer width和source increment 和destnation increment等。
12.通道n的配置寄存器CnCONFIG中使能通道n,并且配置source request peripheral 和 destnation request peripheral,也就是DMA控制器分配好的外设(如果是SRAM和DDR等MEMORY,则不需要设置)读写编号。其中,n小于等于7。
二、集成DMA使用
在集成的DMA中,以SD模块为例,每个Descriptor分为4个部分DES0\DES1\DES2\DES3来配置DMA要搬运数据的信息。4个32bit 的寄存器地址可以随意连续地在存储器(如SRAM)中分配,另外SD控制器的内部有两个与DMA使用相关的寄存器需要配置,分别是模式寄存器BMOD和描述符首地址寄存器DBADDR。BMOD寄存器主要用于DMA复位,DMA使能,burst长度配置等,需要注意的是,软复位SWR不会自动清零,在置位后,需要软件手动清零,然后使能DMA,配置burst长度等。DBADDR寄存器配置内容就是DES0寄存器地址。
Descriptor分为 dual-buffer模式和chain descriptor 模式, 描述符的结构图如下所示:
IC验证之DMA使用_第1张图片
Descriptor配置流程如下:
1.在DES0中设置end of ring、second address chained、first descriptor和last descriptor 等。end of ring 置高代表这是最后一个descriptor;send address chained 置高,代表该descriptor 指向的第二个地址不再是buffer的地址,而是第二个descriptor的地址;first 、last descriptor不再介绍。
2.DES1设置descriptor指向的两个buffer的大小(dual-buffer中使用两个buffer,而chain descriptor结构中只用到一个buffer)。
3.DES2中存放buffer1的地址指针;
4.Dual-buffer模式中,DES3中存放Buffer2的地址指针,而chain descriptor模式中,DES3存放下一个descriptor的地址指针。
三、DMA从外设(例SPI、UART和I2C等)向sram等memory中搬数据时,判断数据是否搬运完成呢,可以查看外设接收FIFO中是否为空、或者查看标准DMA的通道配置寄存器Channel Configuration Register中的bit17位是否为active,1代表当前DMA还在搬运数据,0代表DMA搬运数据完成!
以上是个人在验证中的理解,如有错误,欢迎指正!

你可能感兴趣的:(#,IC验证实例,asic)