-
打算整理汇编语言与接口微机这方面的学习记录。本部分介绍可编程并行接口芯片8255A&&可编程定时器、计时器芯片8253、8254,增加了一些具体系统的设计案例。
-
参考资料
- 西电《微机原理与系统设计》周佳社
- 西交《微机原理与接口技术》
- 课本《汇编语言与接口技术》王让定
- 小甲鱼《汇编语言》
Part1 8255A
1. 有关并行接口
第一章就已经提过,外设和CPU之间不能直接进行数据交换,要增加接口电路,并行接口就是数据在多根线上同时传送。并行接口的特点:
- 具有端口寄存器
- 与CPU和外设进行联络的控制端
- 中断控制端
- 可编程器件提供多种工作方式供编程选择。
常用的并行接口芯片是Intel 8255A。串行接口芯片是8250和8251。
2. 8255A的结构及其功能
-
PA0~PA7:端口A,连接外设
-
PC0~PC7:端口C,连接外设
-
PB0~PB7:端口B,连接外设
这几个端口输入还是输出是可编程的。
-
D0~D7:数据总线(双向),连接CPU
-
VCC、GND、CSfei、RDfei、WRfei耳熟能详了
-
工作方式控制寄存器,可以OUT数据线写,控制芯片工作方式
-
A0、A1:端口地址线,连接CPU
有四个端口,A B C端口+ 工作方式控制寄存器
CSfei A0 A1 端口 0 0 0 PA 0 0 1 PB 0 1 0 PC 0 1 1 内部控制寄存器 1 / / / 因此也可以看出8086系统中,8255A的A1接地址线A2,A0接A1,高12位参加译码。
如果地址是偶地址,地址线A0也参加译码,D0D7连接低八位数据线。奇地址则BHEfei参加译码,D0D7连接高8位数据线。
-
RESET,复位端,高电平有效
设备复位应当早于CPU复位。
3. 8255A工作方式及其控制字
3.1 工作方式
-
工作方式0:无联络信号的输入/输出方式,等效于无条件输入输出方式,PA PB PC三个端口均可工作在工作方式0。
-
工作方式1:有联络信号的输入输出方式,相当于查询法、中断法。只有PA和PB可工作在工作方式1。PC口来作联络信号线(A组使用高四位的PC,B组使用低四位PC)
-
工作方式2:有联络信号的双向方式,准双向(半双工),只有PA口可以工作在工作方式2。PB PC用于联络。
- 注意,工作方式1是单向的。
- PC可以进行位管理,也就是一位一位的赋值,而PB PA没有这个功能
3.2 控制字
就是操作8255A内部的工作方式寄存器,类似于8259A的操作:
-
首先CSfei=0,A0 A1=1 1,选中该寄存器端口
-
D7=1,说明要进行工作方式的选择,也就是在写控制字
如果D7=0,8255A认为正在进行PC端口的位管理。此时D6D4无效,D3D1编码PC的每一位。D0位表示将编码PC的位赋予D0的值。
-
D6~D5:控制A组工作方式
编码 方式 0 0 方式0 0 1 方式1 1 x 方式2 -
D4:设置A组的输入输出方向,0为输出,1为输入。
-
D3:控制A组的PC7~PC4的方向,0为输出,1为输入。
-
D2:控制B组的工作方式(只有两种工作方式),0 方式0,1 方式1
-
D1:B组中PB口的方向,0 输出,1 输出
-
D0:控制B组的PC3~PC0的方向,0为输出,1为输入。
下面讲了P312页的10.3:
-
A输出,B输入,工作在方式1。实现端口C低四位输入的值从高4位输出。
可知控制字 D7~D0 应为:1000_0011
-
;选中控制寄存器,写入控制字 MOV DX, 303H MOV AL, 83H OUT DX, AL ; 选中PC端口 MOV DX, 302H IN AL, DX MOV CL,4 SHL AL,CL ; 左移4次,低四位移到高四位了 OUT DX, AL; 输出PC端口值
3.3 工作方式1
这部分好复杂啊,但是不是很难懂。先听一遍再慢慢梳理。
再详细讲讲工作方式1。此时三个端口的信号线分成了A B两组。PC7PC4用作A组的联络信号,PC3PC0用作B组联络信号。
A. 输入
输入:来看下面的图,先以PB端口为例,(其实PA PB两者除了控制字其他工作方式都一样)
-
结合下面图片中的时序来看。
-
数据线PB0~PB7上有数据时,还要CPU知道,而外设通过STBfei将有效数据信号(选通信号,一个负脉冲,接在PC2信号线上)到来后,此时8255A将数据拿进来存放到输入缓冲器。
-
如果输入缓冲器满了,则应该告知设备不能再发送数据了,所以此时IBF信号(缓冲器满信号,通过PC1输出)置于高电平,告知设备。
注意A组和B组各有一个输入缓冲器。
-
CPU一方可以通过两种方式得知输入缓冲器满了。
-
查询法:可以通过RD端口读IBF(其实是读PC端口状态,看PC1),如果IBF=1,则可以实施IN指令读走数据。IBF变低,此时8255A就可以继续接收外设的数据。
-
中断法:B组通过PC0-INTRB线向CPU发送中断信号
需要当8255A处于中断允许状态:见上图结构的INTEB=1则中断允许。RESET时INTEB清0。
当IBFB和INTEB同时为1,则通过PC0发送中断请求(1,高电平了)。CPU响应后进入中断服务子程序读出数据,再IRET返回。
下面看看INTE如何编程控制:
MOV DX,303H MOV AL,1XXXX110B;可以当做86H,也就是无效位都当0 OUT DX,AL ;对PC2位置1,达到INTEB=1目的 MOV AL,0xxx0101B OUT DX,AL;借助<位管理>达到目的 ...;一个小循环,等待中断 ; 中断产生,CPU响应进入服务程序 ; 读出数据 ; IRET返回
-
PA输入与上面类似。只不过用到的硬件是另一组。值得注意的是,A组的中断法那一步中,输出的INTR连接的是PC3(理论上分给了B组)。这是因为A组分到的四根C线,两根用于方式1的输入信号通讯(STB和IBF信号),两根用于方式1的输出信号通讯,已经用光了。这也是PB端口不能工作在方式2的原因,线不够用了。
A组工作在方式1富余的PC6和PC7,可以作为两根单独的IO线来使用。
还有一点,A组的中断屏蔽触发器INTEA设置的位管理还有一点不同:可见输入输出的位管理的相应位不同。
B. 输出
输出:先看图
-
当CPU将数据输出到PA端口,输出缓冲器满,8255A通过OBFfei端口低电平通知输出设备缓冲器满,同时OBFfei作为输出设备的选通信号(STBfei)。
-
设备收到选通信号,回答ACKfei信号(一个负脉冲),8255A收到后,OBFfei就又变高了。
PC7:OBFfei
PC6:ACKfei
-
如何得知输出缓冲器的情况?应当通过测试OBFfei信号是高电平来知道它是空的。这是查询法。
-
中断法则8255A通过PC3(A组)输出INTRA高电平信号。这个信号的产生过程与前面类似:
- 编程设置INTEA为1,允许中断。
- 当OBFfei为1(空),则向中断控制器 8259A/CPU 发送中断
-
与输入对称。空闲的PC5和PC4充当IO信号线。
3.4 工作方式二
只有PA端口可以工作在工作方式2:双向方式。这就是方式1中A组输入和输出的综合。