第七章 输入和输出 第一节 I/O接口 第三节 可编程DMA控制器8237A 第二节 CPU与外设数据传送的方式
第一节 I/O接口 一、I/O接口的功能 I/O地址译码与设备选择 数据的缓冲与暂存 对外设进行监测、控制与管理,中断处理 把选中的与总线相接,未选中的与总线隔离(高阻态) 数据的缓冲与暂存 缓解接口与CPU工作速度的差异 对外设进行监测、控制与管理,中断处理 信号电平与类型的转换 形式、格式、电平、功率、码制等
CPU与外部设备交换信息的过程,其实与它和存储器交换数据的过程类似,同样是在控制信号的作用下通过数据总线来完成,它们连接示意图如右图所示。
二、接口电路的基本结构 信息种类: 数据(DATA) 状态信息(STATUS) 控制信息(CONTROL)
基本结构 1、三类信息的性质不同,应通过不同的端口分别传送。 2、在用输入输出指令来寻址外设(实际寻址端口)的CPU中,外设的状态作为一种输入数据,而CPU的控制指令是作为一种输出数据,可以通过数据总线来分别传送。 3、端口地址由CPU地址总线的低8位或低16位地址信息来确定,CPU根据I/O指令提供的端口地址来寻址端口,与外设交换信息。
三、I/O端口的寻址方式 1、 统一编址 把外设接口与内存统一进行编址。各占据统一地址空间的不同部分。 优点 缺点 指令统一、灵活 访问控制信号统一 缺点 内存可用地址空间减小
2、 独立编址 外设地址空间和内存地址空间相互独立。 优点:内存地址空间不受I/O编址的影响 缺点:I/O指令功能较弱
第二节 CPU与外设数据传送的方式 CPU与外设之间数据传送的控制方式有以下四种: 无条件传送 查询式传送 中断方式传送 直接存储器存取(DMA, Direct Memory Access)
一、无条件传送方式 又称同步传送方式,只对外设,如开关、继电器、7段显示器、机械式传感器等简单设备,在规定的时间用IN或OUT指令来进行信息的输入或输出。
无条件传送输入 数据线 PC 总 线 D0~D7 A0~A15 IOR 地址线 三态 缓冲器 输 入 设 备 地址 译码 无条件传送输入
在输入时,认为来自外设的数据已经输入至三态缓冲器,于是CPU执行IN指令,指定的端口地址经地址总线的低8位,即A0~A7,送至地址译码器,CPU进入了输入周期,选中的地址信号和M/IO及RD相与后,去选通输入三态缓冲器,把外设的数据经数据总线送至CPU。 显然,这必须要求当CPU执行IN指令时,外设的数据是准备好的,否则就会读错。
无条件传送输出 数据线 PC 总 线 D0~D7 A0~A15 IOW 地址线 锁存器 输 出 设 备 地址 译码 无条件传送输出
在输出时,假定CPU的输出信息经数据总线已送到输出锁存器的输入端;CPU执行OUT指令,端口地址线由地址总线的低8位地址送至地址译码器,CPU进入了输出周期,所选中的地址信号和M/IO和WR相与后,选通锁存器,把输出信息送至锁存器保留,由它把信息通过外设输出。 显然,在CPU执行OUT指令时,必须确定所选外设的锁存器是空的。
一个采用同步传送的数据采集系统,如下页图所示。被采样的数据是8个模拟量,由继电器绕组P0、P1、……P7控制接触点K0、K1、……K7逐个接通。用一个4位的十进制数字电压表测量,把被采样的模拟量转换成16位BCD代码,高8位和低8位通过两个不同的端口输入,其地址分别是10和11。CPU通过端口20输出控制信号,从而控制继电器的吸合顺序,实现采集不同的模拟量。
8位
BEGIN:MOV DX,0100H ;01H:置合第一个继电器代码 LEA BX,DSTOCK ;00H:断开所用继电器代码 XOR AL,AL CYCLE:MOV AL,DL OUT 20H,AL ;断开所有继电线圈 CALL NEAR DELAY1 ;模拟继电器触点的释放时间 MOV AL,DH OUT 20H,AL ;使P0吸合 CALL NEAR DELAY ;模拟触点闭合及数字电压表的 IN AX,10H ;转换时间 MOV [BX],AX INC BX RCL DH,1 JNC CYCLE CONTI:……
无条件输入电路
无条件输出电路
二、程序查询传送方式 1、查询式输入 查询式输入的接口电路包含状态口和输入数据口两部分,分别由I/O端口译码器的两个片选信号和RD信号控制。 输入数据口由一个8位锁存器和一个8位缓冲器构成,它们可以被分别选通。
…查询式输入的接口电路… D0
输入设备准备好数据后,就向I/O接口电路送选通信号。 CPU先执行IN指令读取状态口的信息,这时M/IO为高,使I/O译码器输出低电平的状态口片选信号CS1。 CS1和RD经门1相与后的低电平输出,使三态缓冲器开启,于是Q端的高电平经缓冲器(1位)传送到数据线上的READY位(如D0),并被读入累加器。
程序检测到RAEDY位为1后,执行IN指令读数据口。 这时M/IO和RD信号再次有效,使CS2片选信号置零,CS2和RD经门2输出低电平:一方面开启数据缓冲器,将外设送到锁存器中的数据经8位数据缓冲器送到数据总线上后进入累加器,另一方面将D触发器清零,这样一次数据传送完毕。 接着就可以开始下一个数据的传送。
设状态口的地址为40H,状态口D0为1表示外设准备好。输入数据口的地址为50H,传送数据的总字节数为COUNT,则查询式输入数据的程序段为: MOV BX,0 MOV CX,COUNT INPUT_STATUS: IN AL,40H TEST AL,01H JZ INPUT_STATUS IN AL,50H MOV [BX],AL INC BX LOOP INPUT_STATUS CONTI: ……
2、查询式输出 与输入接口相类似,输出接口电路也包含两个端口:状态口和数据输出口。 状态口也由一个D触发器和一个三态门构成,而数据输出口只有一个8位数据锁存器。
查询式输出的接口电路
CPU准备向外设输出数据时,它先执行IN指令读取状态口的信息。这时,高电平的M/IO和有效的端口地址信号使I/O译码器的状态口片选信号变低,CS1再和有效的RD信号经门1相与后输出低电平,使状态口的三态门开启,从D1位读入BUSY位的状态。 若BUSY=1,表示外设正处在接收上一个数据的忙状态;只有当BUSY=0时,CPU才能向外设输出新的数据。
CPU检查到BUSY=0时,便执行OUT指令将数据送往数据输出口。 这时M/IO高电平的使I/O译码器的状态口片选信号CS2变为低电平,CS2再和WR信号经门2相与后输出低电平的选通信号,它用来选通数据锁存器,将数据送往外设。 同时,选通信号的下降沿还使D触发器翻转,使Q端置1,即把状态口的BUSY位置1,表示忙碌。当输出设备从接口中取走数据后,就送回一个应答信号,它将D触发器清零,即使BUSY=0,允许CPU送出下一个数。
假设状态口的地址为60H,输出数据口的地址为70H,传送数据的总字节数为NUMBER,数据放在内存BUFFER开始的单元,则查询式输出数据的程序段为: MOV CX,NUMBER LEA BX, BUFFER OUTPUT_STATUS: IN AL,60H TEST AL,02H JNZ OUTPUT_STATUS MOV AL, [BX] INC BX OUT 70H,AL LOOP OUTPUT_STATUS CONTI: ……
一个有8个模拟量输入的数据采集系统,用查询方式与CPU传送信息,电路如图所示。 8个输入模拟量,经过多路开关(该多路开关由端口4的3位二进制码D0、D1和D2控制),每次传送出一个模拟量至A/D转换器;同时,A/D转换器由端口4输出的D4位控制启动与停止。A/D转换器的READY信号由端口2的D0输入至CPU的数据总线;经A/D转换后的数据由端口3 输入至数据总线。因此,这样的一个数据采集系统,需要用到3个独立地址的端口。
D2 D1 D0
程序如下: CLD ;下面用到字符串指令,地址指针自动增 START: MOV DL,11111000B ;启动信号的初始状态,低3位选通多路开关通道 LEA DI, DSTOR ;设置数据区指针 AGAIN: MOV AL,DL ;读取启动信号 AND AL,11101111B ;使D4=0 OUT 04H,AL ;停止A/D转换 CALL DELAY ;等待停止A/D转换的完成 MOV AL,DL OUT 04H,AL ;选输入通道并启动A/D转换 POLL: IN AL,02H ;读入状态信息 SHR AL,1 ;查AL的D0 JNC POLL ;若D0=0,未准备好则循环再查 IN AL,03H ;若已准备就绪,则经端口3将采样数据输至AL STOSB ;输入数据存至内存单元 INC DL ;选择下一个模拟量输入 JNE AGAIN ;8个模拟量未输入完则循环 CONTI: ……
三、中断方式 采用中断方式,CPU平时可以执行主程序,只有当输入设备将数据准备好了以后,或者输出端口的数据缓冲器已空时,才向CPU发中断请求。 CPU响应中断后,暂停执行当前的程序,转去执行管理外设的中断服务子程序。在中断服务程序中,用输入或输出指令在CPU和外设之间进行一次数据交换。等输入或输出操作完成以后,CPU又会去执行原来的程序。 这样,外设在处理数据期间,CPU就不必浪费大量的时间去查询它们的状态。
四、DMA传送方式 在DMA传送方式中,采用DMA控制器管理系统的数据总线、地址总线和控制总线,控制在存储器和外设间进行直接的数据传输,而不用CPU进行干预。
① 外设发出DMA请求 ② DMAC向CPU申请总线 ③ CPU完成当前总线周期后响应,并释放总线控制权 ④ DMAC得到总线控制权,并发出DMA响应信号 ⑤ 由DMAC发出各种控制信号,控制外设与存储器之间的数据传送 ⑥ 数据传送完后,DMAC撤销HOLD信号 ⑦ CPU释放HLDA信号,并重新控制总线
随着大规模集成电路技术的发展,DMA传送已不局限于存储器与外设间的信息交换,而可以扩展为在存储器的两个区域之间,或两种高速外设之间进行DMA传送,如右图所示。
DMA操作的基本方法 1、周期挪用 2、周期扩展 3、CPU停机方式
〖DMA传送方式〗 允许 DMA 请求? DMAC发BUS请求 CPU响应DMA 放弃BUS DMAC控制 传一个字节 放 总 线 块结束否? 放弃总线中断请求 N 放 总 线 Y 字节传送
DMA传送方式 DMA请求? 允许 DMA DMAC发BUS请求 CPU 响应 DMA 放弃 BUS DMAC控制 传一个字节 Y 块传送 块结束否? 放总线中断请求 N 块传送
DMA传送方式 允许 DMA DMAC发出BUS请求 CPU响应DMA放弃总线 DMAC 控制传一个字节 N Y 放总线 随机请求 块结束否? 放总线中断请求 Y 放总线 N 随机请求 DEMAND REQUEST
使用DMA方式从接口往内存传输一个数据块
第三节 可编程DMA控制器8237A Intel 8237A可编程DMA控制器框图 8237A的引脚信号 8237A的工作周期、时序与模式
一、Intel 8237A可编程DMA控制器框图
二、8237A的外部引脚 图7-18 8237A引脚图
8237A两种工作状态 DMA控制器是作为两种存储实体之间实现高速数据传送而设计的专用器件。它与其他外围接口器件不同,它具有接管和控制微机中系统总线(地址、数据、控制总线)的功能。对于一般的外设而言它是主控者,对于CPU而言它又是受控者。因此,DMAC在系统中有两种工作状态:被动态与主动态,可在两种不同的地位:受控器和主控器。
8237A组成说明 8237A有四个独立通道:每个通道有16位地址REG,16位字节数计数器,6位模式REG。 四个通道公用控制寄存器,状态寄存器,屏蔽寄存器,请求标志寄存器及暂存器,各寄存器均为8位。 基地址寄存器:放DMA传送RAM地址初值。 当前地址寄存器: DMA传送时内容变化,可读。 基字节数寄存器: DMA传送的总字节数。 当前字节数寄存器: DMA传送时内容变化,可读。
8237A引线说明: DREQ0~DREQ3:DMA通道请求。当外设需要请求DMA服务时,将DREQ信号置成有效电平,并要保持到产生响应信号,它们的优先级是DREQ0最高。 HRQ:总线请求。8237A输出有效的HRQ高电平,向CPU申请使用系统总线。 HLDA:总线响应。8237A接受来自CPU的响应信号HLDA,取得了总线的控制权。 DACK0~DACK3:DMA通道响应。8237A使请求服务的通道产生相应的DMA响应信号。
A0-A3:4根低地址线,双向三态。被动态时输入,CPU对8237进行初始化时访问芯片内部寄存器与计数器,4位地址说明8237片内16个端口。主动态时输出,作为20位存储器地址的最低4位。 DB0~DB7:双向三态双功能线。 被动态:数据线,CPU对8237进行初始化,或传送状态。 主动态:为地址线,作为访问存储器的地址的高8位地址,同时也作数据线;在M—M传送时,DB0~DB7作暂存数据端。 ADSTB:地址选通,输出。16位地址的高8位锁存器的输入选通。 AEN:地址允许,输出。高8位地址锁存器输出允许信号。
MEMR*:存储器读。有效将数据从存储器读出 MEMW*:存储器写。有效将数据写入存储器 IOR*/IOW*:I/O读/写信号,双向。8237A为主动态时,输出,对I/O设备进行读/写。被动态时,输入,CPU向DMAC写命令、初始化或读状态。 READY:准备好。DMA传送的S3下降沿检测到为低时,插入等待状态Sw,直到READY为高才进入第4个时钟周期S4。 EOP*:过程结束。DMA传送过程结束,输出一个低有效脉冲。外部输入低脉冲信号,则终结DMA传送。 CS*:片选。低有效时,微处理器与8237A通过数据线通信,主要完成对8237A的编程。
8237A的两种工作状态 8237A具有两种工作状态 空闲周期: 作为接口电路,受CPU控制的工作状态 有效周期: 作为DMAC控制DMA传送的工作状态 于是,引脚分成两种作用
8237A引脚的两种作用 与CPU连接 (空闲周期)的引脚 与外设连接 (有效周期)的引脚 CLK、RESET A0~A3、CS*、DB0~DB7 IOR*、IOW* HRQ、HLDA AEN、ADSTB、READY、EOP* A0~A7、DB0~DB7 IOR*、IOW*、MEMR*、MEMW* DREQ0~DREQ3、DACK0~DACK3
8237A 字计数器与地址寄存器端口号与对应操作(1) 地址、字计数器端口分配 内 F/F为字节计数标志 8237A 字计数器与地址寄存器端口号与对应操作(1) 通道 寄存器 操作 CS IOR IOW A3 A2 A1 A0 内 F/F DB0~DB7 1 基本 / 当前地址 基本 /当前字计数 当前地址 当前字计数 基本 /当前地址 写 读 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 A0 ~ A7 A8 ~ A15 W0 ~ W7 W8 ~ W15
8237A 字计数器与地址寄存器端口号与对应操作(2) 通道 寄存器 操作 A3 A2 A1 A0 内 F/F DB0~DB7 2 3 基本 /当前地址 基本 /当前字计数 当前地址 当前字计数 基本 / 当前地址 写 读 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 A0 ~ A7 A8 ~ A15 W0 ~ W7 W8 ~ W15 CS IOR IOW
操作命令与端口号对应关系表 A3 A2 A1 A0 IOR IOW 操 作 十六进制 1 0 0 0 0 1 读状态 寄存器 8 1 0 0 0 0 1 读状态 寄存器 8 1 0 0 0 1 0 写命令/控制 寄存器 1 0 0 1 0 1 非法 9 1 0 0 1 1 0 写DMA请求标志 寄存器 1 0 1 0 0 1 非法 A 1 0 1 0 1 0 写屏蔽标志 寄存器 1 0 1 1 0 1 非法 B 1 0 1 1 1 0 写模式 寄存器 1 1 0 0 0 1 非法 C 1 1 0 0 1 0 清除字节指针 F/F 1 1 0 1 0 1 读暂存器 D 1 1 0 1 1 0 复位 (总清) 1 1 1 0 0 1 非法 E 1 1 1 0 1 0 清除/屏蔽标志 寄存器 1 1 1 1 0 1 非法 F 1 1 1 1 1 0 写所有屏蔽 REG 单一位 三个软件 命令不依 赖DB上 数据 所有位
三、8237A的工作周期、时序与模式 操作时序图
(1)空闲周期SI 上电后,未编程前,还没有DMA请求,进入空闲周SI,DMA处于被动工作方式,CPU可对DMA进行编程。 内部状态变化流程图
(2)过渡状态S0 若检测到DREQ请求,DMAC即向CPU发出总线请求信号HRQ。并且,DMAC从SI状态跳入S0状态,并重复执行,直到收到HLDA信号(CPU)进入S1状态,DMAC从被动 →主动态 (3)DMA有效周期(S1 ~S4) 在CPU的回答信号HLDA到达,DMAC进入有效周期开始传送数据。 一个完整的传送周期包括S1 ,S2 ,S3 和S4四个周期,如果I/O速度跟不上,可在S3 和S4 之间插入等待周期.
a) S1 周期:更新高8位地址。AEN, A8~A15 DMAC在S1 状态发出地址允许AEN信号,将高8 位地址A8 ~A15送到数据总线上DB0~DB7上。 b) S2周期:①输出16位地址到RAM,(其它高8位 已锁存) ②向I/O发请求回答信号DACK,准备 传送数据。 c) S3周期:发出MEMR或IOR读命令,让内存或 I/O准备传送数据。 d) S4周期:发IOW或MEMR命令。
四、8237A的内部寄存器 方式寄存器格式(写B号) D7 D6 D5 D4 D3 D2 D1 D0 模式选择 随机请求传输模式 0 0 随机请求传输模式 0 0 单字节传输模式 1 非传输模式 级联传输模式 地址增量选择 地址加1 0 地址减1 1 自动预置功能选择 禁止 0 允许 1 通道选择 0 选 0# Channel 选 1# Channel 选 2# Channel 选 3# Channel 传输类型选择 0 0 校验传输 X X 写传输 读传输 非 法 D7 D6=11
控制/命令寄存器格式 MEM. 传输 D7 D6 D5 D4 D3 D2 D1 D0 DACK有效电平 低电平有效 0 高电平有效 1 低电平有效 0 高电平有效 1 DREQ有效电平 扩展写 MEM. Enable 8237A 低电平有效 不扩展写 D3=1 X 优先级类型 固定优先级 循环优先级 禁止 允许 Channel 0 地址保持不变 Disable Enable D0=0 8237A 工作 Disable 8237A 时序类型 普通时序 压缩时序 D0=1
请求寄存器格式 D7 D6 D3 D2 D1 D0 D5 D4 不用 清除DMA请求位 建立DMA请求位 1 Channel 0 清除DMA请求位 建立DMA请求位 1 Channel 0 Channel 1 Channel 2 Channel 3
屏蔽寄存器格式 D7 D6 D3 D2 D1 D0 D5 D4 不用 清除 MASK 位 建立 MASK 位 1 Channel 0 清除 MASK 位 建立 MASK 位 1 Channel 0 Channel 1 Channel 2 Channel 3 通道选择
状态寄存器格式 D7 D6 D3 D2 D1 D0 D5 D4 1: 通道 0计数结束 通道 2有DMA请求 1 通道 1 有DMA请求 1 1:通道 1计数结束 1:通道 2计数结束 1: 通道 3计数结束 通道 3 有DMA请求 1
五、8237A的编程 关于3个软件命令:与端口号有关,与DB线上的内容无关。 写C号地址:清除字节指针F/F,使将装入顺序为先LSB后MSB。 写D号地址:总清除命令,屏蔽寄存器为1,其它寄存器为0 ,软件复位。 写E号地址,清除屏蔽标志。
【编程过程】 HLDA无效时8237A接受µP编程,不管HRQ是否有效。 编程前禁止8237A:发关闭8237A命令,向8号端口(硬件设置)写04H,或对通道进行屏蔽。 用软命令发出总清(Master Clear)操作:向0DH端口执行一次写操作。 向有关通道送地址值,计数值,模式字。 送硬件设置命令字,打开8237A。 去除屏蔽准备接收DMA请求。
例:试编写程序,在内存6000H:0开始单元存放10个数据,对DMA控制器8237A进行初始化,使每一次DMA请求从内存向外部设备传送一字节数据。
ASSUME CS:CODE,DS:DATA,ES:EXTRA START:MOV AX,DATA MOV DS,AX 开始 DATA SEGMENT OUT-DATA DB 01,02,04,08,10H,20H,40H,80H,0FFH,00H DATA ENDS EXTRA SEGMENT AT 6000H EXT DB 10 DUP (?) EXTRA ENDS 初始化 将十个数据放入 6000H:0单元 清地址指针触发器 CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EXTRA START:MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX LEA SI,OUT-DATA LEA DI,EXT CLD 写通道1方式字 置通道1页面 寄存器为6 写地址低16位为0000H 写入传送的字节数 清除通道1屏蔽 结束
MOV CX,10 REP MOVSB OUT 0CH,AL ;清字节指针 MOV AL,49H ;写方式字 OUT 0BH,AL MOV AL,06 ;置地址页面寄存器 OUT 83H,AL MOV AL,0 ;写入基地址低16位 OUT 02H,AL MOV AX,0AH ;写入传送的字节数10 OUT 03H,AL ;先写低字节 MOV AL,AH OUT 03H,AL ;后写高字节 MOV AL,01 ;清通道屏蔽,启动DMA OUT 0AH,AL
MOV AH,4CH INT 21H CODE ENDS END START