並行通信接口8255A
AB口為兩個數據端口,C口可以作為數據端口也可以作為狀態端口
8255A是一個40引腳的雙列直插式芯片
引腳如下
D0-D7:雙向數據信號線。
RD:讀信號線。
WR:寫信號線。
CS:片選信號線。
A0、A1:口地址選擇信號線。
00--A端口;01--B端口;10--C端口;11--控制口。
RESET:復位輸入信號,復位時三個端口自動置為輸入口
PA0-PA7:A口的8條輸入輸出信號線。
PB0-PB7:B口的8條輸入輸出信號線。
PC0-PC7:C口的8條輸入輸出信號線。
數據端口:8255A具有3個8位的輸入輸出端口,即PA0-PA7,PB0-PB7,PC0-PC7,這三個端口分別受到A,B控制,端口C被分為兩部分。一般情況下,C用來配合 A和B
端口A具有一個8位數據輸入鎖存器和一個數據輸出鎖存器/緩沖器;
端口B具有一個8位數據輸入緩沖器和一個數據輸出鎖存器/緩沖器;
端口C具有一個8位數據輸入緩沖器和一個數據輸出鎖存器/緩沖器,一般作為控制或狀態信息端口。
數據總線緩沖器:是一個雙向的、三態的8位數據寄存器,他與系統總線相連,構成CPU和8255A之間的數據通道
A組控制電路和B組控制電路
控制端口A與端口C的高4位(PC7-PC4)
控制端口B與端口C的低4位(PC3-PC0)
讀寫控制邏輯:接受CPU的控制信號,並將其組合成A和B組的控制信號
RESET 復位信號
CS# 片選信號,通常由高位地址譯碼產生
A1,A0選擇端口(端口選擇信號)00為選擇A,01選擇B,10選擇C,11只能從總線讀取數據,D7為1的時候寫入方式控制字,D7為0的時候對C進行復位
RD# 讀信號,低電平有效,當為低電平的時候,CPU可以從8255中讀取數據
WD# 寫信號,低電平有效,當為低電平的時候,CPU可以往8255A中寫數據/控制字
下面介紹8255A的工作模式
方式0
方式0式基本的輸入輸出方式,不需要應答式聯絡信號
任何端口都可以做輸入輸出,特別是C端口,高四位和低四位可以分別設置
一般用於無條件傳輸/程序查詢式傳輸
8255A中方式0對輸出進行鎖存(和總線相連肯定要鎖存的),輸入不鎖存
8255A中沒有時鍾輸入信號,所有的時序都是由引腳控制信號定時的
當CPU執行IN指令的時候,產生RD#信號,控制8255A從端口讀取外設的輸入數據,然后從D0-D7中輸入到CPU
當CPU執行OUT指令的時候,產生WD#信號,完成CPU從端口向外傳輸數據
方式1
方式1是單方向的輸入/輸出工作模式
將3個端口分成兩組,端口A和B可以兩個數據口,分別工作在方式1,而端口C用來配合端口A和B在方式1下進行工作,作為選通信號
注:
A口工作於方式1輸入,固定用PC5-PC3作聯絡信號線;
A口工作在方式1輸出的時候,PC7,PC6和PC3作為選通信號
B口工作於方式1輸入輸出的時候,固定用PC2-PC0作聯絡信號線。
如果AB都用方式1進行傳輸,C口剩下的兩位可以工作在方式0下
在8255方式1下,輸入輸出都可以鎖存
方式1進行輸入的時候
所用到的控制信號的定義如下:
① STB為低電平有效的輸入選通信號,由外設提供的輸入信號,當它有效時,把輸入裝置來的數據送入輸入鎖存器。
② IBF為高電平有效的輸入緩沖器滿信號,通知外設送來的數據已被接收,由STB信號的前沿產生。當CPU用輸入指令讀走數據后,此信號被清除。
③ INTR為中斷請求信號,高電平有效。CPU響應中斷請求后在服務程序中讀走數據時,由RD信號將其清除。
④ INTE為中斷允許狀態,可事先用位控方式寫入。
實現過程如下
- 當外設數據准備好的時候,將選通信號STB#設置為有效,來通知8255
- 8255利用STB#信號,將數據鎖存到數據鎖存器中,置緩沖區滿,IBF信號有效,縞素外設數據已經讀入,防止再次讀入數據
- 當STB#和IBF都為高,觸發中斷,向CPU發中斷請求INTR(CPU也可以用查詢方式)
- CPU執行IN指令,發出RD#信號,信號持續一段時間后抹除INTR
- RD#信號結束后,清除IBF信號(表示數據已經送到CPU中,輸入鎖存器空了),接着從外設讀取數據
方式1下的輸出
當端口A和B都處於方式1工作的時候,PC0-PC2,PC3,PC6,PC7控制A
控制的引腳如圖
關於控制信號的含義
控制過程如下
當CPU相應了8255的中斷后,發出WD#信號,輸出數據到鎖存器中。輸送完了之后,WD有效的時候,打開OBF#為0,緩沖器滿,告訴CPU不要寫數據到8255A了,(OBF#也是外設的選通信號)同時INTR為0(已經響應了中斷)。當外設讀完了數據,WD為1,發送響應信號ACK#,ACK#的上升沿也把OBF置為1,緩沖器空,INTR為1,發送下一個中斷,可以讀下一個數據了
方式2 雙向傳輸方式(只適用於A端口)
當A端口工作方式2的時候(需要PC3-PC7),B口還可以工作在方式1(需要PC0-PC2)和方式0(PC0-PC2可以在方式0啦)
方法和方式1的輸入輸出是一樣的
如果A口外設輸入數據到8255中的時候,STB#有效,外設數據輸入到A的PA0-PA7,輸完數據后,STB為1,同時IBF為1,觸發中斷,INTR為1,CPU響應中斷,發出IN指令,RD為0,當RD有效的時候,INTR為0(表示已經響應了中斷),數據傳輸到數據總線中,讀完后,INFA為0,繼續開始讀取數據
如果8255發送了一個中斷,CPU響應了中斷,發出WR#信號,數據從總線中到鎖存器中,在WR有效的時候清除INTR(響應了中斷)。同時讓OBFA為0(PC7),告訴外設要讀數據了,外設讀完后發出響應信號ACK#,ACK上升沿恢復為1的時候,觸發OBFA為1,又觸發了中斷
注意,由於A口的輸入鎖存器和輸出鎖存器是互相獨立的,故當CPU向A口輸出數據時,外部設備也可同時向A口輸入數據。反之亦然。
8255A的初始化編程
要使用8255A,必須要初始化編程
有兩種方式(都是在同一個端口)
第一種,方式選擇控制字
從高將其
第一位,選擇控制字的方式,0為位操作(操作PC的),1為控制方式
如果我們選1,就是控制字方式
2,3位是選擇端口A的工作方式,00為方式0,01為方式1,10為方式2
接着4是決定這個A口是輸入還是輸出,輸入為1,輸出為0
5位是決定這個PC4-PC7輸出(其實很好記,因為高位是控制A的),0位輸出,1位輸入
接着第6位是決定B的工作方式(為啥A有兩位,B只有一位應該是B只能選擇方式0和方式1吧)
第七位決定B的輸入還是輸出,0位輸出,1位輸入
第八位是決定C的低四位輸入還是輸出,輸入位1,輸出位0
注意:位控字是通過向8255A的控制寄存器寫入的,不是直接對C口寫入
第二種寫控制字的方式是對C進行操作
第一位肯定要為0(為1就是上面了)
后面三位直接舍棄,不要操作(最好位000,方便計算,你不想算0101算到吐吧)
接着三位是選擇C口的位數,這個就是2進制了,比如說010就是操作PC2,110就是操作PC6
最后1位用來復位,0位復位,1位置位
說句實話,這么看8255的難度也還好,但是8255真正難的地方是這玩意是一個擴展芯片,很適合和其他芯片一起來(比如說AD,DA芯片之類的,寫作業的時候真的惡心)出大題。再加上匯編語言寫個if語句都很麻煩,這玩意的出現簡直是煩人,后面我也有自己總結這方面的大題的題目出來