BC7281A串行通訊的解決方案
2004年7月A版
摘 要:本文重點闡述數(shù)碼管顯示及鍵盤接口專用控制芯片BC7281A與MCU串行通訊中應注意的幾個問題,給出了有效的解決方法,并提出了改進建議。
傳統(tǒng)的數(shù)碼管顯示和鍵盤接口一般直接采用MCU的I/O口對鍵盤或數(shù)碼管進行動態(tài)掃描的方法,硬件上需要較多的外圍部件,且占用MCU大量I/O口,軟件上則浪費CPU資源,且給編程人員帶來很大的不便。數(shù)碼管顯示及鍵盤接口專用控制芯片以其實現(xiàn)方法簡單、功能強大等顯著特點得到廣泛的應用。這種芯片外圍部件少、與MCU通訊一般采用串行接口或總線、在硬件上和軟件上都占用極少資源、且功能強大、使得編程人員可以將更多的時間花在控制上。目前的這類接口芯片主要有:BC728X、HD7279A、ZLG7290、CH451等,BC7281A是其中性價比較高的一種。
典型應用電路
BC7281A的典型應用電路如圖1所示,顯示位數(shù)為16位,連接的鍵盤個數(shù)為64個,其外接移位寄存器采用74HC164,控制MCU采用ATMEL公司的AT89C51,為簡單起見,圖中僅畫出與BC7281A相關的電路。
BC7281A與MCU之間的通訊
BC7281A與MCU之間的通訊是采用2線高速串行接口,這兩個連線分別是數(shù)據(jù)線DAT和同步時鐘線CLK,其中DAT為雙向數(shù)據(jù)傳輸線,BC7281A既用該線從MCU接收數(shù)據(jù),也用該線向MCU發(fā)送數(shù)據(jù)。BC7281A的DAT引腳為漏極開路輸出結構,使用時須在該線上加20KW左右的上拉電阻。CLK引腳為串行時鐘接口的同步時鐘,由MCU控制,下降沿有效。串行接口數(shù)據(jù)寬度為8位,時序圖如圖2所示。
由于BC7281A的2線串行接口是自行規(guī)定的,一般MCU都不具備此通訊接口,但可以采用軟件實現(xiàn)。MCU發(fā)送指令或數(shù)據(jù)到BC7281A子程序為SEND,MCU接收數(shù)據(jù)子程序為RECEIVE,采用51指令系統(tǒng)編寫,其中DATA_OUT為MCU向BC7281A發(fā)送數(shù)據(jù)的寄存器,該寄存器既能直接尋址又能位尋址,DATA_IN為MCU接收BC7281A的數(shù)據(jù)寄存器,CLK和DAT定義為MCU的I/O口,分別連接到BC7281A芯片上的CLK和DAT引腳。
MCU發(fā)送指令或數(shù)據(jù)到BC7281A子程序
SEND: CLR CLK
SETB CLK ;發(fā)送握手請求脈沖
WAIT1: JB DAT,SEND ; DAT
CLR CLK ;建立通訊
SETB CLK
WAIT2: JNB DAT,WAIT2 ;發(fā)送串行數(shù)據(jù)
MOV BIT_COUNT,#8
SEND_LOOP: MOV C,DATA_OUT.7 ; BIT7
MOV DAT,C
CLR CLK ; CLK
SETB CLK
MOV A,DATA_OUT
RL A
MOV DATA_OUT,A
NOP
NOP
DJNZ BIT_COUNT,SEND_LOOP
SETB DAT
NOP
NOP
RET
MCU接收數(shù)據(jù)子程序
RECEIVE: CLR CLK ;發(fā)送握手請求脈沖
SETB CLK
WAIT3: JB DAT,WAIT3 ;建立通訊
CLR CLK ; CLK ,
SETB CLK
MOV BIT_COUNT,#8
RECV_LOOP: NOP ;發(fā)送串行數(shù)據(jù)
NOP
MOV A,DATA_IN
MOV C,DAT
RLC A
MOV DATA_IN,A
CLR CLK
SETB CLK
DJNZ BIT_COUNT,RECV_LOOP
NOP ;
NOP
RET
在使用過程中,只要根據(jù)需要調用SEND或RECEIVE子程序即可。但在某些情況下可能引起嚴重的問題,通訊時間過長會影響顯示在數(shù)據(jù)傳送期間,BC7281A將不會進行顯示和鍵盤掃描,因此雖然數(shù)據(jù)傳送的速度并沒有下限的限制,但如果數(shù)據(jù)的傳送時間大于掃描周期(最小為8mS),將會對顯示造成影響。
一般情況下,通訊周期是很短的,用Insight ME-52H仿真器測試MCU與BC7281A單個字節(jié)的通訊周期,時鐘由仿真器內部提供,為12MHz,測得SEND平均的通訊周期在170mS左右,RECEIVE的為160mS左右,遠遠小于掃描周期,不會影響顯示。但在有中斷的情況下,就可能間接延長通訊周期了,因為中斷是隨機的,MCU就有可能在通訊期間響應中斷,則此時的傳送時間還應包括中斷響應的時間,如果中斷處理時間較長,就可能影響顯示了。
例如,在中斷服務程序里利用UART發(fā)送批量數(shù)據(jù),為了確保數(shù)據(jù)的正確發(fā)送,必須在每個字節(jié)發(fā)送完畢后即發(fā)送緩沖器為空時才發(fā)送下一個數(shù)據(jù),每個數(shù)據(jù)的發(fā)送時間由波特率決定,在波特率為9600bps,采用10位異步收發(fā)方式情況下,則傳送一個8位的數(shù)據(jù)至少需要1(1/960S)mS,實驗證明,當發(fā)送數(shù)據(jù)量為8個時,數(shù)碼管顯示有明顯的閃爍現(xiàn)象,并隨著發(fā)送數(shù)據(jù)量的增加,閃爍更加明顯。
顯然,在中斷源比較多,且中斷比較頻繁的情況下,就可能在一個傳遞周期內多次響應中斷(包括中斷嵌套),即使每個中斷的響應時間較短,通訊時間也會顯著的延長,也會引起閃爍現(xiàn)象。
通訊協(xié)議被破壞導致數(shù)據(jù)傳送錯誤
由于MCU與BC7281A的通訊是采用2根半雙工的串行總線,傳送數(shù)據(jù)時要求以字節(jié)為單位進行傳送,即傳送一個字節(jié)后才能傳送下一個字節(jié),否則會引起傳送數(shù)據(jù)錯誤。
如果調用這些通訊子程序的指令分布在主程序和中斷服務程序里,就可能出現(xiàn)以下情況:主程序正在執(zhí)行某條通訊指令期間,響應中斷服務程序里的另一條通訊指令,此時通訊協(xié)議將出錯,導致數(shù)據(jù)傳送錯誤。特別是會出現(xiàn)在以下情況:主程序完成顯示功能,鍵盤采用中斷方式,這時若在中斷服務程序出現(xiàn)讀取鍵值的指令,將會引起數(shù)據(jù)傳輸出錯。因此要求所有調用通訊指令均在主程序或中斷服務程序中。
解決方法
從上面的分析可以看出,這些問題主要是由中斷引起的,可以采用在軟件上調整程序結構,硬件上進一步完善等方法加以解決,具體如下:
調整程序結構
禁止在通訊期間內響應中斷:禁止在通訊期間內響應中斷,就是在每次調用通訊子程序前關閉所有的中斷,調用完畢后再開放中斷,這樣傳遞時間就不會增加,也不會出現(xiàn)在同一個通訊周期里分時傳送兩個數(shù)據(jù)的情況。該方法雖然簡單,但有一定的局限性,對于有些實時性要求很高的場合,或者利用中斷實現(xiàn)精確延時等場合就不適用了。
采用中斷配合查詢標志位:該方法中,對于實時性要求高或執(zhí)行時間較短的中斷則直接在相應的中斷服務程序中完成,其他的中斷則采用中斷配合查詢標志位的方法處理,即僅在中斷服務程序里設置中斷標志位,在主程序里查詢該標志位的狀態(tài),若有中斷發(fā)生則進行相應的處理,這樣就可以將原來中斷服務程序中的處理部分轉移至主程序了,也就不會出現(xiàn)通訊子程序的指令分布在主程序和中斷服務程序的情況了,也就避免了在一個通訊期間內分時傳送兩個數(shù)據(jù),同時也有效的減少了中斷時間。另外,盡量減少通訊的頻率,如在顯示的數(shù)據(jù)不變化時不更新BC7281A中相應的顯示寄存器,這樣就可以減少在通訊期間響應中斷的可能性了,也提高了CPU的利用率,可以作為該方法的有效補充。
用硬件實現(xiàn)雙向通訊
上述這兩種解決方法在一定程度上給編程人員帶來不便,主要原因是由軟件來完成MCU和BC7281A之間的通訊,如均用硬件實現(xiàn),對編程人員來說完全可以將BC7281A完全看成“黑匣子”,就會給編程人員提供更大的自由度,從這種意義上說,也提高了性能。目前標準的串行接口或串行總線有SPI接口、I2C總線、MicroWire接口、MSBus總線、1-Wire總線等?,F(xiàn)在很多單片機都支持這些標準串行接口或總線(即使沒有也可以用軟件實現(xiàn)),如MicroChip公司的PIC16F87X系列單片機就同時支持SPI接口和I2C總線。采用其中的某一種接口或總線后,MCU與數(shù)碼管顯示及鍵盤掃描控制芯片的通訊協(xié)議由硬件實現(xiàn),幾乎不占用CPU的資源,也不必考慮上述提到的情況,使用起來更加方便。
結語
BC781A價格低廉,功能強大,外圍電路少,軟件控制簡單,使用方便;但在應用時會出現(xiàn)數(shù)據(jù)傳送錯誤等問題,可以使用多種軟硬件方法解決。在機載多通道掃描儀(MAMS)黑體定標源系統(tǒng)中采用了本文提出的調整程序結構的解決方法,該系統(tǒng)于日前進行航空試驗,試驗結果表明,系統(tǒng)在較惡劣的電磁環(huán)境中,仍能可靠運行,效果令人滿意。
參考文獻:
1. BC7281A 128段LED顯示及64鍵鍵盤控制芯片數(shù)據(jù)手冊. 北京凌志比高公司.
評論