7.1概述
7.2CPU与外设数据传送的 方式
7.3可编程计数器 /定时器 8253
7.4串行通讯和串行接口
7.5 并行接口
7.6 DMA控制器 8237
7.7 D/A和 A/D转换技术
第七章 输入 /输出接口
7.6 DMA控制器 8237
1,概述
2,8237的引脚功能
3,8237的编程结构
4,8237对内存和 I/O的寻址
?概述
DMA=Direct Memory Access,直接存储器存取
CPU
内存 外设
数据通道 数据通道
非 DMA方式
(包括程序控制方式和中断方式 )
DMAC
内存 外设
数据通道
DMA方式
?概述
DMAC具有独立的控制三大总线来访问存储器和 I/O端
口的能力,它能像 CPU一样提供数据传送所需的地址
信息和读写控制信息
DMAC和 CPU都挂在系统总线上,当进入 DMA方式时,
DMAC成为总线主控。
在总线上,可以控制其他部件的部件称为总线主控或
主控 (bus master),被控部件称为 从控 (slave)。任意时
刻,总线上只有一个主控。
?概述
DMA操作之前,应先对 DMAC编程,把要传送的数据
块长度、数据块在存储器中的起始地址,数据传送方向
等信息发送给 DMAC
DMA操作过程包括三个阶段:
?DMA请求
?DMA响应和数据传送
?传送结束
当外设要求以 DMA方式为它服务时,发 DMA请求信
号 DREQ到 DMAC
DMAC检查该信号是否被屏蔽及其优先权,如确认该
信号有效则向 CPU发送总线请求信号 HRQ(连到 CPU
的 HOLD)
DMA请求阶段
CPU
DMAC
HRQ
外设
DREQ
地址总线
数据总线 存储器
?概述
每个总线周期结束时 CPU检测 HOLD,如为高电平,则响应
HOLD请求进入保持态,使三态总线 CPU侧呈高阻状态,并以总
线保持响应信号 HLDA通知 DMAC
DMAC接管总线,并以 DACK信号 通知外设,使之成为 DMA传
送时被选中的设备,同时 DMAC给出内存地址以及 I/O读写和存
储器读写控制信号,在 外设和存储器之间完成数据传送
DMA响应和数据传送阶段
CPU
DMAC
HLDA
外设DACK
存储器
地址总线
数据总线
IOR/IOW
MEMR/MEMW
?概述
传送结束阶段
传送完成后,DMAC放弃总线,撤消总线请求 (HRQ
为低 ),CPU检测到 HRQ(HOLD)为低后,撤消 HLDA,
CPU重新获得总线控制权
CPU
DMAC
HRQ
外设
EOP
地址总线
数据总线 存储器
?概述
?概述
PC系列微机使用 可编程 DMA控制器 8237A(简称 8237)
实现 DMA功能
8237有四个通道,每个通道都有独立的与相应外设接
口相联系的信号,四个通道共享与 CPU相连的控制信
号、地址信号、数据信号
PC/AT以上的微机使用两片 8237,Pentium微机系统中
没有独立的 8237芯片,其功能集成在芯片组中
?8237的引脚功能
?8237的引脚功能
?请求 /应答信号
外设接口电路向 8237的请求信号,DREQ3~DREQ0
8237对外设接口电路的应答信号,DACK3~DACK0
8237向 CPU申请总线的信号,HRQ(连至 CPU的 HOLD)
CPU向 8237传送的允许使用总线信号,HLDA
?8237的引脚功能
?地址信号
,CPU初始化 8237或读 8237状态时所需的片选信号
A7~A0(输出),8237访问存储器的地址信号的低 8位。
A3~A0(输入),CPU初始化 8237或读 8237状态时,
用于寻址 8237内部寄存器
?8237的引脚功能
?数据信号 (双向 ),DB7~DB0
CPU为主控时,可以通过 I/O读命令查询 8237的状
态寄存器的内容,或通过 I/O写命令对 8237的内部
寄存器进行编程,数据传送通过 DB7~DB0
8237为主控时,DB7~DB0输出要访问的内存地址
的高 8位,并通过 ADSTB锁存到外部地址锁存器中,
和 A7~A0输出的低 8位地址一起构成 16位地址
?8237的引脚功能
?地址允许信号, AEN
8237作为主控时( 8237控制总线),输出 AEN=1。
8237作为从控时( CPU控制总线),输出 AEN=0。
?DMA传输结束信号, (双向)
当 DMAC内部任一通道传输结束,8237发出
若由外部给 DMAC送入有效的,则强制 DMAC内部
所有通道结束传输。
?8237的引脚功能
MEMR/MEMW:
8237发出的存储器读 /写信号
IOR/IOW:
8237作为主控时,输出的 I/O读 /写信号。
8237作为从控时,CPU发出的 I/O读 /写信号,用于
读 /写 8237
?8237的引脚功能
ADSTB:地址选通信号
用于启动地址锁存器
READY:存储器或 I/O的就绪信号
?8237的编程结构
?8237的编程结构
控制寄存器
8位,4个通道共用,用于设定 8237的信号形式、工作
时序、传输方向。 端口地址 08H
信号形式,DREQ/DACK信号的有效形式。
工作时序:普通时序( 3个时钟周期完成一次传输)
压缩时序( 2个时钟周期完成一次传输)
传输方向:内存 ?I/O(常用)
I/O?内存(常用)
内存 ??内存( PC系列机未用)
?8237的编程结构
D7,0= DACK低电平有效; 1=DACK高电平有效
D6,0= DREQ高电平有效; 1=DREQ低电平有效
D5,1=扩展写信号,IOW/MEMW比正常时序提前一个周期;
0=不扩展写信号
D4,0=固定优先级,通道 0优先级最高,通道 3优先级最低;
1=循环优先级
D3,0=正常时序 1=压缩时序
D2,0=启动 (指允许 )8237工作 ; 1=停止 (指禁止 ) 8237工作
D1:内存到内存传输时,D1=1使源地址保持不变
D0,0=内存 ??I/O间的传输; 1=内存 ??内存间的传输
控制寄存器
?8237的编程结构
PC系列微型机中,BIOS初始化时将控制寄存器设为
00H——
禁止内存 ??内存的传送,
允许读 /写操作,
使用正常时序
固定优先级
不扩展写信号
DREQ高电平有效
DACK高电平有效
?8237的编程结构
状态寄存器
8位,4个通道共用,与控制寄存器共用一个端口地址
端口地址 08H
记录每个通道是否有请求、传输是否结束
D3~D0:分别对应通道 3~0,指出 4个通道的 DMA传
送是否结束,结束为 1
D7~D4:分别对应通道 3~0,表示 4个通道是否有
DMA请求,有 DMA请求为 1
暂存寄存器
8位,端口地址 0DH
在内存 ??内存传输时,暂存数据。
注意,内存 ?? I/O传输时,数据不进入 8237内部,
只存在于数据总线上
?8237的编程结构
?8237的编程结构
模式寄存器
8位,设定 DMA的传输模式,4个通道的模式寄存器
共用一个端口地址,端口地址 0BH
传输模式:
?单字节传输模式
?数据块传输模式
?请求传输模式
?级联传输模式
单字节传输模式,每次 DMA操作只传送一字节后,接
着 8237释放总线
块传输模式, 8237获得总线控制权后,连续传送多个
字节,每传输一个字节,当前字节计数器减 1,当前
地址寄存器加 1或减 1,直到所要求的字节数传输完
(当前字节计数器减至 0),8237在 EOP引脚上发出
结束信号,然后释放总线。在块传输过程中,若向
8237的 EOP引脚上输入低电平,可强行结束传输。
模式寄存器
?8237的编程结构
请求传输模式,
在传输过程中,8237要检测 DREQ信号(询问外设),
当 DREQ为低时,8237暂停传输(不释放总线),当
DREQ再次有效后,继续进行传输。
级联传输模式,
多片 8237级联时,可以构成主从式 DMA系统。级联的
方式是把从片的请求线 HRQ连至主片的 DREQ引脚,
主片的 DACK联至从片的 HLDA引脚
若主 8237的某通道( DREQ)连接从 8237的 HRQ,主
8237的该通道应设置为级联传输模式,但从 8237不设
置级联传输模式,而是设置其它三种模式之一
模式寄存器
?8237的编程结构
?8237的编程结构
D7,D6:模式选择
00= 请求传输模式 01=单字节传输模式
10= 块传输模式 11=级联传输模式
D5:存储器地址增减选择,0=地址增 1,1=地址减 1
D4:自动预置功能,0=禁止,1=允许
自动预置,在当前字节计数器到达 0时,当前字节计
数器和当前地址寄存器从基本字节计数器和基地址
寄存器中自动获得新的初值
?8237的编程结构
D3,D2:传输类型选择
01=写传输( I/O?内存),10=读传输(内存 ? I/O)
00=校验传输, 11=无意义
校验传输 用来对读传输和写传输功能进行校验,它是一
种虚拟传输,8237也会产生存储器地址信号,但不产生
存储器读 /写,I/O读 /写信号,校验传输一般用于器件测

