Files
final-exam/接口与通讯技术/重点复习/填空题专题/82C37A DMA控制器.md
T

5.6 KiB
Raw Blame History

tags, create time
tags create time
接口与通讯技术
82C37A
DMA
重点复习
2026-06-28 15:00

82C37A DMA 控制器

概述

82C37A 是 x86 系统的 DMA(Direct Memory Access,直接内存访问)控制器,允许外设与内存之间直接传输数据而不经过 CPU。在 3 套试卷中出现了 5 道填空题,是高频考点。本专题聚焦 S0 过渡时序、DACK 选中信号、字节计数器初始值和三条软命令。

正文

1. DMA 基本概念

DMA 传输的核心思想:让外设直接与内存交换数据,CPU 只负责让出总线控制权。

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(总线应答)**信号之间的时间。

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 是成对出现的握手信号
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 条软命令,分别是______、总清除和清屏蔽寄存器软命令。

答案:清先/后触发器

关联笔记