陶金, 陳文鑫, 王景成
串行外設(shè)接口(Serial Peripheral Interface)是MCU與外界聯(lián)系的重要方式之一。利用SPI既可以實現(xiàn)MCU之間的數(shù)據(jù)傳輸,且其速度比通過串行異步通信(SCI)方式快。利用SPI也可以實現(xiàn)MCU與具有SPI接口的芯片進(jìn)行直接接接,這些芯片包括模數(shù)轉(zhuǎn)換器,LED/LCD驅(qū)動器,組合開關(guān)等。換而言之,SPI可以進(jìn)行大范圍的MCU外設(shè)擴(kuò)展而不受MCU I/O口的限制。
傳統(tǒng)的車身控制系統(tǒng)采用繼電器來控制需要較大電流驅(qū)動電機(jī)的部件,例如車窗,后視鏡,車鎖等。在總線化設(shè)計中為了縮小控制單元的體積,增加系統(tǒng)的集成度,采用ST公司的L9950車門執(zhí)行器驅(qū)動芯片來對車門上的鎖、童鎖、后視鏡旋轉(zhuǎn)、后視鏡折疊后視鏡除霜和腳燈等通過SPI口進(jìn)行集中控制,不僅完全脫離了繼電器控制,節(jié)省了I/O口,縮小了單元體積,還可以通過SPI口讀取L9950中移位寄存器中的數(shù)據(jù)來實現(xiàn)故障診斷功能。
本文將對車門控制中 SPI的實現(xiàn)的原理和過程進(jìn)行闡述,之后給出了演示板的調(diào)試過程。
利用SPI進(jìn)行MCU和外部設(shè)備之間的數(shù)據(jù)傳輸時,有主機(jī)和從機(jī)的概念,MCU必須工作于從機(jī)方式,且控制著數(shù)據(jù)傳輸,外部設(shè)備則處于從機(jī)方式。圖1是SPI的主從連接示意圖,參與數(shù)據(jù)傳的有三個引腳:時鐘引腳 SPSCK、主入從出引腳MISO、主出從入引腳MOSI。數(shù)據(jù)傳輸過程如下:
移位寄存器為8位,所以每一個過程相互傳送8位數(shù)據(jù),工作從主機(jī)CPU發(fā)出啟動傳輸信號開始,此時要傳送的數(shù)據(jù)裝入8位移位寄存器,同時產(chǎn)生8個時鐘信號從SPSCK引腳依次送出,在SPSCK信號的控制下,主機(jī)中8位移位寄存器中的數(shù)據(jù)依次從 MOSI引腳送出,到從機(jī)的 MOSI引腳送入其8位移位寄存器,在此過程中,從機(jī)的數(shù)據(jù)也通過MISO引腳到主機(jī)中,從而得以實現(xiàn)全雙工的傳輸功能。
圖1 SPI全雙工主從連接示意圖
本文中使用Freescale公司的M68HC908AZ60來控制車門執(zhí)行器驅(qū)動芯片L9950。
如圖2所示,在AZ60 MCU中E接口的PTE4~PTE7四個引腳與SPI模塊共用,作為SPI的引腳時,分別為SS、MISO、MOSI和SPSCK。L9950中DI、DO和CLK引腳分別與MCU的MOSI、MISO和SPSCK相連接,實現(xiàn)數(shù)據(jù)傳輸功能。有兩個電源口Vs和Vcc。Vs提供高端和半橋驅(qū)動。內(nèi)部charge pump 用來驅(qū)動高端開關(guān)。Vcc提供邏輯部分和SPI接口部分的電源,獨立的邏輯電源使得在Vs產(chǎn)生異常時,狀態(tài)和控制信息不會丟失。PWM 1/2口為脈沖寬度調(diào)制口,在車門某些部件需要電機(jī)平穩(wěn)驅(qū)動或者需要逐漸提高電壓以提高部件使用壽命時使用。
L9950驅(qū)動電流的輸出主要取決于PWM和其內(nèi)部輸入數(shù)據(jù)寄存器的與邏輯關(guān)系,當(dāng)值為真時,電源Vs通過內(nèi)置的Charge Pump提高電流來打開高端開關(guān),從而在OUT口輸出大電流,驅(qū)動電機(jī)等部件。所以在一般要求不是很高的情況下,從MCU引出的PWM位始終置1。CM口提供一個電流值的回饋功能,能夠回饋指定OUT口高端驅(qū)動的電流值的一萬分之一,連接到MCU可以更精確的得到負(fù)載的狀態(tài),而不是只通過 L9950內(nèi)的數(shù)據(jù)寄存器得到簡單的開路和短路信息。
圖2 L9950和MCU的電路圖
L9950使用標(biāo)準(zhǔn)的SPI口進(jìn)行通訊,有兩個輸入寄存器和兩個狀態(tài)寄存器,均為24位。輸入寄存器只能寫入,狀態(tài)寄存器只能讀出。當(dāng) CSN片選信號為高電平時,DO口呈高阻狀態(tài)。CSN轉(zhuǎn)為低電平后,SPI的串行通訊便開始了,在24位數(shù)據(jù)在時鐘CLK的控制下,經(jīng)移位寄存器同時發(fā)送和接收之后,CSN應(yīng)恢復(fù)為高電平。這一次發(fā)送的24位數(shù)據(jù)便稱作L9950的一個通訊幀。
輸入寄存器中,bit0是寄存器選擇信號(2選 1),bit1~bit17控制相應(yīng)的OUT口驅(qū)動器,bit22為重置模式。狀態(tài)寄存器中的數(shù)據(jù)會在輸入寄存器接收數(shù)據(jù)的同時發(fā)送給MCU,分為狀態(tài)寄存器1和狀態(tài)寄存器2,前者存放寄存器的過流故障信息,后者存放寄存器的斷路故障信息。Bit0為bit1~bit22的邏輯“或非”組合,用來判斷是否有故障產(chǎn)生。Bit1~bit22則分別對應(yīng)于各個 OUT口故障以及全局故障。
在本例中對M68HC908AZ60中的SPCR,SPSCR進(jìn)行設(shè)置。具體為:MCU收到數(shù)據(jù)不產(chǎn)生中斷,工作在主機(jī)方式、空閑時低電平,CSN下降沿作為移位開始信號、允許SPI、MCU發(fā)送數(shù)據(jù)不產(chǎn)生中斷,SPI的傳輸比特率定為12500。
本例采用4個三元一維數(shù)組來存放L9950的控制和狀態(tài)反饋字,初始狀態(tài)均為 0,這里值得注意的是,在 CSN信號啟動一幀24位的發(fā)送和接收時,均從寄存器的第0位開始。所以數(shù)組的第0項、第1項、第2項應(yīng)經(jīng)由MCU寄存器SPDR的過渡分別存放一幀的bit0~bit7、bit8~bit15和bit16~bit23。
下面以控制車門后視鏡為例,詳述控制過程。硬件連接方案如上原理圖所示,后視鏡由OUT1~3口進(jìn)行控制,實現(xiàn)X-Y方向旋轉(zhuǎn)功能。OUT1口連接電機(jī)的公共端,OUT2口連接X軸電機(jī),OUT3口連接Y軸電機(jī)。具體的相關(guān)寄存器位的設(shè)置由表1給出:
表1 寄存器相關(guān)位的設(shè)置
以后視鏡Y軸水平旋轉(zhuǎn)為例,OUT1高端(High Side)和OUT2低端(Low Side)置1,電流由前者流向后者,電機(jī)左轉(zhuǎn)。相反,OUT1低端(High Side)和OUT2高端(Low Side)置1,電流由后者流向前者,電機(jī)右轉(zhuǎn)。這一段的寄存器位位于SPISend0[0]中,相關(guān)代碼如下:
L9950在接受一幀24位的控制字的同時,發(fā)送一個24位的狀態(tài)反饋幀。這樣在完成一個控制過程的同時,將會有2個狀態(tài)反饋幀,每個反饋幀的bit18~bit23含義相同,各位中包含了Vs過壓欠壓,熱關(guān)閉等芯片的全局故障。剩下的位中,第0幀(即狀態(tài)寄存器0的數(shù)據(jù))存放各個OUT口的短路故障信息。第1幀(即狀態(tài)寄存器1的數(shù)據(jù))存放各個OUT口的斷路故障信息。在本例中這些數(shù)據(jù)通過串口收發(fā)函數(shù)發(fā)送到上位機(jī)進(jìn)行數(shù)據(jù)處理及顯示。
SPI控制字發(fā)送函數(shù)L9950Send首先拉底CSN電平,啟動一幀的開始,數(shù)組從低位開始送入 8位數(shù)據(jù)寄存器SPDR,然后判斷接受滿、發(fā)送空標(biāo)志位,置位后循環(huán)跳出,將SPDR中收到的數(shù)據(jù)存在相應(yīng)數(shù)組中,這樣循環(huán)三次,發(fā)送接收滿24位一幀為止。流程圖如圖3所示。
圖3 L9950Send()執(zhí)行流程
整個車門控制系統(tǒng)程序執(zhí)行前,首先要對SPI進(jìn)行初始化工作。然后進(jìn)入全局掃描循環(huán)階段。在該過程中,相應(yīng)的按鍵或來自上位機(jī)的命令將會對相應(yīng)的控制功能函數(shù)進(jìn)行調(diào)用,該函數(shù)的形式基本相同,區(qū)別僅在于寫入SPISend控制字的不同。軟件流程圖見圖4。
值得注意的是,在功能函數(shù)中對 L9950Send控制字發(fā)送函數(shù)進(jìn)行調(diào)用時,返回的將是之前一次調(diào)用該函數(shù)的反饋狀態(tài),即上一次發(fā)送控制字時所產(chǎn)生的狀態(tài)控制字。所以要得到當(dāng)前的狀態(tài),進(jìn)行故障診斷,必須在輸入變量相同的情況下調(diào)用該函數(shù)兩次。
主測試界面采用VB提供的串口通信等多種控件,開發(fā)了虛擬的實驗臺面板,提供接受數(shù)據(jù)位的顯示和狀態(tài)文本顯示。如圖5所示。
在圖6和圖7所示的電路演示板的運(yùn)行模式下,當(dāng)有組合開關(guān)按下時,相應(yīng)的函數(shù)將會被調(diào)用,執(zhí)行SPI操作來控制和檢測門上設(shè)備。反饋的車門部件狀態(tài)數(shù)據(jù)通過SCI口發(fā)送至上位機(jī)。數(shù)據(jù)經(jīng)由測試程序處理,通過文本的方式顯示在屏幕上,直觀可以看出運(yùn)行狀態(tài)。如果系統(tǒng)運(yùn)行正常,相應(yīng)的部件便會執(zhí)行操作命令,運(yùn)行正常的信息會顯示于主測試界面上。 如果系統(tǒng)部件出現(xiàn)故障則立即會顯示故障信息,判斷其為短路還是開路。經(jīng)測試系統(tǒng)達(dá)到相關(guān)性能要求。
圖4 SPI函數(shù)執(zhí)行流程
圖5 主測試界面
圖6 演示電路板
圖7 連接于車門上的演示電路板
本文中將小體積帶 SPI口的驅(qū)動芯片代替了大體積的繼電器來實現(xiàn)控制功能,且MCU中SPI接口的應(yīng)用有效降低車身控制模塊(BCM)的體積,和總線型車身控制設(shè)計理念相一致。
另外,除了在車門部件控制中可以得到應(yīng)用以外,車身控制中的遙控,車燈系統(tǒng)的控制和按鍵系統(tǒng)均可通過 SPI實現(xiàn),而且可以復(fù)用,有效降低了車身控制中MCU中I/O口使用較緊張的局面,同時不影響傳輸速度。隨著代替繼電器的各類驅(qū)動芯片的普及,SPI控制技術(shù)將會得到越來越廣泛的應(yīng)用。
[1]王宜懷,劉曉升,嵌入式系統(tǒng)基礎(chǔ)教程[M].北京:清華大學(xué)出版社, 2005.
[2]劉慧銀,程建平,龔光華等.微控制器MC68 HC08原理及其嵌入式的應(yīng)用[M].2001
[3]L9950 Door Actuator Driver Datasheet[S].ST Microelectronics,2004.
[4]MC68HC908AZ60A,Rev.6[S].Freescale Semi conductor Inc,1998.