151 lines
5.6 KiB
Markdown
151 lines
5.6 KiB
Markdown
---
|
||
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|试题册索引]]
|