- 计算机与外设之间如何通过接口传送数据(非DMA)
- 典型接口芯片
- 8255可编程并行接口
- 内部结构与外部引线
- 8255的控制字
- 8255的工作方式
- 8255的寻址及连接使用
- 8253 可编程定时器
- 外部引线及功能
- 六种工作方式
- 控制字
- 连接与初始化程序
- 级联使用(关键)
- 8255可编程并行接口
计算机与外设之间如何通过接口传送数据(非DMA)
非中断方式:
中断方式:单向【OBF:Output Buffer Full | IBF: Input Buffer Full】
- 输出接口向CPU发送中断请求 INTR;CPU向输出接口中写入数据
- 当输出接口的缓冲区满以后,OBF置为0,外设将数据从输出接口中取走
- 外设向输出接口发送ACK信号,表示数据已接收,输出接口再向CPU发送INTR,OBF置为1,进入下一个循环
- 输入接口向外设发IBF信号(置为0,表示输入缓冲区不满),外设收到后向输入接口写入数据,然后IBF置为1
- 当输入接口的缓冲区满以后,向CPU发送中断请求,CPU将数据从输入接口中取走
- 进入下一个循环
中断方式:双向
典型接口芯片
8255可编程并行接口
三种工作方式
内部结构与外部引线
-
对于外设:分为ABC三个口,A、B、C口都是八根线。
- A口:工作在方式012
- B口:工作在方式01
- C口:工作在方式0;高低四位可以分别配置,支持位操作
-
对CPU:数据线、地址线、控制线、片选线、复位线
-
8255内部有两个数据线,对应4个接口地址
-
如下:
00 A口寄存器 01 B口寄存器 10 C口寄存器 11 控制字
-
-
分组管理:
A口和C口的上半 ⇒ A组
B口和C口的下半 ⇒ B组
C口只能工作在方式0,输入时用三态门,又没有缓冲区寄存器,自然没有锁存能力
8255的控制字
本质:8255内部的一个寄存器,接口地址为 A1A0=11
有两种作用
- 首位为1:设置8255的工作方式
- 首位为0:对C口进行位操作
8255的工作方式
方式0:
方式1:
A口工作在方式1时:借用PC4和PC5用作输入,PC6和PC7用所输出。既然在方式1只会用作输入和输出,只会用到两条线,为什么这里要分开设置呢,为的是设置方式2(输入输出同时有效)的时候可以方便一些。
我们知道:8255有四个接口地址,分别对应8255内部的四个寄存器:ABC口寄存器与控制字寄存器。
ABC口寄存器为8位,控制着每一个口对应八根线的高低电平。
我们知道:A口工作在方式1的时候,会向C口借PC7/6或者PC4/5两根线。
现在设想下面这种情况:我们想要知道此时8255的输出缓冲区是或否为满,那么我们需要读哪个状态信号呢,显然是OBF【对应C口寄存器的第七位】而不是ACK【对应C口寄存器的第六位】。那么ACK既然读了也没用,几乎一直出于1的状态,那么C口寄存器的第六位的作用就丧失了,所以我们赋予该为全新的意义:表示中断是否允许。
方式3:
8255的寻址及连接使用
寻址与读写时序
数据在STROBE的上升沿写入,同时BUSY置为高,写入完成后发送ACK负脉冲
方式0,程序查询方式:
此处初始化A口为方式0的输出,C口高四位为输出:PC6;第四位为输入 PC1
- 忙检测:读取PC1,即C口寄存器的第一位
MOV DX,AL
虽然写入的是8位数据,但是C口的高八位是输出模式,所以允许往里面写数据(好把写入的数据送出去),而C口的低八位是输入模式,不允许往里面写数据(否则读到的数据就乱了)。所以在执行MOV DX,AL
的时候,只会把PC6置0,不会影响到PC1
忙检测+送数据+生成负脉冲
方式1,程序查询方式:
当数据被写入时,输出缓冲区满了,OBF产生下降沿,经过单稳触发器,产生一个1us的负脉冲,作为STROBE信号,所以在软件中,STROBE的负脉冲就无须自己生成了。
方式1,中断方式:
中断处理程序
由于是中断方式,检测忙信号是由中断控制器执行的,所以在中断处理程序中忙检测也不用写了。
8253 可编程定时器
外部引线及功能
每个定时器:(本质是减计数器)
- 时钟输入、门控输入、输出
- 三个寄存器:初值、减一、锁存
由于减一寄存器是内部寄存器,不需要给接口地址,初值寄存器和锁存寄存器分别只写和只读,所以可以共用一个接口地址
因此,每个寄存器占用一个接口地址,加上一个控制寄存器,8255共占用4个接口地址
六种工作方式
方式0:计数结束产生中断
方式1:可编程单稳(把一个沿变为一个负脉冲)
生成一个持续nT的负脉冲【方式0严格来讲不算负脉冲】
方式2:频率发生器
方式3:方波发生器
生成周期为nT的负脉冲或方波
方式4:软件触发选通
方式5:硬件触发选通
间隔nT后生成一个负脉冲
控制字
格式:
连接与初始化程序
例一:
例二:
例三: