4.6.2. 功能描述
4.6.2.1. 设备
下列表格为模块推荐配置,单次DMA任务传输数据量为位宽*BURST。
存储模块 |
DMA_ID |
位宽(bit) |
Burst |
地址 |
---|---|---|---|---|
SRAM/DRAM/XIP |
0 |
32 |
16 |
Linear |
存储模块与DMA采用总线握手方式,无需单独的REQ/ACK机制,DMA模式选择等待,即只能被动发送或接收数据,若源终端皆为存储模块则实时响应传输。
读取XIP数据时,起始地址和长度需要64Byte对齐
设备模块 |
DMA_ID |
位宽(bit) |
Burst |
地址 |
---|---|---|---|---|
DMA_ID_PSADC_Q1 |
4 |
32 |
1 |
IO |
DMA_ID_PSADC_Q2 |
5 |
32 |
1 |
IO |
DMA_ID_SPI2 |
8 |
8 |
16 |
IO |
DMA_ID_SPI3 |
9 |
8 |
16 |
IO |
DMA_ID_SPI0 |
10 |
8 |
16 |
IO |
DMA_ID_SPI1 |
11 |
8 |
16 |
IO |
DMA_ID_I2S0 |
12 |
32 |
1 |
IO |
DMA_ID_I2S1 |
13 |
32 |
1 |
IO |
DMA_ID_AUDIO_DMIC |
14 |
32 |
1 |
IO |
DMA_ID_UART0 |
16 |
8 |
1 |
IO |
DMA_ID_UART1 |
17 |
8 |
1 |
IO |
DMA_ID_UART2 |
18 |
8 |
1 |
IO |
DMA_ID_UART3 |
19 |
8 |
1 |
IO |
DMA_ID_UART4 |
20 |
8 |
1 |
IO |
DMA_ID_UART5 |
21 |
8 |
1 |
IO |
DMA_ID_UART6 |
22 |
8 |
1 |
IO |
DMA_ID_UART7 |
23 |
8 |
1 |
IO |
DMA_ID_XSPI |
24 |
8 |
16 |
IO |
DMA_ID_SDFM0 |
25 |
32 |
1 |
IO |
DMA_ID_SDFM1 |
26 |
32 |
1 |
IO |
DMA_ID_SDFM2 |
27 |
32 |
1 |
IO |
DMA_ID_SDFM3 |
28 |
32 |
1 |
IO |
非存储模块与DMA采用单独的REQ/ACK机制握手方式,DMA模式选择握手,即需主动发起接收或发送请求。
4.6.2.2. 任务链表
多个任务组成任务链表,每个任务单元为32位,从低地址往高地址存放,具体定义如下:
TASK_CFG:当前任务配置,包括源端终端的BURST和WIDTH等(外设模块的WIDTH需要与自身FIFO寄存器位宽对齐)
SRC_ADDR:当前任务源端起始地址,注意需要8byte对齐
SNK_ADDR:当前任务终端起始地址,注意需要8Byte对齐
TASK_LENGTH:当前任务传输字节数,最大可设置为32M-1字节(总传输长度需要与WIDTH对齐)
TASK_PAR:当前任务参数,设置两个任务之间传输的延迟
NEXT_TASK:下一任务地址,该单元配置为“0xFFFFF800”表示DMA传输结束
DMA在工作时会读出任务相关参数更新到对应寄存器中(软件可见)
若需提高DMA带宽,建议配置起始地址和长度进行64Byte对齐
4.6.2.3. 握手
DMA控制器和存储设备数据传输采用总线握手机制,无单独REQ/ACK机制,DMA和外设(非存储设备)除了总线传输外,需要增加REQ/ACK机制;这是考虑外设非实时响应,防止长时间占用总线,由外设准备好了来发起REQ,开始读写传输。
DMA传输以单次传输数据量为单位周期进行,单次传输数据量=BURST*WIDTH。BURST数代表了单次传输的数据笔数,比如当BURST为16、WIDTH为32bit时,单次传输数据量为16*32bit。APB总线上设备,需要将BURST设置为1;AHB总线上设备,需要综合考虑DEVICE FIFO深度和DEVICE时延需求设置,AHB总线设备均支持最大BURST为16。下面分存储模块互连、外设发送和外设接收三种应用进行说明。
- 存储模块互连
存储模块互相发送和接收时为实时响应操作,只需要配置数据地址和长度(注意对齐),SRAM和DRAM最大BURST为16,位宽为32bit,即单次传输数据量为16*32bit。
- DRAM传输到设备
DMA控制器配合外设进行多个传输周期,持续到整个传输结束。 采用DMA从DRAM传数据到DEVICE进行发送。单个传输周期如下:
1:DEVICE检测自身FIFO水位,当FIFO空缺满足单次传输数量时,由DEVICE发起REQ请求,开始该次数据传输;
2:DMA通过SRC端口从DRAM读取数据到DMAFIFO,单次数据量最大为16*32bit。
3:DMA将FIFO的数据通过SNK端口写入到外设入口地址,单次数据长度提前在DMA的任务参数中配置;
4:DMA完成对SNK端的写操作后,对外设输出ACK应答;
5:外设检测到ACK应答后,停止REQ请求,到此完成一个传输周期。
- 设备传输到DRAM
采用DMA将DEVICE接收到的数据放到DRAM。单个传输周期如下:
1:DEVICE检测自身FIFO水位,当FIFO存数满足单次传输数量,由DEVICE发起REQ请求,开始该次数据传输;
2:DMA通过SRC端口从外设出口地址读取数据到FIFO中,单次数据长度提前在DMA的任务参数中配置;
3:当DMAFIFO数据量达到16*32bit或者DEVICE已经传完所有数据时,DMA将FIFO的数据通过SNK端口写入到DRAM。
4:DMA完成后,对外设输出ACK应答;
5:外设检测到ACK应答后,停止REQ请求,到此完成一个传输周期。
4.6.2.4. FIFO
外设FIFO大小推荐 FIFO_DEPTH ≥(BRT×DW÷8)+(L÷S) BYTE
BRT为突发BRUST长度,DW为外设使用的DMA数据宽度,L为系统时延,S为外设吞吐速度;实际应用则把REQ触发条件设置为(BRT×DW÷8)BYTE,满足BURST传输的条件;(L÷S)用于解决系统时延影响,保证外设可以正常吞吐。
AHB总线上的外设,建议BRT选择16,APB总线上的模块,建议BRT选择1。
存储器设置地址递增,外设设置地址保持
源端位宽:从总位宽取有效数据值
终端位宽:从有效数据值,补全总位宽。
SPI:AHB 设备,可以与DRAM 或SRAM 传输数据
UART:APB 设备,可以与DRAM 或SRAM 传输数据
外设DMA WIDTH 设置需与外设模块寄存器位宽对齐。
外设DMA LENGTH 设置需要与WIDTH 对齐