---
tags:
- 接口与通讯技术
- 82C37A
- DMA
- 重点复习
create time: 2026-06-28 15:00
---
# 82C37A DMA 控制器
## 概述
82C37A 是 x86 系统的 DMA(Direct Memory Access,直接内存访问)控制器,允许外设与内存之间直接传输数据而不经过 CPU。在 3 套试卷中出现了 **5 道填空题**,是高频考点。本专题聚焦 S0 过渡时序、DACK 选中信号、字节计数器初始值和三条软命令。
## 正文
### 1. DMA 基本概念
DMA 传输的核心思想:**让外设直接与内存交换数据,CPU 只负责让出总线控制权**。
```mermaid
graph TB
subgraph "传统 I/O(CPU 参与)"
A1["外设"] -- "数据" --> B1["CPU"]
B1 -- "数据" --> C1["内存"]
end
subgraph "DMA 传输(CPU 不参与数据搬运)"
A2["外设"] -- "数据" --> C2["内存"]
D2["CPU"] -. "让出总线" .- E2["82C37A"]
E2 -. "控制传输" .- A2
E2 -. "控制传输" .- C2
end
```
### 2. S0 过渡状态 — HRQ → HLDA
82C37A 的工作时序分为多个阶段,其中 **S0 是过渡状态**,指从 DMA 控制器发出有效的 **HRQ(总线请求)**信号,到收到有效的 **HLDA(总线应答)**信号之间的时间。
```mermaid
sequenceDiagram
participant DMA as "82C37A"
participant CPU as "CPU"
participant IO as "I/O 设备"
Note over DMA: "DMA 请求产生"
DMA->>CPU: "HRQ(Hold Request)
请求总线控制权"
Note over DMA,CPU: "S0 过渡状态"
CPU->>DMA: "HLDA(Hold Acknowledge)
释放总线控制权"
Note over DMA: "获得总线控制权
进入 S1~S4 数据传输"
DMA->>IO: "DACK 选中 I/O 设备"
DMA->>IO: "开始 DMA 数据传输"
Note over DMA,CPU: "S1~S4 传输状态"
DMA->>CPU: "传输完成,释放总线"
```
| 信号 | 全称 | 方向 | 功能 |
|------|------|------|------|
| **HRQ** | Hold Request | DMA → CPU | DMA 请求 CPU 让出总线 |
| **HLDA** | Hold Acknowledge | CPU → DMA | CPU 应答并释放总线 |
| **DREQ** | DMA Request | I/O → DMA | I/O 设备请求 DMA 传输 |
| **DACK** | DMA Acknowledge | DMA → I/O | DMA 应答并选中 I/O 设备 |
> [!important] 信号配对关系
> - **HRQ / HLDA**:DMA 与 CPU 之间的总线握手
> - **DREQ / DACK**:DMA 与 I/O 设备之间的传输握手
>
> > [!question] 思考题
> > S0 状态结束时,82C37A 处于什么状态?
> >
> > 答:S0 结束后,82C37A 从**被动工作状态**过渡到**主动工作状态**,获得总线控制权,开始执行 DMA 传输周期(S1~S4)。
### 3. DACK — 选中 I/O 设备
在 DMA 有效操作周期内,82C37A 选中 I/O 设备的方式是发出有效的 **DACK(DMA Acknowledge)**信号。
- I/O 设备先发出 **DREQ** 请求 DMA 传输
- DMA 获得总线后,发出 **DACK** 通知该 I/O 设备"已选中你"
- DREQ 和 DACK 是**成对出现**的握手信号
```mermaid
graph LR
IO["I/O 设备"] -- "DREQ 请求传输" --> DMA["82C37A"]
DMA -- "DACK 选中设备" --> IO
DMA -- "HRQ 请求总线" --> CPU["CPU"]
CPU -- "HLDA 释放总线" --> DMA
```
### 4. 字节计数器 — 写入 N-1
82C37A 的字节计数器(Current Word Register)存储的是**计数值减 1**,因为计数器从设定值递减到 0 时产生 TC(Terminal Count)终止信号:
$$\text{写入值} = \text{传输字节数} - 1$$
| 传输字节数 | 写入值(十进制) | 写入值(十六进制) |
|----------|:--------------:|:----------------:|
| 1 | 0 | 0000H |
| 256 | 255 | 00FFH |
| **1024(1K)** | **1023** | **03FFH** |
| 65536 | 65535 | FFFFH |
> [!example] 真题计算
> 传输 1K 个字节 = 1024 字节,写入值 = 1024 - 1 = **1023 = 3FFH**。
>
> 计数过程:3FFH → 3FEH → ... → 001H → 000H(TC 信号产生,传输结束)。
> 实际传输了 1024 个字节。
> [!important] 核心公式
> $$\text{实际传输字节数} = \text{计数器初值} + 1$$
### 5. 三条软命令
82C37A 有 **3 条软命令**,通过写特定端口地址触发(无需数据):
| 软命令 | 功能 | 说明 |
|--------|------|------|
| **清先/后触发器** | 复位内部双字节读写触发器 | 确保下次读写从**低字节**开始 |
| **总清除**(Master Clear) | 复位整个芯片 | 清除所有命令、状态和暂存寄存器 |
| **清屏蔽寄存器** | 清除所有通道的屏蔽位 | 使所有通道允许 DMA 请求 |
> [!tip] 记忆技巧
> 三条软命令分别对应:**触发器 → 全局复位 → 屏蔽清除**,从局部到全局再到通道控制。
### 6. 真题回顾
> [!example] 【真题】82C37A 的工作时序中,S0 是 82C37A 由被动工作状态过渡到主动工作状态的阶段,是指从发出有效的\_\_\_\_\_\_信号,直到收到有效的 HDLA 信号之间的时间。
>
> **答案**:HRQ(总线请求)
> [!example] 【真题】在 82C37A 的工作时序中,过渡状态是指从发出有效的\_\_\_\_\_\_信号,到收到有效的\_\_\_\_\_\_信号之间的时间。
>
> **答案**:HRQ;HLDA
> [!example] 【真题】82C37A 在有效操作周期内,选中 I/O 的方式是发出有效的\_\_\_\_\_\_信号。
>
> **答案**:DACK
> [!example] 【真题】若利用 82C37A 控制 DMA 传输,共传输 1K 个字节,在对 82C37A 进行初始化时,应该向字节计数器中写入\_\_\_\_\_\_。
>
> **答案**:3FFH(或 1023)
> [!example] 【真题】DMA 控制器 82C37A 有 3 条软命令,分别是\_\_\_\_\_\_、总清除和清屏蔽寄存器软命令。
>
> **答案**:清先/后触发器
## 关联笔记
- [[IO端口编址方式]]
- [[8259A中断管理基础]]
- [[82C59A中断结束方式]]
- [[接口与通讯技术/试题册/index|试题册索引]]