--- 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|试题册索引]]