文章目录
- 8255A
- 芯片组成
- 外设接口
- 三个端口
- 两组端口
- 关于C口(★)
- 内部逻辑
- CPU接口
- 8255A的控制字(★)
- 位控字(D7=0)
- 方式选择控制字(D7=1)
- 8255A的工作方式
- 工作方式0(基本输入/输出方式)(★)
- 工作方式1(选通输入/输出方式)
- 工作方式2(双向传输方式)
- 补充(★)
8255A
8255A包含3个带锁存或缓冲的数据端口,可与外设并行进行数据交换。
- 含3个独立的8位并行输入/输出端口,各端口均具有数据的控制和锁存能力,即A端口(通道)、B端口(通道)、C端口(通道)
- 也可联合使用,构成单线、双线或三线联络信号的并行接口,此时,C端口完全服务于A、B端口。
- 可通过编程设置各端口的工作方式和数据传送方向(入/出/双向)。
芯片组成
外设接口
三个端口
- 端口A:PA0~PA7(8位)
A组
,工作方式0、1、2
常作数据端口,功能最强大。 - 端口B:PB0~PB7(8位)
B组
,工作方式0、1
常作数据端口 - 端口C:PC0~PC7(8位)
A组
控制高4位PC4~PC7
,B组
控制低4位PC0~PC3
,仅支持工作方式0
可作数据、状态和控制端口;分两个4位,每位可独立操作
两组端口
A组:
- 端口A(PA0~PA7)
- 端口C的高4位(PC4~PC7)
B组:
- 端口B(PB0~PB7)
- 端口C的低4位(PC0~PC3)
关于C口(★)
-
C端口被分成两个4位端口,两个4位端口只能以方式0工作,可分别选择输入或输出
-
在控制上,C端口上半部和A端口编为A组,C端口下半部和B端口编为B组
-
当A和B端口工作在方式1或方式2时,C端口的部分或全部引脚将被用来为A、B端口输出控制信号或输入状态信号。
内部逻辑
三个端口在内部分成两组控制
A组控制电路控制A端口和端口C的上半部分
B组控制电路控制B端口和端口C的下半部分
- 根据CPU的命令字控制8255A的工作方式,每组控制电路从读写控制逻辑接受各种命令,从内部数据总线接受控制字并发出命令到各自相应的端口。
- 根据CPU的命令字对端口C的每一位实现按位置位(1)或复位(0)。
CPU接口
连接系统端的主要引线:
D0~D7
——控制字输入端口CS
——片选信号RD、WR
——决定内外部总线上信息传送的方向A0、A1
——端口寻址RESET
——复位信号,接系统总线的RESET
,使8255A复位
A1 | A0 | 选择 |
---|---|---|
0 | 0 | 端口A |
0 | 1 | 端口B |
1 | 0 | 端口C |
1 | 1 | 控制寄存器 |
8255A的控制字(★)
2个控制字:
- 方式选择控制字(方式控制字):确定三个端口的工作方式,给出标识位。
- 通道C置位复位控制字(位控字):控制C口的某一位的输出,或用于设置
INTE
位。
两个控制字共用一根地址线,即A0
、A1
选择是控制器还是端口。
使用D7
位判断控制字,即选择方式控制字和位控字。
D7=1
表示为方式选择控制字(方式控制字)
D7=0
表示为通道C置位/复位控制字(位控字)
位控字(D7=0)
-
通道C 置位 / 复位控制字用于对单个位的操作。
-
端口C的每一位都可以通过控制寄存器写入 置位 / 复位控制字,使之置位(输出为1)或复位(输出为0)。
-
C口的控制靠写入控制字,而不是直接写入C口。
-
D6
,D5
,D4
——未用 -
D3
,D2
,D1
——选择C口某一位 -
D0
——置位 / 复位
方式选择控制字(D7=1)
位 | 功能 |
---|---|
D7 | 必须是1 |
D6,D5 | A组方式选择(0、1、2) |
D4 | (PA0~PA7)输入、输出 |
D3 | (PC4~PC7)输入、输出 |
D2 | B组方式选择(0、1) |
D1 | (PB0~PB7)输入、输出 |
D0 | (PC0~PC3)输入、输出 |
8255A的工作方式
- 方式0:基本输入输出方式,适用于无条件传送和查询方式的接口电路。
- 方式1:选通输入输出方式,适用于查询和中断方式的接口电路。
- 方式2(仅A口):双向选通传送方式,适用于与双向传送数据的外设。适用于查询和中断方式的接口电路。
链接1
链接2
工作方式0(基本输入/输出方式)(★)
-
A口、C口的高4位,B口、C口的低4位 可分别定义为输入或输出,各端口互相独立,故共有16种不同的组合。
-
8255相当于三个独立的8位简单接口。
-
各端口既可设置为输入口,也可设置为输出口,但不能同时实现输入及输出。
-
定义为输出的口均有锁存数据的能力,而定义为输入的口则无锁存能力。
-
在方式0下,C口还可以通过位控字按位进行置位和复位。
-
C端口即可以是一个8位的简单接口,也可以分为两个独立的4位端口。
时序:
- A0 = 1、A1 = 1,D0~D7写入控制字
- 改变RD#和WR#,选择读写
- 对于输出:通过A0、A1选择A、B、C端口,通过D0~D7写入数据
- 对于输入:通过A0、A1选择A、B、C端口,通过D0~D7读出数据
应用:
- 用于连接简单外设。
- 适用于:无条件输入输出方式。查询输入输出的方式:把A、B口作为8位数据的输入或输出口,C口的高/低4位分别定义为A、B口的控制位和状态位。
工作方式1(选通输入/输出方式)
-
A、B口作输入或输出口,C口的部分位固定用作A、B口的选通控制信号。
-
每一个8位数据端口(A、B)均可设置为输入、输出方式,且两种工作方式均可锁存,而且可以进行中断控制。
-
输入时
PC3(INTR)
、PC4(STB#)
、PC5(IBF)
,输出时PC3(INTR)
、PC6(ACK#)
、PC7(OBF#)
三位控制端口A状态。 -
输入时
PC2(STB#)
、PC1(IBF)
、PC0(INTR)
, 输出时PC2(ACK#)
、PC1(OBF#)
、PC0(INTR)
三位控制端口B状态。 -
未被用到的C端口,都可用位控字随便设置输入输出。
-
A、B口的
INTR
可输出中断到CPU,INTE
可控制中断使能失能。 -
对
INTE
的可通过写入端口C的对应位。输入时端口A的INTE
对应PC4
,端口B的INTE
对应PC2
。输出时端口A的INTE
对应PC6
,端口B的INTE
对应PC2
。
数据输入 | |
---|---|
STB# | 数据选通信号,表示外设已经准备好数据。将输入设备送来的数据锁存在输入锁存器中。 |
IBF | 输入锁存器满,表示已经接收到数据,由STB的前沿产生,CPU的IN指令清除此信号。 |
INTR | 中断请求信号,由STB后沿产生,要求CPU读取数据。 |
INTE | 中断允许位,允许INTR发出中断请求。当INTE = 1和IBF位高电平时允许INTR请求。 |
数据输出 | |
---|---|
OBF# | 输出缓冲器满信号,通知外设取走数据 。 |
ACK# | 外设响应信号,表示已从数据段口取走数据。会使OBF变成无效的高电平。 |
INTR | 通知CPU输出下一个数据,ACK上升沿产生(常接到8259A)。 |
INTE | 中断允许位,INTE = 1和OBF为高电平时,允许产生INTR信号。 |
输入 | |
---|---|
输出 | |
---|---|
时序:
应用:
- 主要用于中断控制方式下的输入输出。
- C口除部分位用作选通信号外,其余位可工作在方式0下,作为输入或输出线。特别是A、B均为方式1时仅使用C口的6条线,余下二条线可作为单独的输入输出线,用程序指定其数据传送方向。
工作方式2(双向传输方式)
-
外设通过端口A即可向CPU发送数据,又能从CPU接收数据。
-
工作方式2只适用于端口A,端口B仍按方式0或方式1工作。
-
端口A可工作于双向方式,端口C的PC7~PC3位作为端口A的控制/状态信号端口,PC2~PC0用于B组。
-
端口A的输入/输出均有锁存功能。在方式2工作状态下,端口A既可工作于查询方式,又可工作于中断方式。
-
读数据时,WR的下降沿使得中断信号intr关闭,屏蔽外界中断,对应的是箭头1
-
读数据的上升沿2,将数据送入到OBF中,OBF处于下降沿,表示数据已经保存到输出缓存区,即输出缓存区已经满了。OBF的下降沿使得ACK的成功接收数据,处于下降沿,处于有效位,对应箭头3
-
ack的上升沿,会打开intr的中断,使得中断有效。可以继续接受外部的数据。
-
写数据时,stb低电平有效,送来的数据已经保存在锁存器中,其下降沿使得IBF,输入数据缓冲区产生上升沿,对应的是箭头7
-
stb上升沿,打开中断,使得intr高电平有效,同之cpu调用中断处理程序,中断处理程序发出读指令RD,低电平有效,读出IBF中的数据,使得IBF从高电平变为低电平,数据清空,对应箭头9
时序:
-
地址在读数据以前就一定要稳定,并且前后都要有一定的保险时间,对应的就是CS,A1,A0
-
D0~D7表示的是总线上获取的数据,紧紧跟在RD后,RD是在下降沿写入,在上升输出到总线上
-
主要分清两种情况,一种是有外界事件引起的,一种是由当前的状态变化引起的。
应用:
- 可用于中断控制输入输出方式。
- 当A口工作于方式2时,B口可工作于方式1(此时C口的剩余位都用作B口选通控制线);B口也可工作于方式0(此时C口的剩余位也只能用作方式0下的输入输出线)。
补充(★)
对端口C的数据输出有两种办法:
-
通过端口C的I/O地址:向C端口直接写入字节数据。这一数据被写进C端口的输出锁存器,并从输出引脚输出,但对设置为输入的引脚无效
-
通过控制端口:向C端口写入位控字,使C端口的某个引脚输出1或0,或置位复位内部的中断允许触发器