8237有4个独立的DMA通道,有许多内部寄存器。前面表8-1已经给出了这些寄存器的名称、长度和数量,下面来详细介绍各个寄存器的功能和作用。
1.基地址寄存器
用以存放16位地址,只可写入而不能读出。在编程时,它与当前地址寄存器被同时写入某一起始地址,可用作内存区域的首地址或末地址。在8237进行DMA数据传送的工作过程中,其内容不发生变化,只是在自动预置时,其内容可被重新写到当前地址寄存器中去。
2.基字节数寄存器
用以存放相应通道需要传送数据的字节数,只可写入而不能读出。在编程时它与当前字节数寄存器被同时写入要传送数据的字节数。在8237进行DMA数据传送的工作过程中,其内容保持不变,只是在自动预置时,其内容可以被重新写到当前字节数寄存器中去。
3.当前地址寄存器
存放DMA传送期间的地址值。每次传送后自动加1或减1。CPU可以对其进行读/写操作。在选择自动预置时,每当字节计数值减为0或外部有效后,就会自动将基地址寄存器的内容写入当前地址寄存器中,恢复其初始值。
4.当前字节数寄存器
存放当前的字节数。每传送一个字节,该寄存器的内容减1。当计数值减为0或接收到来自外部的信号时,会自动将基字节数寄存器的内容写入该寄存器,恢复其初始计数值,即为自动预置。
5.地址暂存寄存器和字节数暂存寄存器
这两个16位的寄存器和CPU不直接发生关系,不必对其进行读/写操作,因而对如何使用8237没有影响。
6.方式寄存器
每个通道有一个8位的方式寄存器,但是它们占用同一个端口地址,用来存放方式字,依靠方式控制字本身的特征位来区分写入不同的通道,用来规定通道的工作方式。8237方式寄存器各位的定义如图8-7所示。
图8-7 8237方式寄存器各位的定义
自动预置就是当某一通道按要求将数据传送完后,又能自动预置初始地址和传送的字节数,而后重复前面已进行过的过程。 校验传送就是实际上并不进行传送,只产生地址并响应信号,不产生读/写控制信号,用以校验8237的功能是否正常。
7.命令寄存器
8237的命令寄存器存放编程的命令字,命令字各位的功能如图8-8所示。
D0位用以规定是否允许采用存储器到存储器的传送方式。若允许这样做,则利用通道0和通道1来实现。
D1位用以规定通道0的地址是否保持不变。如前所述,在存储器到存储器传送中,源地址由通道0提供,读出数据到暂存寄存器,而后,由通道l送出目的地址,将数据写入目的区域;若命令字中D1=0,则在整个数据块传送中(块长由通道1决定)保持内存源区域地址不变,因此,就会把同一个数据写入到整个目的存储器区域中。
D2位是允许或禁止8237芯片工作的控制位。
D3位用于选择总线周期中写信号的定时。例如,PC中对动态存储器的写操作是由写信号的上升沿启动的。若在DMA周期中写信号来得太早,可能造成错误,所以PC选择D3=0。
D5位用于选择是否扩展写信号。在D3=0(正常时序)时,如果外设速度较慢,有些外设是用8237A送出的和信号的下降沿来产生的READY信号的。为提高传送速度,能够使READY信号早些到来,需将和信号加宽,以使它们提前到来。因此,可以通过令D5=1使和信号扩展2个时钟周期提前到来。
命令字的其他位容易理解,不再说明。
(www.xing528.com)
图8-8 8237的命令寄存器命令字各位的功能
8.请求寄存器
用于在软件控制下产生一个DMA请求,就如同外部DREQ请求一样。图8-9所示为请求字的格式,D0D1的不同编码用来表示向不同通道发出DMA请求。在软件编程时,这些请求是不可屏蔽的,利用命令字即可实现使8237按照命令字的D0D1所指的通道,完成D2所规定的操作,这种软件请求只用于通道工作在数据块传送方式之下。
9.屏蔽寄存器
8237的屏蔽字有两种形式:
(1)单个通道屏蔽字
这种屏蔽字的格式如图8-10所示。利用这个屏蔽字,每次只能选择一个通道。其中,D0D1的编码指示所选的通道,D2=l表示禁止该通道接收DREQ请求,当D2=0时允许DREQ请求。
图8-9 8237请求寄存器
图8-10 8237的单通道屏蔽寄存器
(2)4通道屏蔽字
可以利用这个屏蔽字同时对8237的4个通道的屏蔽字进行操作,故又称为主屏蔽字。该屏蔽字的格式如图8-11所示。它与单通道屏蔽字占用不同的I/O接口地址,以此加以区分。
图8-11 82374通道屏蔽寄存器
10.状态寄存器
状态寄存器存放各通道的状态,CPU读出其内容后,可得知8237的工作状况。主要有:哪个通道计数已达到计数终点——对应位为l;哪个通道的DMA请求尚未处理——对应位为l。8237的状态寄存器的格式如图8-12所示。
图8-12 8237的状态寄存器的格式
11.暂存寄存器
用于存储器到存储器传送过程中对数据的暂时存放。
12.高/低触发器
高/低触发器是一个特殊的触发器,又称为字节指针触发器,用于对前述各16位寄存器的高字节和低字节的寻址。由于8237的数据线仅8位,所以对16位寄存器的读/写要分高低字节连续操作两次。由于前述各16位寄存器的读或写必须分两次进行,先低字节后高字节。为此,要利用高/低触发器。当高/低触发器状态为0时,进行低字节操作,一旦低字节读/写操作完成后,高/低触发器会自动翻转一次变成1状态,下次再进行读/写就针对高字节进行操作,而且高/低触发器又翻转成0状态,如此自动重复。利用这种机制,就可以进行双字节读/写操作,这样16位寄存器仅占用一个外设端口地址,高、低字节共用。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。