1.14k likes | 1.4k Views
5.2.3 8259 A 的命令字. 8259 A 有7个命令字( ICW1、ICW2、ICW3、ICW4 和 OCW1、OCW2、OCW3), 但只有2个命令端口。 为了能够区别,8259 A 设计者采用了对不同命令字分配 不同的端口 地址以及按规定 顺序 写命令字相结合的办法。即命令按指定的命令端口写入(用 A0 指定为偶地址或奇地址),若同一端口需写入多个命令字时,则按规定的顺序写入,或以 特征位 标记。 8259 A 的命令字分初始化命令字和操作命令字。. CS. RD. WR. A0. 功能. 8259 A 端口. PC/XT 机端口. 0. 0.
E N D
5.2.3 8259A的命令字 • 8259A有7个命令字(ICW1、ICW2、ICW3、ICW4和OCW1、OCW2、OCW3),但只有2个命令端口。 • 为了能够区别,8259A设计者采用了对不同命令字分配不同的端口地址以及按规定顺序写命令字相结合的办法。即命令按指定的命令端口写入(用A0指定为偶地址或奇地址),若同一端口需写入多个命令字时,则按规定的顺序写入,或以特征位标记。 • 8259A的命令字分初始化命令字和操作命令字。
CS RD WR A0 功能 8259A端口 PC/XT机端口 0 0 1 0 读IRR,ISR或查询字 偶地址 20H 0 0 1 1 读IMR 奇地址 21H 0 1 0 0 写ICW1,OCW2,OCW3 偶地址 20H 0 1 0 1 写OCW1,ICW2,ICW3,ICW4 奇地址 21H 0 1 1 × 无操作 1 × × × 无操作 8259A寄存器及I/O端口的识别 表 8259A读写操作及地址
由上图可以看出,A0是8259A两组内部寄存器的选择信号输入引脚,决定了8259A的端口地址。由上图可以看出,A0是8259A两组内部寄存器的选择信号输入引脚,决定了8259A的端口地址。 • A0=0:ICW1、OCW2、OCW3; • A0=1:ICW2~ICW4、OCW1。
(1) ICW1 • ICW1的格式如下。设置请求的触发方式和芯片数目。
其中: • D0位决定是否需要初始命令字ICW4(IC4):D0=1,需要ICW4,对16位以上微机一般该位都写1;D0=0,不需要ICW4。 • D1位决定使用方式(SNGL):D1=l,为单片使用;D1=0,为多片级联方式使用。 • D3位决定电平触发方式(LTIM):D3= 0,为边沿触发;D3= l,为电平触发。 • D7、D6、D5、D2这4位只对8位微机(8080/8085)有效,故写0。 • 8259A为了判断IRi上有无外部设备提出中断请求,设有两种检测方法供选择:电平触发和边沿触发。
① 电平触发方式 • 在IRi输入线上检测出一个高电平,并且在第一个脉冲到来之后维持高,就认为有外设提出中断请求,并使IRR相应位置1。电平触发方式提供了重复产生的中断,用于需要连续执行子程序直到中断请求IR变低为止的情况。这种方式允许对中断请求线按“或”关系连接,即若干个中断请求用同一个IRi输入。 • 但应注意,若只要求产生一次中断,则应在CPU发出EOI命令之前或CPU再次开放中断之前,必须让已响应的中断请求置为低电平,以防止出现第二次中断。
② 边沿触发方式 • 当在IRi输入端检测到出低到高的上跳变时,且正电平保持到第一个INTA# 到来之后。8259A就认为有中断请求。 • 两种触发方式中如果在应答到来之前IRi变“低”,则已置位的IR位又被复位,相应的ISR位也不能建立,即:请求不能被响应。
例l:若8259A采用电平触发,单片使用,需要ICW4,则程序段为:例l:若8259A采用电平触发,单片使用,需要ICW4,则程序段为: • MOV AL,1BH ;ICW1的内容为00011011B • OUT 20H,AL ;写入ICW1的 端口(A0=0) • ICW1命令除了上述作用之外,实际上它是对8259A进行复位(8259A无RESET引脚),因为执行ICW1命令会使中断请求信号边沿检测电路复位,使它仅在IR信号由低变高时,才能产生中断;ICW1命令清除中断屏蔽寄存器,设置完全嵌套方式的中断优先级排队,使IRQ0最高,IRQ7最低。
(2) ICW2 • ICW2的格式为下。设置中断类型号。
8259A提供给CPU的中断类型号是一个8位代码,是通过初始化命令ICW2提供的。但由于ICW2的低3位被8位机占用,只有高5位能用,因此在初始化编程时,通过命令字ICW2只写入高5位,它的低3位是由中断请求线IRi的二进制编码(如IR4的编码为100)决定,并且是在第一个INTA# 到来时,将这个编码写入低3位的。可见,同一片8259A上的8个中断源的中断号的高5位都相同。 • 微机系统中断类型号的分配见表。
例:在PC微机中断系统中,硬盘中断类型号的高5位是08H,它的中断请求线连到8259A的IR5上,在向ICW2写入中断类型号时,只写中断类型号的高5位(08H),低3位取0。例:在PC微机中断系统中,硬盘中断类型号的高5位是08H,它的中断请求线连到8259A的IR5上,在向ICW2写入中断类型号时,只写中断类型号的高5位(08H),低3位取0。 • MOV AL,08H ;ICW2 的内容(中断类型号高5位) • OUT 21H,AL ;写入ICW2 的端口(A0=1) • 当CPU响应硬盘中断请求后,8259A把IR5的位号编码101作为低3位构成一个完整的8位中断类型号0DH经由数据总线提供给CPU。
(3) ICW3 • 用于8259A的级联方式。在单片时不使用该命令字。 • 在级联时主片和从片都要使用该命令字但是使用格式不一样。 • 主片ICW3的格式如下。其中Si=1表示对应的IRi上连接的是一个PIC从片,否则连接的是一个直接中断源。
从片ICW3的格式为: • 其中D2、D1、D0是从片标志码,它的编码值应与该PIC从片连接到主片的IRi对应;ICW3的其它位未用,可以是任意值,一般习惯将其填全0。
表5.5 从片ID标志编码与主片IRi对应表 从片标志码(D2D1D0) 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 主片对应IRi IR0 IR1 IR2 IR3 IR4 IR5 IR6 IR7
例:如果主片的IR3和IR6两个输入端分别连接了从片A与B的INT,主片地址为20H,从片A地址为0A0H,从片B地址为0B0H,普通级联。例:如果主片的IR3和IR6两个输入端分别连接了从片A与B的INT,主片地址为20H,从片A地址为0A0H,从片B地址为0B0H,普通级联。 • 主片的ICW3=01001000B=48H • 从片A的ICW3=00000011B=3H • 从片B的ICW3=00000110B=6H • MOV AL,48H ;ICW3(主) • OUT 21H,AL ;ICW3(主)端口(A0=1) • ┋ • MOV AL,03H ;ICW3(从片A) • OUT 0A1H,AL ;ICW3(从片A)端口(A0=1) • ┋ • MOV AL,06H ;ICW3(从片B) • OUT 0B1H,AL ;ICW3(从片B)端口(A0=1)
(4) ICW4 • 在ICW1的D0=1时,该PIC在初始化时就必须写入ICW4。用于特殊全嵌套方式。 • ICW4的格式为:
其中D7、D6、D5位均为0,其余位的含义如下: • 应用微机μPM :D0=l,8259A用于16位以上微机;D0=0,8259A用于8位微机。 • 中断结束方式AEOI:D1=1,自动结束方式,即ISR有自动复位功能,无须发送中断结束命令EOI;D1=0,为非自动结束方式,则在中断服务程序完毕后,要发送EOI命令。这里所选定的中断结束方式,只是方式上的指定,具体实施某种中断结束方式要由操作命令字OCW2来执行。
级联缓冲方式BUF:D3=l,8259A为缓冲级联方式,此时SP#/EN#引脚为输出线,用作控制缓冲器的数据传送方向;D3=0,8259A为非缓冲的普通级联方式,此时SP#/EN#为输入线,用作主/从控制。级联缓冲方式BUF:D3=l,8259A为缓冲级联方式,此时SP#/EN#引脚为输出线,用作控制缓冲器的数据传送方向;D3=0,8259A为非缓冲的普通级联方式,此时SP#/EN#为输入线,用作主/从控制。 • 缓冲级联主/从片M/S#:D2=1,8259A缓冲方式下作主片;D2=0,8259A作从片。若在普通方式(BUF=0)时,M/S#无意义,此时主/从分配由SP#决定。 • 主片嵌套方式SFNM:D4=1,主片采用特殊完全嵌套方式;D4=0,主片采用一般完全嵌套方式。
① 特殊完全嵌套方式的设置(ICW4-D4) • 在处理从片8259A的多重中断时,主片不能采用正常的完全嵌套方式。 • 在级联方式中,若从片接收到比该片“正在服务”中的一个优先级更高的中断请求,这时虽然从片会向主片发出请求,但这个请求由于是通过同一个从片提出的,就不会被主片识别(如果主片采用完全嵌套方式)。因为主片中相应于这个从片的ISR位是已经置位的,它不理睬相等的和较低级的优先权等级。因此在这种情况下,从片的较高优先等级的中断就不能被及时服务。
那么怎样来解决这个问题呢?8259A提供了一种特殊的完全嵌套方式。在这个方式中,主片仅仅是不理睬那些比在ISR中更低的优先级的中断请求,而响应所有与ISR位相等或较高的优先级的中断请求。那么怎样来解决这个问题呢?8259A提供了一种特殊的完全嵌套方式。在这个方式中,主片仅仅是不理睬那些比在ISR中更低的优先级的中断请求,而响应所有与ISR位相等或较高的优先级的中断请求。 • 因此,如果在主片中采用特殊完全嵌套方式,那么,当从片收到一个比该片服务中的那个优先等级更高的中断请求,向主片发中断请求时,它是会被主片识别的。 • 特殊完全嵌套方式是在主片的初始化时由命令字ICW4的D4(SFNM)位指定。
当使用特殊完全嵌套方式时,值得注意的是,在从片中的服务程序完毕后,发送EOI命令给主片之前,要检查是否还有其他的从片中断要求服务,这可以通过读它的ISR来确定。当使用特殊完全嵌套方式时,值得注意的是,在从片中的服务程序完毕后,发送EOI命令给主片之前,要检查是否还有其他的从片中断要求服务,这可以通过读它的ISR来确定。 • 若ISR内容全为零,说明从片中已经没有其他中断要求服务,此时就可将EOI命令送给主片;若ISR不全为零,说明还有从片中断要求服务,此时不能发送EOI命令,否则就会清除主片的ISR位,而使从片中的其他中断得不到服务。
② 中断结束方式的设置(ICW4-D1) • 8259A的中断结束方式有两种:自动结束和非自动结束(正常结束)。 • 自动结束是在第二个INTA#脉冲的上跳沿使ISR相应的位清零。因此,在中断服务程序中,不需要写中断结束命令(EOI),它通常用于非嵌套中断的单片8259A中断系统。 • 非自动结束要求在中断服务程序中写中断结束命令(EOI),才能使ISR中相应的位清零。中断结束方式是由命令字ICW4的D1位(AEOI)指定。
例1:某16位微机中8259A与系统总线之间采用缓冲器连接,非自动结束方式,只用1片8259A,正常完全嵌套。在这种条件下,ICW4=00001101B=0DH例1:某16位微机中8259A与系统总线之间采用缓冲器连接,非自动结束方式,只用1片8259A,正常完全嵌套。在这种条件下,ICW4=00001101B=0DH • MOV AL,0DH ;ICW4的内容 • OUT 21H,AL ;ICW4的端口(A0=1)
例2:PC/AT机中采用非自动结束方式,使用两片8259A,非缓冲方式,为使从片也能提出中断请求,主片采用特殊完全嵌套方式。其ICW4=00010101B=15H。若将它写入ICW4的端口,则用以下程序段:例2:PC/AT机中采用非自动结束方式,使用两片8259A,非缓冲方式,为使从片也能提出中断请求,主片采用特殊完全嵌套方式。其ICW4=00010101B=15H。若将它写入ICW4的端口,则用以下程序段: • MOV AL,15H ;ICW4的内容 • OUT 21H,AL ;ICW4的端口(A0=1)
(5) 级联方式 • 在级联方式时,一般由一个作为主片的8259A和若干片(最多8片)作为从片的8259A组成。 • ① 普通级联方式: • 在这种级联方式下,主片的SP#/EN#脚接高电平,从片的SP#/EN#脚接低电平;所有芯片的CAS0、CAS1、CAS2并接在一起;从片的INT脚接主片对应的IR脚。如下图所示。
② 缓冲级联方式 • 所谓缓冲方式是指在8259A和系统数据总线之间是否有缓冲器:若有,则为缓冲方式,就要设置控制信号,以便能打开缓冲器。如下图所示。
例:如果主片的IR3和IR6两个输入端分别连接了从片A与B的INT,主片地址为20H,从片A地址为0A0H,从片B地址为0B0H,普通级联方式。例:如果主片的IR3和IR6两个输入端分别连接了从片A与B的INT,主片地址为20H,从片A地址为0A0H,从片B地址为0B0H,普通级联方式。 • 主片的ICW3=01001000B=48H • 从片A的ICW3=00000011B=3H • 从片B的ICW3=00000110B=6H • MOV AL,48H ;ICW3(主) • OUT 21H,AL ;ICW3(主)端口(A0=1) • ┋ • MOV AL,03H ;ICW3(从片A) • OUT 0A1H,AL ;ICW3(从片A)端口(A0=1) • ┋ • MOV AL,06H ;ICW3(从片B) • OUT 0B1H,AL ;ICW3(从片B)端口(A0=1
③ 级联方式下从片中断请求及响应的过程 • 假定一个从片的IR输入端已接收到一个中断请求,并假设这个请求比其他请求且比此从片内正在服务中的中断等级具有更高优先权,那么这个从片的INT脚就会向主片发出中断请求。 • 主片接到这个请求后,要进行判优,如果这个请求与主片中其它正在服务中的中断请求等级(可能来自其他从片)相比是最高优先等级,则主片的INT脚向CPU发出中断请求。
在CPU看来,级联的“中断响应序列”和不是级联的“中断响应序列”是一样的,然而对于级联的多片8259A却是不同的。第一个应答脉冲使所有的8259A得到通知:中断请求已被允许。在此同时,作为主片的8259A要在CAS0~CAS3总线上发出被响应从片的ID码,通知它在下一个中断应答时,送出中断类型号到数据总线上,这样就完成了中断响应。 • 需要指出的是,用户若使用从片8259A时,则在中断服务完毕后,返回DOS之前必须发出两个EOI命令(若不是自动EOI方式),一个给主片,一个给从片。这是因为,在级联方式下,中断响应时,主片和从片分别将对应的ISR位置位。
2.操作命令字 • (1) OCW1 • OCW1的作用是写中断屏蔽寄存器IMR。另一方面,可以使用IN命令读取IMR内容。 • OCW1的格式如下: • 其中:Mi=1,则IRi的请求被屏蔽,Mi=0则IRi的请求开放。
8259A的中断屏蔽寄存器IMR,可以屏蔽一个或几个IR的中断请求,它加强了对中断的控制能力。屏蔽单个的或部分的IR,可以使得在主程序中的不同部分使用不同的中断,而不必改变硬件结构。还可以在子程序中禁止比自己优先级高的某些中断,这实际上也就改变了中断的优先级。8259A的中断屏蔽寄存器IMR,可以屏蔽一个或几个IR的中断请求,它加强了对中断的控制能力。屏蔽单个的或部分的IR,可以使得在主程序中的不同部分使用不同的中断,而不必改变硬件结构。还可以在子程序中禁止比自己优先级高的某些中断,这实际上也就改变了中断的优先级。 • 一个中断源提出中断请求时,虽然它被屏蔽(即相应的Mi位置1),但它的中断请求不一定被忽略:若当它的屏蔽位复位(开放)且它的IRR位未撤消,就会产生中断。若在IMR复位(开放)之前撤掉IR请求,则中断就不会被响应。这种屏蔽方式是常用的一种屏蔽手段。
例:要使中断源IR3开放,其余均被屏蔽,其OCW1=1111011lB例:要使中断源IR3开放,其余均被屏蔽,其OCW1=1111011lB • MOV AL,0F7H ;OCW1内容 • OUT 21H,AL ;OCW1端口(A0=1) • OCW1用于普通屏蔽方式,特殊屏蔽方式用于开放低级中断,允许响应优先级较低的请求,由OCW3决定。
例如:IMR寄存器的内容,还可以读出。例如,在BIOS中有一段检查中断屏蔽寄存器的程序:例如:IMR寄存器的内容,还可以读出。例如,在BIOS中有一段检查中断屏蔽寄存器的程序: • MOV AL,00H ;置IMR为全“0” • OUT 21H,AL ;OCW1口地址 • IN AL,21H ;读IMR • OR AL,AL ;检查是否为全“0” • JNZ ERRORIMR ;不为0,则出错 • MOV AL,OFFH ;置IMR 为全“1” • OUT 21H,AL ;OCW1口地址 • IN AL,21H ;读IMR • ADD AL,1 ;检查是为全“1” • JNZ ERRORIMR ;不为全“l”,出错 • ┋ • ERRORIMR:… ;为出错处理
(2) OCW2 • OCW2用于非自动中断结束操作和中断优先级排队的操作。 • OCW2的格式如下:
其中:D7位(R):用来控制8259A是否采用中断优先级的轮换方式。若R为0,则不采用轮换而是采用固定优先级;若R位置1,则采用优先级轮换方式,并且按照SL,EOI及L2~L0各位的组态来执行优先级指定轮换。其中:D7位(R):用来控制8259A是否采用中断优先级的轮换方式。若R为0,则不采用轮换而是采用固定优先级;若R位置1,则采用优先级轮换方式,并且按照SL,EOI及L2~L0各位的组态来执行优先级指定轮换。 • D6位(SL):用来指定是否需要指定轮换优先级或非自动结束的IRi对应的中断源。若SL=0,则不需要指定,并且L2~L0位无效(全部写0) ;若SL置1,则需要指定,并且用L2~L0位编码来指定。 • D5位(EOI):用于指定所有需要使用中断结束命令的情况 。若置0,就不需要发送中断结束命令(如自动中断结束)。若置1,则在中断服务完毕之后需要发送中断结束命令。
D2~D0位(L2~L0):3位码是用来指定中断等级(0~7)。该等级是为了对指定的ISR位复位(执行EOI指令)或执行优先级指定轮换方式。它和D6位SL配合使用。即:在指定特殊轮换优先级方式下,指定最高优先级的IRi;或,在非自动EOI命令结束时,指定接收EOI命令的IRi引脚。D2~D0位(L2~L0):3位码是用来指定中断等级(0~7)。该等级是为了对指定的ISR位复位(执行EOI指令)或执行优先级指定轮换方式。它和D6位SL配合使用。即:在指定特殊轮换优先级方式下,指定最高优先级的IRi;或,在非自动EOI命令结束时,指定接收EOI命令的IRi引脚。
非指定EOI命令(NSEOI):使当前最高优先级的正在服务ISR位清0。非指定EOI命令(NSEOI):使当前最高优先级的正在服务ISR位清0。 • 例1:不指定EOI命令 • . • . (中断服务程序) • . • MOV AL,00100000B • OUT 20H,AL ; PC/XT • IRET
指定EOI命令(SEOI):使L2~L0所指定IR对应的ISR清0。指定EOI命令(SEOI):使L2~L0所指定IR对应的ISR清0。 • 例2、指定EOI命令: • … • MOV AL,01100101B • OUT 20H,AL ; PC/XT • IRET • (原)ISR:0 0 1 1 0 0 0 0 • (新)ISR:0 0 0 1 0 0 0 0 • (中断源IR5)
NSEOI循环命令:使当前正在服务ISR位清0,并使其对应IR的优先级变为最低。NSEOI循环命令:使当前正在服务ISR位清0,并使其对应IR的优先级变为最低。 • 例3、循环不指定EOI命令 • … • MOV AL,10100000B • OUT 20H,AL • STI ;开中断 • IRET • 执行前 ISR:0 1 0 0 1 0 0 0 • 优先级:7 6 5 4 3 2 1 0 • 执行后 ISR:0 1 0 0 0 0 0 0 • 优先级: 3 2 1 0 7 6 5 4
AEOI进入循环命令:使PIC进入自动循环优先状态,在CPU响应某一IR请求后自动将其ISR位清0,并将该IR的优先级变为最低。AEOI进入循环命令:使PIC进入自动循环优先状态,在CPU响应某一IR请求后自动将其ISR位清0,并将该IR的优先级变为最低。 • 1 0 0 0 0 0 0 0 • AEOI退出循环命令:使PIC退出自动循环优先状态,此后PIC按AEOI方式使ISR清0,但PIC的优先级结构保持固定方式不变。 • 0 0 0 0 0 0 0 0
SEOI循环命令:同时完成SEOI命令和设置最低优先级命令。SEOI循环命令:同时完成SEOI命令和设置最低优先级命令。 • 例4、循环指定EOI命令(有多个中断时)。要把IR6定为最低 (L2L1L0=110) • … • MOV AL,11100110B • OUT 20H,AL • 执行前 ISR: 0 1 1 0 0 1 0 0 • 优先级: 2 1 0 7 6 5 4 3 • 执行后 ISR: 0 0 1 0 0 1 0 0 • 优先级: 0 7 6 5 4 3 2 1
设置最低优先级命令:使L2~L0所指定IR为最低优先级。该命令可用于循环优先的优先级结构改变,也可用于固定优先结构中设定优先级顺序。设置最低优先级命令:使L2~L0所指定IR为最低优先级。该命令可用于循环优先的优先级结构改变,也可用于固定优先结构中设定优先级顺序。 • 例:设置优先权命令。若知当前IR5最高,想把IR7定为最高优先权。(实际上应该把IR6置为最低优先权)。此时, L2L1L0 =110 • …. • MOV AL,11000110B • OUT 20H,AL; • IR7 IR6 IR5 IR4 IR3 IR2 IR1 IR0 • (前)优: 2 1 0 7 6 5 4 3 • (后)优: 0 7 6 5 4 3 2 1