D1,D0:通道选择
00=通道 0 01=通道 1
10=通道 2 11=通道 3
?8237的编程结构
基地址寄存器和当前地址寄存器
每个通道一个基地址寄存器,一个当前地址寄存器,
16位,占用相同的端口地址
基地址寄存器,DMA传输的内存地址初值,在初始化
时由 CPU分两次写入。
当前地址寄存器,DMA传输过程中,内存地址的当前
值。每传输一字节,该寄存器的值增 1或减 1。 CPU可
分两次读出其值。
?8237的编程结构
基本字节计数器和当前字节计数器
每个通道一个基本字节计数器,一个当前字节计数器,
16位,占用相同的端口地址
基字节计数器,DMA传输的字节数初值,在初始化时
由 CPU分两次写入。 8237规定,初值比实际传输的字
节数少 1
当前字节计数器,DMA传输过程中,当前的计数值。
每传输一字节,该寄存器的值减 1。当计数值减到
FFFFH时,8237发出结束信号 EOP。 CPU可分两次读
出其值。
?8237的编程结构
先 /后触发器
端口地址 0CH
CPU写入基地址寄存器、基本字节计数器时,均分两次
写入,先 /后触发器用于控制写入的值是低 8位还是高 8位
写入过程:
①使先 /后触发器 =0。
②写入低 8位,先 /后触发器自动置 1。
③写入高 8位,先 /后触发器自动置 0。
?8237的编程结构
请求寄存器
四个通道的请求触发器构成一个请求寄存器( 8位)
一般情况下,DMA请求由硬件信号 DREQ发出,也可
由软件设置请求触发器来发出 DMA请求。
D2=1设置 DMA请求
D1~D0:指定软件 DMA请求的通道
端口地址 09H
?8237的编程结构
屏蔽寄存器
四个通道的屏蔽触发器构成一个屏蔽寄存器( 8位)
当屏蔽寄存器的屏蔽标志置 1时,将禁止该通道的硬件
DMA请求和软件 DMA请求。
D2=1,设置屏蔽; D2 =0,清除屏蔽;
D1~D0:选通道
端口地址 0AH
?8237的编程结构
综合屏蔽寄存器
8237可以一次完成四个通道的屏蔽设置
D3~D0:分别对通道 3~0设置屏蔽
1,设置屏蔽; 0,清除屏蔽;
端口地址 0FH
清除屏蔽寄存器
对端口 0EH写入 0,可以一次清除四个通道的屏蔽触发

