Files

151 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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)<br/>请求总线控制权"
Note over DMA,CPU: "S0 过渡状态"
CPU->>DMA: "HLDA(Hold Acknowledge)<br/>释放总线控制权"
Note over DMA: "获得总线控制权<br/>进入 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|试题册索引]]