5.4.1 DMA的工作过程 要实现DMA传送,目前都采用大规模集成电路芯片DMA控制器(DMAC)。 DMA的工作过程大致如下: ①外设向DMAC发出DMA传送请求。 ②DMAC通过连接到CPU的HOLD信号向CPU提出DMA请求。 ③CPU在完成当前总线周期后会立即对DMA请求做出响应。 ④待CPU将总线置高阻——放弃总线控制权,DMAC即开始对总线实施控制并向外设送出DMA的应答信号。 ⑤DMAC送出地址信号和控制信号,实现外设与内存或内存与内存的数据传送。 ⑥DMAC将规定的数据字节传送完之后,通过向CPU发HOLD信号,撤消对CPU的DMA请求。
5.4.2 DMA控制器8237
1. 8237的引线及功能 DMAC8237的外部引线图如图5.33所示。 A0~A3:双向地址线,具有三态输出。 A4~A7:三态输出线。 DB0~DB7:双向三态数据总线。
HRQ:保持请求信号 HLDA:保持响应信号 DREQ0~DREQ3:DMA请求(通道0~3)信号。 DACK0~DACK3:DMA响应信号,分别对应通道0~3。 CLK:时钟输入。 RESET:过程结束,低电平有效的双向信号。 2.8237的工作方式 8237工作有两种周期,即空闲周期和工作周期。 (1)空闲周期 (2)工作周期 ①单字节传送方式。 ②数据块传送。 ③请求传送。 ④级联方式。
(3) 传送类型 ① 接口到存贮器的传送。 ② 存贮器到接口。 ③ 存贮器到存贮器。 (4) 优先级 (5) 传送速率 3. 8237的内部寄存器 8237有4个独立的DMA通道,有许多内部寄存器。 表5.3给出这些寄存器的名称、长度和数量。
(1)基地址寄存器 (2)基字数寄存器 (3)当前地址寄存器 (4)当前字数寄存器 (5)地址暂存寄存器和字数暂存寄存器 (6)方式寄存器 (7)命令寄存器 (8)请求寄存器 (9)屏蔽寄存器
①单个通道屏蔽字。 ②四通道屏蔽字。 (10)状态寄存器 (11)暂存寄存器 (12)字节指针触发器
4. 8237的寻址及连接 8237的4个通道的寄存器及其他各种寄存器的寻址编码如表5.4和表5.5所示。
5. 8237的初始化 下面我们抽出PC机中BIOS对8237初始化部分加以说明: ①为了对DMAC8237初始化,首先进行总清。 ②对DMAC(8237)的4个通道的基地址寄存器与当前地址寄存器、基字数寄存器及当前字数寄存器先写入FFFFH,再读出比较,看读写操作是否正确。 ③程序对DMAC(8237)的零通道初始化。一行刷新结束,HRQ变为无效,退出DMA。 此处给出通道0初始化程序如下: OUT DMA+0DH,AL ;总清8237 ;INITIALIZEANDSTARTDMAFORMEMORYREFRESH MOV DS,BX MOV ES,BX ;初始化DS和ES MOV AL,0FFH OUT DMA+1,AL ;通道0的传送字节数,为64K字节 OUT DMA+1,AL
MOV DL,0BH ;使DX=000BH MOV AL,58H OUT DX,AL ;写方式字 MOV AL,0 OUT DMA+8,AL ;写入命令字 OUT DMA+10,AL; ;写屏蔽字
DMAC初始化程序如下: INITADM:OUT DMA+0DH,AL ;总清 MOV AL,40H OUT DMA+2,AL ;送地址低字节到通道1 MOV AL,74H OUT DMA+2,AL ;送地址高字节到通道1 MOV AL,80H OUT PAG,AL ;送页寄存器 MOV AL,64H OUT DMA+3,AL;送传送字节数低字节到通道1
MOV AL,0 OUT DMA+3,AL ;送传送字节数高字节到通道1 MOV AL,59H ;通道1方式字:读操作,单字节 ;传送 OUT DMA+11,AL ;地址递增,自动预置 MOV AL,0 ;命令字,允许工作,固定优先级 OUT DMA+8,AL ;DACK低有效 OUT DMA+15,AL ;写屏蔽寄存器,规定允许 ;4个通道均可请求 程序中,将取数的存贮单元的首地址87440H分别写到页寄存器(外加的三态输出寄存器)和DMAC通道1的高低字节寄存器中。 这里每次传送一个字节。每传送100个字节循环。开始可以不用总清命令,以免影响其他通道。这时可以换成只清字节指针触发器的命令,即: MOV AL,0 OUT DMA+12, AL