端口地址 0EH
MOV DX,DMA+0EH
MOV AL,0
OUT DX,AL
?8237的编程结构
?8237的编程结构
复位命令寄存器
对端口 0DH写入 0,使 8237复位,其功能等同于硬件复位
端口地址 0DH
8237复位后的状态为:
控制寄存器
状态寄存器
请求寄存器
暂存器
先 /后触发器
清 0 屏蔽寄存器 置 1
?8237的编程结构
一片 8237占用连续 16个端口地址,用
DMA+00H~DMA+0FH表示。其中,DMA表示该片
8237的基地址。
在 AT以上的微机 中,使用 2片 8237,其地址为:
第一片 8237,基地址 DMA=0000H,使用 0000H~000F
I/O地址。
第二片 8237,基地址 DMA=00C0H,使用 00C0H~00CF
I/O地址。
端口地址
读 ( =0 ) 写 ( =0 )
DMA +0 0H 当前地址寄存器 ( 0 ) 基地址寄存器 ( 0 )
+01 H 当前字节计数器 ( 0 ) 基字节计数器 ( 0 )
+02 H 当前地址寄存器 ( 1 ) 基地址寄存器 ( 1 )
+03 H 当前字节计数器 ( 1 ) 基字节计数器 ( 1 )
+04 H 当前地址寄存器 ( 2 ) 基地址寄存器 ( 2 )
+05 H 当前字节计数器 ( 2 ) 基字节计数器 ( 2 )
+06 H 当前地址寄存器 ( 3 ) 基地址寄存器 ( 3 )
+07 H 当前字节计数器 ( 3 ) 基字节计数器 ( 3 )
+08 H 状态寄存器 控制寄存器
+09 H   请求寄存器
+0A H   屏蔽寄存器
+0B H   模式寄存器
+0C H   清先 / 后触发器
+0D H 暂存器 复位命令寄存器
+0E H   清除屏蔽寄存器
+0F H   综合屏蔽寄存器
?8237的
编程结构
?8237对内存和 I/O的寻址
存储器寻址
在主控模式下,8237可以产生 16位存储器地址信号,
地址引脚 A7~A0输出地址低 8位,高 8位地址由数据
引脚 DB7~DB0输 出,经地址锁存器后形成存储器地
址的 A15~A8。用 ADSTB启动地址锁存器。
当系统的存储器地址多于 16位时,多余位地址由一
个称为 DMA页面寄存器的接口电路提供
?8237对内存和 I/O的寻址
存储器寻址
在 PC/AT系统中,需要 24位地址,高 8位地址
A23~A16由 DMA页面寄存器电路 74LS612提供。在
DMA传输之前,用指令将高 8位地址送入页面寄存器,
在 DMA传输过程中,由 AEN信号使页面寄存器输出
该 8位地址。
存储器寻址
?8237对内存和 I/O的寻址
在 Pentium微机中,DMAC和相关页面寄存器的功
能由多功能芯片组实现
I/O寻址
?8237对内存和 I/O的寻址
8237的四个通道,每一个只接一个外设接口电路,
不使用 I/O地址来区分 I/O设备
I/O设备的端口地址只用于 CPU对 I/O设备的寻址
I/O寻址
?8237对内存和 I/O的寻址
?8237的应用
初始化编程
写入控制寄存器
写入屏蔽寄存器 —— 屏蔽要初始化的通道
写入模式寄存器
先后触发器置 0
写入基地址和基本字节寄存器
解除屏蔽
写入请求寄存器
?8237的应用
例,ROM-BIOS对通道 2初始化编程的代码片段
DMA EQU 0 ;DMA通道起始端口
1) 系统在启动时,对控制寄存器进行初始化
MOV AL,0
OUT DMA+8,AL
2) 清除先 /后寄存器
OUT DMA+12,AL
3) 设置模式寄存器
MOV AL,46H
……
OUT DMA+11,AL
4) 送内存地址
计算内存的物理地址,将 20位地址的高 4位送页面寄存器,低
16位先送低 8位,再送高 8位
…...
OUT DMA+4,AL ;低 8位
……
OUT DMA+4,AL ;高 8位
……
OUT 81H,AL ; 20位地址的高 4位
5) 送传送字节数
…...
6) 送屏蔽位
MOV AL,2
OUT DMA+10,AL
?8237的应用
?8237的应用
例:利用主板上的 8237通道 1,将内存起始地址为 80000H的 300H
字节直接输出给外设
MOV AL,0;清除先 /后触发器
OUT 0DH,AL;写地址
OUT 02,AL
OUT 02,AL
MOV AL,8
OUT 83H,AL;传送的字节数
MOV AX,300H
DEC AX
MOV 03,AL
MOV AL,AH
OUT 03,AL;写 模式寄存器
MOV AL,49H
OUT 0BH,AL;清除通道 1屏蔽
MOV AL,1
OUT 0AH,AL;读通道 1状态
WAIT,IN 08
AND AL,02
JZ WAIT;完成后屏蔽通道 1
MOV AL,5
OUT 0AH,AL
7.7 D/A和 A/D转换技术
?数模转换
D/A转换器
D/A转换器简称 DAC=Digital to Analog Converter
DAC把数字量转换为模拟量(电压或电流)。
数模转换原理
DAC的核心是解码网络,如 T型解码网络
?数模转换
DAC0832
?数模转换
DAC0832
DAC0832是 8位 DAC,内部有两级缓冲。当 LE1有
效时,数据进入第一级(数据输入寄存器),当
LE2有效时,数据输入寄存器的值进入第二级
( DAC寄存器)。由于 DAC寄存器的输出直接送
D/A转换器,使 LE2有效的命令又称 转换命令
DAC0832的输出为两个电流信号 IOUT1和 IOUT2
( IOUT1+IOUT2=常数),内部提供了一个反馈
电阻 R,只需加一个运算放大器,利用内部的反馈
电阻 R即可获得电压输出
?数模转换
DAC0832的接口设计
1,使数据输入寄存器工作在锁存状态,DAC寄存器工
作在不锁存状态( LE2始终有效,DAC寄存器直通)。
只使用一级缓冲。
设 D/A转换端口号为 PORTA,设需转换的数据放在
1000H单元,则 D/A转换程序为:
MOV BX,1000H
MOV AL,[BX]
MOV DX,PORTA
OUT DX,AL
?数模转换
DAC0832的接口设计
2,使用两级缓冲
?数模转换
DAC0832的接口设计
设 CS’由 A15~A1经译码产生,当 A15~A1=A0832时,
CS’有效。在 CPU执行 OUT指令时,若 A0=0,
DAC0832内部 LE1有效,数据总线上的值( AL)送
入数据输入寄存器 ; 若 A0=1,DAC0832内部 LE2有效,
数据输入寄存器的值送 DAC寄存器。
A0832 EQU 200H
MOV DX,A0832+0; A0=0
OUT DX,AL ; AL的值为待转换的数字
MOV DX,A0832+1 ; A0=1
OUT DX,AL; AL的值无关
?数模转换
DAC0832的接口设计
?模数转换
模数转换原理
方法有计数法、逐次逼近法等
?计数式 A/D转换
转换原理:由计数器对固定频率信号 CLK进行计数,
计数输出值送 DAC,DAC的输出模拟量 Vo与输入模
拟量 Vi在比较器中进行比较,随着计数的进行,Vo
不断增加,当 Vo>Vi,计数器停止计数,此时的计数
值即是模拟量 Vi对应的数字量。
?模数转换
模数转换原理
?计数式 A/D转换
?模数转换
模数转换原理
?逐次逼近型 A/D转换
?模数转换
模数转换原理
?逐次逼近型 A/D转换
转换原理:数字量由逐次逼近寄存器 SAR产生。 SAR
使用对分搜索法产生数字量,以 8位数字量为例,SAR
首先产生 8位数字量的一半,即 10000000B,试探模拟量
的大小,若 Vo>Vi,清除最高位,若 Vo<Vi,保留最高
位。在最高位确定后,SAR又以对分搜索法确定次高
位,即以低 7位的一半 y1000000B(y为已确定位 ) 试探模
拟量的大小。重复这一过程,直到最低位 bit0被确定,
转换结束
?模数转换
ADC 0809
8位 ADC,逐次逼近型,8路模拟量输入
内部有,8选 1”MUX。当 ALE信号有效时,ADD_C、
ADD_B,ADD_A选择 IN0~IN7。例如 ADD_C、
ADD_B,ADD_A分别为 011时,选择 IN3通道。
数字输出:有三态缓冲器,当 Enable有效时,从
D7~D0引脚输出转换后的数字。
启动信号,START。负脉冲启动。
转换结束信号,EOC,高电平有效。
?模数转换
ADC 0809
?模数转换
ADC 0809的接口设计
?模数转换
ADC 0809的接口设计
通道选择由系统地址信号 A2~A0连至 ADD_C、
ADD_B,ADD_A实现。 ALE信号由 A12~A3经译码
后形成的 CS信号和 IOW信号或非获得。
设 A12~A3=220H时,CS有效,以下指令可以执行
通道选择:
MOV DX,220H+n ; n=0~7
OUT DX,AL ; AL的值无关
?模数转换
ADC 0809的接口设计
START信号与 ALE信号相连,通道选择的同时,
启动转换。
转换结束信号 EOC接 8255的 PB0,应使用 8255PB工
作在方式 0输入。 CPU查询 PB0即可获知转换是否
完成。
数据输出允许信号 Enable由和或非后驱动
以下指令可以读取转换后的数字:
MOV DX,220H
IN AL,DX
?模数转换 ADC 0809的接口设计
A0809 EQU 220H
A8255 EQU 210H ; 8255的地址为 210H~213H
MOV AL,1xxxx01xB ; 8255初始化,PB方式 0输入
MOV DX,A8255+3
OUT DX,AL;转换通道 IN5的程序
MOV DX,A0809+5
OUT DX,AL ;通道选择并启动转换
NEXT:
MOV DX,A8255+1 ; 8255PB
IN AL,DX
AND AL,01H
JZ NEXT ; PB0=0,未完成
MOV DX,A0809
IN AL,DX ; AL=转换结果
作业
1,使用 8250作串行接口时,若要求以 1200bps的波特率发送一个字
符,字符格式为 7个数据位,一个停止位,一个奇校验位,试编写
初始化程序。
2,设 8255的端口 A,B,C和控制寄存器的地址为 F4H,F5H、
F6H,F7H,要使 A口工作于方式 0输出,B口工作于方式 1输入,
C口上半部输入,下半部输出,且要求初始化时 PC6=0,试编写
初始化程序
3,试述 8237的 DMA请求 /响应握手过程
4,使用 8237的通道 3,实现从内存到 I/O设备的传送,其中传送的
数据所在的内存单元为 20000H~20FFFH