單片機(jī)如何訪問片外存儲空間的時序
單片機(jī)與片外程序存儲器、數(shù)據(jù)存儲器或I/O接口之間進(jìn)行數(shù)據(jù)交換時所產(chǎn)生的總線操作被稱為總線周期(Bus Cycle)。單片機(jī)向外傳輸數(shù)據(jù)的總線周期是寫總線周期,反之是讀總線周期。在總線周期中,單片機(jī)總線引腳的狀態(tài)將按照一定時間順序發(fā)生特定的變化,這樣的總線狀態(tài)變化被稱為總線時序。本節(jié)將分別介紹單片機(jī)進(jìn)行片外程序和數(shù)據(jù)存儲器(或I/O接口)訪問時的總線時序。
1.片外程序存儲器讀總線時序
單片機(jī)會在以下兩種情況下讀片外擴(kuò)展的程序存儲器,并產(chǎn)生如圖5-11所示的片外程序存儲器讀總線周期。
圖5-11片外程序存儲器讀總線周期時序
(1)從片外程序存儲器中讀取指令
從片外程序存儲器取指令時,首先16位程序指針PC的高8位PCH和低8位PCL分別由單片機(jī)的P2口和P0口輸出,作為地址指向程序存儲的某個存儲單元,該存儲單元中的數(shù)據(jù)就是單片機(jī)要讀取的指令(指令的二進(jìn)制代碼)。由于P0口是地址和數(shù)據(jù)分時復(fù)用的總線,進(jìn)入一個機(jī)器周期的S3狀態(tài)后,P0口上的低8位地址將消失。為了在P0口上的地址消失后依然能夠按照正確的地址訪問存儲器,必須在低8位地址消失前,通過地址鎖存器將其鎖存住。這里,地址鎖存的時機(jī)是非常關(guān)鍵的,因為必須保證觸發(fā)地址鎖存器時,P0口上傳送的
是低8位地址,而由圖5-11可知,利用ALE引腳上出現(xiàn)的下降沿信號觸發(fā)地址鎖存,恰好符合對鎖存時機(jī)的要求。接下來,在S4狀態(tài)的前半段,P0口將成為數(shù)據(jù)總線,P0口上的數(shù)據(jù)將被當(dāng)作指令代碼送入單片機(jī)內(nèi)的指令寄存器,而且此段時間內(nèi),PSEN引腳為低電平,若PSEN引腳被連接到程序存儲器的讀選通引腳OE上,則PSEN的低電平可以使程序存儲器輸出被地址選中的存儲單元中所存放的指令代碼。
(2)從片外程序存儲器中讀取數(shù)據(jù)
單片機(jī)可以通過“MOVC A,@A+DPTR”和“MOVC A,@A+PC”兩條指令讀取程序存儲器中存放的信息。當(dāng)MOVC指令執(zhí)行時,首先(A)+(DPTR)或(A)+(PC)的16位和的高8位和低8位作為地址的高8位(A15~A8)和低8位(A7~A0)分別由P2口和P0口輸出。其中,P2口上的高8位地址保持不變,而P0口上的低8位地址將消失,并且之后成為
傳送數(shù)據(jù)的數(shù)據(jù)總線。為此,需要將單片機(jī)ALE引腳與地址鎖存器的鎖存觸發(fā)引腳相連,用于控制鎖存器在ALE下降沿時鎖存住P0口上傳送的低8位地址。最后,當(dāng)與程序存儲器OE引腳相連的PSEN引腳出現(xiàn)低電平時,程序存儲器將被地址選中的存儲單元中的字節(jié)數(shù)據(jù)送上數(shù)據(jù)總線P0口,而P0口上的數(shù)據(jù)最后被傳送給累加器A。
需要特別注意的是:在讀片外程序存儲器的過程中,單片機(jī)的RD和WR引腳始終為高電平,因此與單片機(jī)相連的數(shù)據(jù)存儲器既不輸入也不輸出數(shù)據(jù),從而不可能出現(xiàn)片外程序存儲器和數(shù)據(jù)存儲器空間的地址沖突問題。
2.片外數(shù)據(jù)存儲器總線時序
MCS-51單片機(jī)使用MOVX指令(見表3-5)進(jìn)行片外數(shù)據(jù)存儲器的讀和寫操作。
(1)讀總線時序
以累加器A為目的操作數(shù)的“MOVX A,@DPTR”和“MOVX A,@Ri”指令是片外數(shù)據(jù)存儲器讀指令,將產(chǎn)生如圖5-12所示的片外數(shù)據(jù)存儲器讀總線周期時序。
觀察圖5-12可知在讀總線周期中:
1)PSEN和WR引腳始終為高電平。
2)P2口上傳送的是片外數(shù)據(jù)存儲器的高8位地址。對于指令“MOVX A,@DPTR”,高8位地址來自于DPTR的高8位DPH;對于指令“MOVX A,@Ri”,高8位地址需要通過直接向P2口中寫入的方式來確定,如執(zhí)行指令“MOV P2,#12H”可以使高8位地址為12H。
3)DPL或Ri中的8位二進(jìn)制數(shù)為片外數(shù)據(jù)存儲器的低8位地址,由地址總線P0口送出。作為地址/數(shù)據(jù)分時復(fù)用的總線,P0口上的低8位地址將在S6的后半段消失,并且進(jìn)入S3后,P0口將成為數(shù)據(jù)總線用于傳送來自片外數(shù)據(jù)存儲器的數(shù)據(jù)。
圖5-12片外數(shù)據(jù)存儲器讀總線周期時序
4)在ALE引腳出現(xiàn)下降沿時,P0口上傳送的一定是片外數(shù)據(jù)存儲器的低8位地址。因此,可以用ALE作為地址鎖存器的鎖存觸發(fā)信號,控制低8位地址的鎖存。
5)在P0口作為數(shù)據(jù)總線傳送數(shù)據(jù)期間,連接到片外數(shù)據(jù)存儲器OE引腳的RD引腳上的低電平信號恰好可以使片外數(shù)據(jù)存儲器送出數(shù)據(jù)到P0口上,完成數(shù)據(jù)的傳送。
(2)寫總線時序
圖5-13為片外數(shù)據(jù)存儲器寫總線周期時序,該時序可以由以累加器A為源操作數(shù)的寫存儲器指令“MOVX@DPTR,A”和“MOVX A,@Ri”產(chǎn)生。在寫總線周期中,當(dāng)WR為低電平時,P0口已經(jīng)由地址總線轉(zhuǎn)換為數(shù)據(jù)總線,用于將累加器A中的數(shù)據(jù)送給片外數(shù)據(jù)存儲器,而WR與存儲器的WE引腳相連,能使片外數(shù)據(jù)存儲器接收P0口上的數(shù)據(jù)。
圖5-13片外數(shù)據(jù)存儲器寫總線周期時序
對比圖5-11、圖5-12和圖5-13可以看到,引腳PSEN、RD和WR不會同時為低電平。這保證了在一個同時擴(kuò)展了片外程序存儲器和數(shù)據(jù)存儲器的單片機(jī)系統(tǒng)中,程序存儲器讀操作、數(shù)據(jù)存儲器讀操作和數(shù)據(jù)存儲器寫操作三者之間不會發(fā)生沖突。