1. DMA控制器(82C37A)
1.1 端口地址及寄存器说明
端口 | 通道号 | I/O端口地址 | 寄存器 | |
读(IOR) | 写(IOW) | |||
DMA+0 | 0 | 00 | 通道0的当前地址寄存器 | 通道0的基址寄存器 |
DMA+1 | 0 | 01 | 通道0的当前字节计数寄存器 | 通道0的基字节计数 |
DMA+2 | 1 | 02 | 通道1的当前地址寄存器 | 通道1的基址寄存器 |
DMA+3 | 1 | 03 | 通道1的当前字节计数寄存器 | 通道1的基字节计数 |
DMA+4 | 2 | 04 | 通道2的当前地址寄存器 | 通道2的基址寄存器 |
DMA+5 | 2 | 05 | 通道2的当前字节计数寄存器 | 通道2的基字节计数 |
DMA+6 | 3 | 06 | 通道3的当前地址寄存器 | 通道3的基址寄存器 |
DMA+7 | 3 | 07 | 通道3的当前字节计数寄存器 | 通道3的基字节计数 |
DMA+8 |
公用 | 08 | 状态寄存器 | 命令寄存器 |
DMA+9 | 09 | NA | 请求寄存器 | |
DMA+10 | 0A | NA | 单个通道屏蔽寄存器 | |
DMA+11 | 0B | 临时寄存器 | 工作方式寄存器 | |
DMA+12 | 0C | NA | 清除先/后触发器命令 | |
DMA+13 | 0D | 暂存寄存器 | 总清命令 | |
DMA+14 | 0E | NA | 清四个通道屏蔽寄存器命令 | |
DMA+15 | 0F | NA | 置四个通道屏蔽寄存器 |
一般PC上都级联两个8237 DMA控制器,分别称为DMA1、DMA2,上面的端口地址指的是DMA1的,DMA2的值分别是0C0 ~ 0DE,偶数有效。这样共组成了8个通道,但只有7个通道可供使用,DMA2的第四个通道用在级联。
1.2 关键寄存器说明
A、命令寄存器(0x08)
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
D0:0:禁止存储器到存储器的传输;1:允许
D1:存储器到存储器的传输时,0:源地址不保持;1:源地址保持,这样可以将同一个源地址单元传输到一组目标单元中去。如果D0=0,D1无效。在PC中,D0=0,所以,D1没有什么作用。
D2:1:允许8237工作;0:禁止。
D3:0:正常时序;1:压缩时序。如果是压缩时序,在大部分的读写数据的时序中,可以节省一个始终周期S3。在PC中,默认为正常时序。
D4:0:固定优先级;1:循环优先级。在PC中,使用固定优先级,即优先级的大小从DREQ0 ~ DREQ7。
D5:0:不扩展写信号;1:扩展写信号。如果扩展写信号,则在发出读信号的同时发出写信号,这样读写信号同为2个周期。在PC中,默认为不扩展。
D6:0:DREQ高电平有效;1:DREQ低电平有效。
D7:0:DACK低电平有效;1:DACK高电平有效。PC中,默认DREQ高电平有效,DACK低电平有效。
PC默认为0x00。
B、 请求寄存器(0x09)
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
D1D0:组成四个通道的名称(00:通道0; 01:通道1; ….)
D2:0:不请求传输;1:请求传输。
此寄存器用于软件请求,硬件请求不需要此寄存器。
C、 单个通道屏蔽寄存器(0x0A)
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
D1D0:组成四个通道的名称(00:通道0; 01:通道1; ….)
D2:0:允许;1:屏蔽。
D、 工作方式寄存器(0x0B)
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
D1D0:通道选择(00:通道0; 01:通道1; ….)
D3D2:传输类型(00:校验; 01:DMA写; 02:DMA读; 03:NA)
D4:自动预置功能。需要传输的数据结束后,将基地址重新放入当前寄存器中。
D5:地址增长方式,0:地址加1;1:地址减1。
D7D6:通道传输方式(00:询问方式; 01:单字节方式; 02:数据块方式; 03:级联方式)
E、 清除先/后触发器命令(0x0C)
写入任意值,保证传输地址和计数值时,第一次传输的是低8位,后面传输的是高8位。
F、 总清命令(0x0D)
写入任意值,与硬件RESET信号类似,初始化所有寄存器。
G、 清四个通道屏蔽寄存器命令(0x0E)
写入任意值,四个通道屏蔽位均清0,这样,4个DMA通道都可以接受DMA请求。
H、 置四个通道屏蔽寄存器(0x0F)
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
D0:0:允许;1:屏蔽。
D1:0:允许;1:屏蔽。
D2:0:允许;1:屏蔽。
D3:0:允许;1:屏蔽。
I、 (读)状态寄存器(0x08)
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
D0:0:通道0计数未结束;1:通道0计数结束。
D1:0:通道1计数未结束;1:通道1计数结束。
D2:0:通道2计数未结束;1:通道2计数结束。
D3:0:通道3计数未结束;1:通道3计数结束。
D4:0:通道0无DMA请求;1:通道0有DMA请求。
D5:0:通道1无DMA请求;1:通道1有DMA请求。
D6:0:通道2无DMA请求;1:通道2有DMA请求。
D7:0:通道3无DMA请求;1:通道3有DMA请求。
J、 通道N的基址寄存器和计数值的初始化
分两次向对应的寄存器中写入16位数值,一次8个字节。