DMA的概述
SC2440支持位于系统总线与外围总线之间的四通道DMA控制。每一通道的DMA都可以处理一下四种情况:
1. 源和目的器件均可以在系统总线
2. 源器件在系统总线而目的器件在外围总线
3. 源器件在外围总线而目的器件在系统总线
4. 源和目的器件均可以在外围总线
DMA最大的有点就是可以在没有CPU干涉的情况下进行数据的传送。可以通过软件控制DMA启动,或者通过内部请求或者外部请求引脚启动。
DMA请求源
当DCON寄存器选择DMA请求方式为H/W时,每一通道的DMA控制器能在四个DMA请求源之中选择一种DMA。(注意:如果DCON寄存器选择的是S/W请求方式,DMA请求源是没有意义的)
每通道的DMA请求源
|
Source0 |
Source1 |
Source2 |
Source3 |
Source4 |
Source5 |
Source6 |
Ch-0 |
nXDREQ0 |
UART0 |
SDI |
Timer |
USB device EP1 |
I2SSDO |
PCMIN |
Ch-1 |
nXDREQ1 |
UART1 |
I2SSDI |
SPI0 |
USB device EP2 |
PCMOUT |
SDI |
Ch-2 |
I2SSDO |
I2SSDI |
SDI |
Timer |
USB device EP3 |
PCMIN |
MICIN |
Ch-3 |
UART2 |
SDI |
SPI1 |
Timer |
USB device EP4 |
MICIN |
PCMOUT |
DMA控制
DMA使用三态的有限状态机FSM (Finite State Machine),有限状态机制)对其进行控制,以下用三步进行描述:
l 状态1:
在初始状态,DMA等待DMA请求。当DMA请求到达时,进入状态2。在这 阶段DMA ACK和INT REQ均为0。
l 状态2:
在这个阶段,DMA ACK变成1以及计数器CURR_TC从DCON[19:0]寄存器加载数据。(注意:DMA ACK保持1直到对其清零)
l 状态3:
在这个阶段,DMA对进行原子操作(atomic operation)的子有限状态机(sub-FSM)进行初始化。sub-FSM从源地址读取数据以后并写进目的地址。在这个操作前,数据的大小和传输的大小均应给予考虑。在整体模式(Whole service mode)下的计数器(CURR_TC)为0之前,数据传输的操作将会继续。当sub-FSM完成原子操作后,主FSM进行倒计。另外,在计数器CRRR_TC为0以及中断设置DCON[29]寄存器被置1时,主FSM发出INT REQ信号。除此之外,同时清除DMA ACK。假如以下一种情况发生:
1. 在整体服务模式下计数器CURR_TC为0
2. 在单一服务模式下原子操作的完成
(注意:在单一服务模式下,主FSM的三个状态在完成停止后,等待下一个DMA REQ。当有新的DMA REQ到来,就会重复三个状态)
有限状态机 在数字电路系统中,有限状态机是一种十分重要的时序逻辑电路模块,它对数字系统的设计具有十分重要的作用。 有限状态机是指输出取决于过去输入部分和当前输入部分的时序逻辑电路。一般来说,除了输入部分和输出部分外,有限状态机还含有一组具有“记忆”功能的寄存器,这些寄存器的功能是记忆有限状态机的内部状态,它们常被称为状态寄存器。在有限状态机中,状态寄存器的的下一个状态不仅与输入信号有关,而且还与该寄存器的当前状态有关,因此有限状态机又可以认为是组合逻辑和寄存器逻辑的一种组合。其中,寄存器逻辑的功能是存储有限状态机的内部状态;而组合逻辑有可以分为次态逻辑和输出逻辑两部分,次态逻辑的功能是确定有限状态机的下一个状态,输出逻辑的功能是确定有限状态机的输出。 在实际的应用中,根据有限状态机是否使用输入信号,设计人员经常将其分为Moore型有限状态机和Mealy型有限状态机两种类型。1 Moore型有限状态机 其输出信号仅与当前状态有关,即可以把Moore型有限状态的输出看成是当前状态的函数。2 Mealy型有限状态机 其输出信号不仅与当前状态有关,而且还与所有的输入信号有关,即可以把Mealy型有限状态机的输出看成是当前状态和所有输入信号的函数。 参考:http://baike.baidu.com/view/115336.html?wtp=tt
Atomic operation An atomic operation in computer science refers to a set of operations that can be combined so that they appear to the rest of the system to be a single operation with only two possible outcomes: success or failure. 1. Until the entire set of operations completes, no other process can know about the changes being made (invisibility); and 2. If any of the operations fail then the entire set of operations fails, and the state of the system is restored to the state it was in before any of the operations began. Even without the complications of multiple processing units, this can be non-trivial to implement. As long as there is the possibility of a change in the flow of control, without atomicity there is the possibility that the system can enter an invalid state (invalid as defined by the program, a so-called invariant).
原子操作 原子操作是计算机科学所指的可以结合起来的一组操作,使这些操作看起来像是系统的一个单独操作,然而操作的结果只有两个:成功或者失败。 为了能实现原子操作,必须满足两个条件: 1. 在整组操作没有完成之前,不能有其他进程能了解操作在发生的变化 2. 如果有任何一组操作失败,则一整组操作就失败,以及当前状态要被恢复到操作之前的状态。
|
外部DMA DREQ/DACK 协议
外部DMA有三种请求/应答协议:
1. 单一服务查询(Single service Demand,)
2. 单一服务握手(Single service Handshake)
3. 整体服务握手(Whole service Handshake)
每类定义的DMA请求和应答信号都与这些协议有关。
查询/请求(Demand/Handshake)模式的比较
查询/请求模式的区别在于XnXDREQ and XnXDACK
查询模式(Demand Mode)
— 如果 XnXDREQ 保持低电平,下一个传输立即开始。否则等待 XnXDREQ 为低电平。
握手模式(Handshake Mode)
—如果 XnXDREQ 为高电平,DMA XnXDACK 的高电平维持2个周期。否则进入等待直到XnXDREQ 位高电平。
DMA专用寄存器
每通道DMA都有9个控制寄存器(总共有36个对四通道DMA控制的寄存器),其中6个是控制DMA传输的控制寄存器,另外3个是对DMA状态监视的控制器。
6个DMA控制传输的寄存器,可以进行读/写
l DISRCn:DMA INITIAL SOURCE (DISRC) REGISTER
l DISRCCn:DMA INITIAL SOURCE CONTROL (DISRCC) REGISTER
l DIDSTn:DMA INITIAL DESTINATION (DIDST) REGISTER
l DIDSTCn:DMA INITIAL DESTINATION CONTROL (DIDSTC) REGISTER
l DCONn:DMA CONTROL (DCON) REGISTER
l DMASKTRIGn:DMA MASK TRIGGER (DMASKTRIG) REGISTER
3个状态监视的寄存器,只能进行读
l DSTATn:DMA STATUS (DSTAT) REGISTER
l DCSRCn:DMA CURRENT SOURCE (DCSRC) REGISTER
l DCDSTn:CURRENT DESTINATION (DCDST) REGISTER
以下为DMA特殊寄存器的详细描述
l DMA INITIAL SOURCE (DISRC) REGISTER
寄存器 |
地址 |
R/W |
描述 |
初始值 |
DISRC0 |
0x4B000000 |
R/W |
DMA 0 初始化源地址寄存器 |
0x00000000 |
DISRC1 |
0x4B000040 |
R/W |
DMA 1 初始化源地址寄存器 |
0x00000000 |
DISRC2 |
0x4B000080 |
R/W |
DMA 2 初始化源地址寄存器 |
0x00000000 |
DISRC3 |
0x4B0000C0 |
R/W |
DMA 3 初始化源地址寄存器 |
0x00000000 |
DISRCn |
Bit |
描述 |
初始值 |
S_ADDR |
[30:0] |
传输数据源的基地址(起始地址),只有当CURR_SRC为0并且DMA ACK为1时,这些位的值会被载入到CURR_SRC。 |
0x00000000 |
l DMA INITIAL SOURCE CONTROL (DISRCC) REGISTER
寄存器 |
地址 |
R/W |
描述 |
初始值 |
DISRCC0 |
0x4B000004 |
R/W |
DMA 0 初始化源地址控制寄存器 |
0x00000000 |
DISRCC1 |
0x4B000044 |
R/W |
DMA 1 初始化源地址控制寄存器 |
0x00000000 |
DISRCC2 |
0x4B000084 |
R/W |
DMA 2 初始化源地址控制寄存器 |
0x00000000 |
DISRCC3 |
0x4B0000C4 |
R/W |
DMA 3 初始化源地址控制寄存器 |
0x00000000 |
DISRCCn |
Bit |
描述 |
初始值 |
LOC |
[1] |
Bit 1 是用于选择数据源的所在位置 0:数据源在系统总线(AHB) 1:数据源在外围总线(APB) |
0 |
INC |
[0] |
Bit 0 是用于选择地址的增长数目 0 = 增加(Increment) 1 = 固定(Fixed) 如果为0,地址根据每次页或者单一数据传输模式的大小增长 如果为1,地址在传送后不变。(在页传输模式,地址在页传输时改变,但是地址的值在传输后被覆盖) |
0 |
l DMA INITIAL DESTINATION (DIDST) REGISTER
寄存器 |
地址 |
R/W |
描述 |
初始值 |
DIDST0 |
0x4B000008 |
R/W |
DMA 0 初始化目的地址寄存器 |
0x00000000 |
DIDST1 |
0x4B000048 |
R/W |
DMA 1 初始化目的地址寄存器 |
0x00000000 |
DIDST2 |
0x4B000088 |
R/W |
DMA 2 初始化目的地址寄存器 |
0x00000000 |
DIDST3 |
0x4B0000C8 |
R/W |
DMA 3 初始化目的地址寄存器 |
0x00000000 |
DIDSTn |
Bit |
描述 |
初始值 |
D_ADDR |
[30:0] |
传输数据目的的基地址(起始地址),只有当CURR_SRC为0并且DMA ACK为1时,这些位的值会被载入到CURR_SRC。 |
0x00000000 |
l DMA INITIAL DESTINATION CONTROL (DIDSTC) REGISTER
寄存器 |
地址 |
R/W |
描述 |
初始值 |
DIDSTC0 |
0x4B00000C |
R/W |
DMA 0 初始化目的地址控制寄存器 |
0x00000000 |
DIDSTC1 |
0x4B00004C |
R/W |
DMA 1 初始化目的地址控制寄存器 |
0x00000000 |
DIDSTC2 |
0x4B00008C |
R/W |
DMA 2 初始化目的地址控制寄存器 |
0x00000000 |
DIDSTC3 |
0x4B0000CC |
R/W |
DMA 3 初始化目的地址控制寄存器 |
0x00000000 |
DIDSTCn |
Bit |
描述 |
初始值 |
CHK_INT |
[2] |
自动加载设置后选择中断发生 0:当TC为0时,发生中断 1:自动加载完成后,发生中断 |
0 |
LOC |
[1] |
Bit 1 是用于选择数据源的所在位置 0:数据源在系统总线(AHB) 1:数据源在外围总线(APB) |
0 |
INC |
[0] |
Bit 0 是用于选择地址的增长数目 0 = 增加(Increment) 1 = 固定(Fixed) 如果为0,地址根据每次页或者单一数据传输模式的大小增长 如果为1,地址在传送后不变。(在页传输模式,地址在页传输时改变,但是地址的值在传输后被覆盖) |
0 |
l DMA CONTROL (DCON) REGISTER
寄存器 |
地址 |
R/W |
描述 |
初始值 |
DCON0 |
0x4B000010 |
R/W |
DMA 0 控制寄存器 |
0x00000000 |
DCON1 |
0x4B000050 |
R/W |
DMA 1 控制寄存器 |
0x00000000 |
DCON2 |
0x4B000090 |
R/W |
DMA 2 控制寄存器 |
0x00000000 |
DCON3 |
0x4B0000D0 |
R/W |
DMA 3 控制寄存器 |
0x00000000 |
DCONn |
Bit |
描述 |
初始值 |
DMD_HS |
[31] |
选择查询模式(Demand mode)或者握手模式(Demand mode) 0:选择查询模式 1:选择握手模式 |
0 |
SYNC |
[30] |
选择 DREQ/DACK 的同步时钟 0:DREQ/DACK 与 PCLK 同步(APB clock) 1:DREQ/DACK 与 HCLK 同步(AHB clock) |
0 |
INT |
[29] |
允许/禁止 CURR_TC 的中断设置 0:禁止 CURR_TC 中断。用户需要在状态寄存器监视传输数目 1:当所有传输完成时发生中断请求(CURR_TC为0) |
0 |
TSZ |
[28] |
选择传输的大小为原子传输(每次传输完成后DMA将占用的总线释放) 0:一个单元的传输完成 1:长度为4的一页传输完成 |
0 |
SERVMODE |
[27] |
选择单一服务模式或整体服务模式 0:在每次原子DMA传输停止,等待下一个DMA请求,单一服务模式被选中 1:由一次请求开始重复的原子传输知道传输计数器为0,整体服务被选中。 |
0 |
HWSRCSEL |
[26:24] |
为每个DMA选择请求源 DCON0: 000:nXDREQ0 001:UART0 010:SDI 011:Timer 100:USB device EP1 DCON1: 000:nXDREQ1 001:UART1 010:I2SSDI 011:SPI 100:USB device EP2 DCON2: 000:I2SSDO 001:I2SSDI 010:SDI 011:Timer 100:USB device EP3 DCON3: 000:UART2 001:SDI 010:SPI 011:Timer 100:USB device EP4 DCON0: 101:I2SSDO 110:PCMIN DCON1: 101:PCMOUT 110:SDI DCON2: 101:PCMIN 110:MICIN DCON3: 101:MICIN 110:PCMOUT |
00 |
SWHW_SEL |
[23] |
选择软件请求模式(S/W request mode)或硬件请求模式(H/W request mode) 0:软件请求模式,DMA触发通过设置DMASKTRIG 寄存器的 SW_TRIG 位 1:通过设置[26:24]位设置DMA的触发源 |
0 |
RELOAD |
[22] |
重载 开/关 设置选项 0:当前传输计数器值为0时完成自动重载 1:当前传输计数器值为0时DMA通道关闭。 通道 开/关 位((DMASKTRIGn[1]))被置1,从而保护非有意的新一轮DMA控制开始。 |
0 |
DSZ |
[21:20] |
数据传输的大小 00 = 字节(Byte) 01 = 半字(Half word) 10 = 字(Word) 11 = 保留(reserved) |
00 |
TC |
[19:0] |
初始化传输计数器 |
00000 |
l DMA MASK TRIGGER (DMASKTRIG) REGISTER
寄存器 |
地址 |
R/W |
描述 |
初始值 |
DMASKTRIG0 |
0x4B000020 |
R/W |
DMA 0 屏蔽触发寄存器 |
000 |
DMASKTRIG1 |
0x4B000060 |
R/W |
DMA 1 屏蔽触发寄存器 |
000 |
DMASKTRIG2 |
0x4B0000A0 |
R/W |
DMA 2 屏蔽触发寄存器 |
000 |
DMASKTRIG3 |
0x4B0000E0 |
R/W |
DMA 3 屏蔽触发寄存器 |
000 |
DMASKTRIGn |
Bit |
描述 |
初始值 |
STOP |
[2] |
停止DMA控制 1:当前原子传输结束后马上停止DMA。如果当前没有运行原子传输,DMA也会马上停止。CURR_TC, CURR_SRC, 和CURR_DST 将会被置0。 |
0 |
ON_OFF |
[1] |
DMA通道 开/关 位 0:DMA通道开启 1:DMA通道开启以及处理DMA请求。 |
0 |
SW_TRIG |
[0] |
DMA通道在软件请求模式下(S/W request mode)触发 1:请求DMA控制这控制器 |
0 |
l DMA STATUS (DSTAT) REGISTER
寄存器 |
地址 |
R/W |
描述 |
初始值 |
DSTAT0 |
0x4B000014 |
R |
DMA 0 计数寄存器 |
000000h |
DSTAT1 |
0x4B000054 |
R |
DMA 1 计数寄存器 |
000000h |
DSTAT2 |
0x4B000094 |
R |
DMA 2 计数寄存器 |
000000h |
DSTAT3 |
0x4B0000D4 |
R |
DMA 3 计数寄存器 |
000000h |
DSTATn |
Bit |
描述 |
初始值 |
STAT |
[2] |
DMA控制器的状态 00:表示DMA控制器真准备好下一次DMA请求 01:表示DMA控制器忙于传输数据 |
00b |
CURR_TC |
[19:0] |
当前传输计数的值 注意:传输计数值在最开始被设置好,之后在每次原子传输完成之后递减 |
00000h |
l DMA CURRENT SOURCE (DCSRC) REGISTER
寄存器 |
地址 |
R/W |
描述 |
初始值 |
DCSRC0 |
0x4B000018 |
R |
DMA 0 当前源寄存器 |
0x00000000 |
DCSRC1 |
0x4B000058 |
R |
DMA 1 当前源寄存器 |
0x00000000 |
DCSRC2 |
0x4B000098 |
R |
DMA 2 当前源寄存器 |
0x00000000 |
DCSRC3 |
0x4B0000D8 |
R |
DMA 3 当前源寄存器 |
0x00000000 |
DCSRCn |
Bit |
描述 |
初始值 |
CURR_SRC |
[30:0] |
当前 DMAn 的源地址 |
0x00000000 |
l CURRENT DESTINATION (DCDST) REGISTER
寄存器 |
地址 |
R/W |
描述 |
初始值 |
DCDST0 |
0x4B00001C |
R |
DMA 0 当前目的寄存器 |
0x00000000 |
DCDST1 |
0x4B00005C |
R |
DMA 1 当前目的寄存器 |
0x00000000 |
DCDST2 |
0x4B00009C |
R |
DMA 2 当前目的寄存器 |
0x00000000 |
DCDST3 |
0x4B0000DC |
R |
DMA 3 当前目的寄存器 |
0x00000000 |
DCDSTn |
Bit |
描述 |
初始值 |
CURR_SRC |
[30:0] |
当前 DMAn 的目的地址 |
0x00000000 |
作者:jammy_lee
链接:http://blog.163.com/jammy_lee/blog/static/10119547820091454933811/