8.3接口电路一.概述1.接口电路的作用CPU数据→输出接口电路→输出设备CPU←输入接口电路←输入设备数据接口:是CPU与外部设备交换信息的中转站I/O设备与总线之间的连接输出接口电路输出设备输入接口电路输入设备系统总线I/O接口电路2.接口电路的功能应具有数据暂存功能应有端口地址译码器(便于使用IN,OUT指令读写数据)与外设之间有联络功能有中断管理能力有数据转换功能(并→串,串→并)3.关于端口的概念“端口”是接口电路中,能与CPU交换信息(使用IN,OUT)的寄存器。端口分类:数据口:存放CPU向外设输出或外设输入的数据。控制口:存放控制信息--控制接口电路、外设的工作。状态口:存放状态信息反映外设的状态。注意:接口电路必须具有数据口。注:每个端口,系统都为它编了一个地址,系统只要给出某个地址,通过译码电路,就能找到相应的I/O接口电路中的端口寄存器。问题:系统给出的地址是内存单元地址还是I/O端口寄存器的地址?解决方案:合理安排I/O端口寄存器的编址方式。4.端口的编址方式存储器映像方式把端口和存储单元等同看待,统一编址。特点:凡访问存储单元的指令都可访问I/O端口,端口地址占用存储空间。I/O端口独立编址特点:I/O端口不占用存储空间,CPU要有专用的I/O指令。5.PC系列机的端口编址PC系列机采用端口独立编址;从8088~奔腾微处理器,设计时用A15~A0低16位地址寻址I/O端口;所以,CPU的端口寻址能力为216=65536个;基于微处理器的PC系列,实际使用A9~A0做I/O地址;所以,PC系列机I/O端口地址最多为210=1024个。这1024个口地址,系统本身(主板上,以及常规I/O接口)已经占用了一部分。端口地址(I/O空间)没有分段的概念。二.最常用的I/O指令1.直接寻址I/O指令设n为8位端口地址INAL,n;口地址为n的端口中取数→ALOUTn,AL;AL内容→口地址为n的端口寄存器INAX,n;(n)→AL,(n+1)→AHOUTn,AX;AL→n口,AH→n+1口如:INAL,61HOUT61H,AL2.DX间址的I/O指令当口地址n8位二进制数时,用DX间址注意:I/O指令只能在端口和AL,AX,EAX之间交换信息,用DX间址,但不能使用方括号,即不能写成:INAL,[DX]。INAL,DX;[DX]的端口内容→ALOUTDX,AL;AL→[DX]的端口寄存器INAX,DX;[DX]→AL,[DX+1]→AHOUTDX,AX;AL→[DX],AH→[DX+1]的端口寄存器如:MOVDX,3F8HINAL,DX;从3F8H端口取数→AL三.微机系统与I/O端口的信息交换微机系统与I/O端口的信息交换有四种方式:无条件传送查询方式中断方式DMA方式采用何种方式与接口的硬件电路有直接关系1.无条件传送输入接口:八个三态门地址译码器IOR数据线外设8入出控控=0,出=入控=1,出为高阻入出控入出控控=1,出=入控=0,出为高阻…执行IN指令之前,外设数据已经准备好。输出接口锁存器地址译码器IOW数据线外设8QCPD…...D7D0执行OUT指令时:AL内容→数据线,口地址→地址线上,IOW=低,把数据锁存到锁存器中。2.查询方式用查询方式交换信息,必先了解外设的状态。查询方式输入流程从状态口读取状态信息数据准备好?执行IN指令,取出数据YN从状态口读取状态信息外设空闲否?执行OUT指令,输出一个数据YN查询方式输出流程查询方式输入接口示意图地址译码器地址总线IOR锁存器(8)三态缓冲器(8)CPU数据线数据输入设备输入选通信号RDQ+5V状态标志寄存器IOR地址译码器数据口选中接数据线D7位查询式输入核心程序设状态口地址=200H数据口地址=201HRSCAN:MOVDX,200HINAL,DXTESTAL,80HJZRSCANMOVDX,201HINAL,DX查询式输出接口示意图“0”为空闲锁存器(8)数据IOW地址译码器地址总线IOR数据总线数据口选中ACK输出设备QD+5V状态标志状态口选中接数据线D0位R查询式数据输出核心程序设状态口地址=200H=数据口地址TSCAN:MOVDX,200HINAL,DXTESTAL,1JNZTSCANMOVDX,200HMOVAL,某数OUTDX,AL3.中断控制方式•在有多个外设的系统中,多个外设要求CPU为它服务是随机的•若采用查询方式工作,就不能保证系统实时地对外设的请求作出响应•为了提高CPU的效率,使系统有实时性能,导致了中断处理技术的产生特点:•在外设没有作好数据传送准备时,CPU可执行与传送数据无关的其它指令•当外设作好传送准备后,主动向CPU请求中断•若CPU响应这一请求,则暂停正在运行的程序,转入中断服务程序,完成数据传送•待服务完毕后,自动返回原来运行的程序4.直接存储器存取(DMA)方式为什么要有DMA?什么是DMA?特点:用硬件实现在外设与内存间直接进行数据交换,而不通过CPU•数据传送速度的上限就取决于存储器的工作速度•速度快8.48254定时器/计数器计算机中的定时和延时控制、对外部事件或信号的计数软件方法固定时间的硬件定时可编程的硬件定时计算机系统中采用可编程定时/计数器I8253和I82548254内部集成了3个16位的计数器,每个计数器有6种工作方式,计数初值可设定为二进制或BCD码。最高工作频率10兆。一.8254内部结构(24脚)数据总线缓冲器读写控制控制字寄存器0号计数器1号计数器2号计数器RDWRA0CSA1D7~0GATE0OUT0CLK0GATE1OUT1CLK1GATE2OUT2CLK2数据总线缓冲器读写控制控制字寄存器0号计数器1号计数器2号计数器RDWRA0CSA1D7~0GATE0OUT0CLK0GATE1OUT1CLK1GATE2OUT2CLK2数据总线缓冲器:完成和系统数据线的配接。对外有8条数据线D7~08254的内部结构数据总线缓冲器读写控制控制字寄存器0号计数器1号计数器2号计数器RDWRA0CSA1D7~0GATE0OUT0CLK0GATE1OUT1CLK1GATE2OUT2CLK2读写控制模块:选择芯片内部的控制寄存器和计数器,在读写命令的控制下对选中的端口进行读写操作。对外有5条引线。8254的内部结构CS计数初值写入计数器#000001操作计数初值写入计数器#100011计数初值写入计数器#200101向控制字寄存器写控制字00111读计数器#0当前计数值01000读计数器#1当前计数值01010读计数器#2当前计数值01100011101XXXX01XX1无操作无操作禁止表7.18254内部寄存器读/写操作RDWRA1A08254的内部结构数据总线缓冲器读写控制控制字寄存器0号计数器1号计数器2号计数器RDWRA0CSA1D7~0GATE0OUT0CLK0GATE1OUT1CLK1GATE2OUT2CLK2控制寄存器:寄存CPU对其初始化编程时写入的控制字,以决定计数器的工作方式和并设置读出命令。8254的内部结构数据总线缓冲器读写控制控制字寄存器0号计数器1号计数器2号计数器RDWRA0CSA1D7~0GATE0OUT0CLK0GATE1OUT1CLK1GATE2OUT2CLK2计数器:每个计数器对外有3条线GATE~控制信号CLK~计数脉冲输入OUT~计数器输出8254的内部结构口地址译码器A9A2AEND7~D0IORIOWA1A0D7~D0RDWRA1A0CS8254二.8254与系统总线的连接I/O口地址分2段A9~A2参加译码,译码输出负脉冲。使CS=0,选中8254A1,A0直接与芯片A1,A0相连,选择片内寄存器执行IN时从选中的内部寄存器读执行OUT时向选中的内部寄存器写三.8254内部寄存器/计数器口地址在CS=0前提下A1A0选中000#计数器011#计数器102#计数器11控制寄存器设8254与系统总线如上图联接:口地址=40H~43H,“选中”8254,则0#~2#计数器口地址=40H~42H,控制口地址=43H。口地址=2FCH~2FFH,“选中”8254,则0#~2#计数器口地址=2FCH~2FEH,控制口地址=2FFH。四.计数器内部结构示意图内部数据线计数初值寄存器(16位)减1计数器(16位)计数值锁存器(16位)锁存命令GATECLKOUT内部数据线初始化编程时:计数初值→计数初值寄存器→减1计数器内部数据线计数初值寄存器(16位)减1计数器(16位)计数值锁存器(16位)锁存命令GATECLKOUT内部数据线计数器的内部结构当GATA=1时,CLK的下降沿使计数器减1,当计数值减到0(或某个值—由工作方式确定)时,OUT有输出。内部数据线计数初值寄存器(16位)减1计数器(16位)计数值锁存器(16位)锁存命令GATECLKOUT内部数据线计数器的内部结构计数初值=fclk/fout收到锁存命令后,当前计数值→计数值锁存器(以便读出检查),而计数器仍然做减1计数内部数据线计数初值寄存器(16位)减1计数器(16位)计数值锁存器(16位)锁存命令GATECLKOUT内部数据线计数器的内部结构作用:选择一个计数器,确定工作方式,并规定初值的写入顺序和计数初值(一串0,1代码)的数制。五.8254命令字/状态字D7D6D5D4D3D2D1D0计数器选择读写方式选择工作方式选择数制选择D7D6=00选择0#计数器,=01选择1#计数器=10选择2#计数器,=11标志该命令字是“读出命令”1.方式选择命令字D5D4=00标志该命令为“锁存命令”=01初值写入时,只写低8位,高8位自动补0;计数值读出时,只能读低8位=10初值写入时,只写高8位,低8位自动补0;计数值读出时,只能读高8位。=11初值写入/计数值读出的顺序为先低8位,后高8位。D7D6D5D4D3D2D1D0计数器选择读写方式选择工作方式选择数制选择8254的命令字和状态字D3D2D1选中的计数器工作在000方式0001110211310041015D0=0,计数初值为二进制数,D0=1,初值为BCD码数。D7D6D5D4D3D2D1D0计数器选择读写方式选择工作方式选择数制选择8254的命令字和状态字2.锁存命令(D5D4=00标志该命令为“锁存命令”)D7D6为锁存对象。=00,锁存0#当前计数值=01,锁存1#当前计数值=10,锁存2#当前计数值计数器选择00D7D6D5D4D3D0D7D6≠11D5D4=008254的命令字和状态字3.读出命令读出命令是多通道的锁存命令,一条命令可以锁存3个计数器的计数值、计数器状态。110D7D6D00:锁存当前计数值0:锁存计数器状态1:选择0#计数器D7D6D0=110是读命令1:选择1#计数器1:选择2#计数器8254的命令字和状态字4.状态字与方式选择命令字相同D7D6D5D00:计数初值已装入计数器1:计数初值未装入计数器0:OUT脚为低电平1:OUT脚为高电平8254的命令字和状态字CPU对8254的初始化编程例:设8254的口地址为40H~43H,要求2#计数器工作在方式3,计数初值=4000,写出2#的初始化程序段。1.对8254一个计数器的初始化编程步骤:向控制寄存器写入方式选择命令字目的:选择一个计数器,并确定其工作方式和计数值(计数初值)的读/写顺序。向选择的计数器写入计数初值。注意:如果方式选择命令字D0=0,则初值应是二进制,否则初值应是BCD码数。解1:设初值为二进制,初值写入顺序为先低8位后高8位。MOVAL,10110110BOUT43H,ALMOVAX,4000OUT42H,ALMOVAL,AHOUT42H,AL解2:设初值为二进制,写入顺序为仅写高8位。MOVAL,10100110BOUT43H,ALMOVAL,40OUT42H,AL注意:解2是错误的,因为:4000=0FA0H,其低8位不等于0