(三)DMA控制器和接口电路的初始化程序[2,4]
为了使DMA过程能正确进行,必须使用程序对DMA控制器和接口电路进行初始化,初始化包括下列设置:
1.设置DMAC的字节计数器初值,以决定数据块的长度。
2.设置DMAC的地址寄存器初值,以确定数据传输所用的存储区首地址。
3.设置DMAC的控制寄存器,指出数据传送方向、是否进行块传输,并启动DMA操作。
4.设置接口电路的控制寄存器,指出数据传输方向,并启动I/O操作。
设:(INT-interface接口,CON-control register控制寄存器,“输入”指I/O存储器,“输出”指存储器I/O)
接口状态寄存器地址INTSTAT, bit2=1---I/O设备忙
接口控制寄存器地址INTCON, bit0=1为输入,bit0=0为输出
bit2=1---启动I/O操作
DMAC控制寄存器地址DMACON
bit0=1为输入,bit0=0为输出
bit3=1,可接收DMA请求
bit6=0为字节传输模式,bit6=1为块传输模式
DMAC字节计数器地址BYTE-REG
DMAC地址寄存器地址ADD-REG
I/O的数据块传输初始化程序如下:
IDLE: IN AL , INTSTAT ;读接口状态
TEST AL , 04H; 是否忙(bit 2)
JNZ IDLE; bit2=1,忙
MOV AX, COUNT; 块传输字节数
OUT BYTE_REG, AX
MOV AL, DMAC; DMAC原控制字
OR AL, 49H; 块传输允许接收DMA请求,输入
OUT DMACOM, AL
MOV AL, INTC; 接口电路的原控制字
OR AL, 05H; 输入,启动操作
OUT INTCOM, AL
程序对接口电路和DMAC初始化后,当接口准备就绪,向DMAC请求传输,DMAC再向CPU请求总线。当DMAC获得总线控制权后,按初始化程序规定的方式执行传输。传输过程本身不需CPU干预。在DMAC传输完成后,发出结束信号EOP,CPU可以查询EOP信号,以便进行后续数据处理。或者把EOP信号作为中断请求信号,CPU在中断处理程序中进行后续数据处理。
(四)DMA控制器的工作特点[1]
1.DMAC是一个接口电路,CPU可以通过其端口地址对DMAC进行读/写操作,以便对DMAC进行初始化或查询其状态。但它与一般的接口电路有显著的不同,DMAC可以获得系统总线控制权,当其获得系统总线控制权后,能提供一系列控制信号,像CPU一样操纵外设和内存之间的数据传输。即,DMAC有两种工作状态:
从模块状态(或称被动态):作为接口电路,受CPU控制
主模块状态(或称主动态):控制系统总线
2.DMAC控制内存和外设的数据传输方式,与CPU的方式完全不同。
CPU:
①.通过执行指令传输数据。
②.被传输的数据必须通过CPU累加器(AL/AX)中转。
DMAC:
①.通过硬件逻辑电路,用固定的顺序地址信号和读/写信号进行数据传输。
②.被传输的数据不送入DMAC内部中转,从“源”读得的数据保存在数据总线上,然后立即开始写操作,将数据写入“目的”。
正是由于DMAC的上述数据传输特点,使DMA传输可以达到很高的速度,这也是DMA(Direct Memory Access直接内存访问)的含义。
四、结论
实验证明,用DMA方式进行数据传输,可以把有限的单片机资源从烦琐的数据传输中解放出来,使之在系统的其他方面发挥更大的功能。 而用INTEL 8237设计的DMA控制器和外设的连接电路简单,成本低廉,具有很高的实用价值。本文所提出的DMA模块及其接口只要稍作修改,就可以在数据采集场合应用。