沈萬松
(同濟(jì)大學(xué)汽車學(xué)院,上海 200092)
汽車中的LIN(Local Interconnect Network)總線網(wǎng)絡(luò)又被稱為局部互連網(wǎng)絡(luò),它是在汽車CAN總線網(wǎng)絡(luò)出現(xiàn)后的又一種分布式車輛電子控制網(wǎng)絡(luò)系統(tǒng)。LIN總線具有結(jié)構(gòu)簡單,開發(fā)成本低廉等特點(diǎn),為現(xiàn)有多種汽車網(wǎng)絡(luò)提供了功能上的補(bǔ)充,同時(shí)簡化了多種現(xiàn)存的多點(diǎn)解決方案,因此,它在當(dāng)今汽車電子業(yè)中被廣泛使用。在車輛電器的網(wǎng)絡(luò)布置結(jié)構(gòu)中,LIN總線主要被運(yùn)用在儀表系統(tǒng)、空調(diào)、座椅、雨刮器、后視鏡、雨量/光照傳感器、天窗等汽車電器零部件中,它擔(dān)負(fù)著在各個(gè)汽車電器零部件與智能車載控制器之間傳遞數(shù)據(jù)的任務(wù)。
對于一個(gè)優(yōu)秀的汽車電子工程師來說,在設(shè)計(jì)開發(fā)基于LIN總線的車輛電器部件及電器網(wǎng)絡(luò)的時(shí)候,需要始終了解LIN總線中傳遞的動態(tài)數(shù)據(jù)信息,并能夠及時(shí)準(zhǔn)確地捕捉到LIN總線中所傳遞的數(shù)據(jù)信息,為此,具備對LIN總線上實(shí)施信號捕捉的數(shù)據(jù)信號監(jiān)視設(shè)備是一個(gè)必不可少的工具。本文將圍繞如何設(shè)計(jì)一個(gè)有效的LIN總線數(shù)據(jù)監(jiān)視器并實(shí)現(xiàn)LIN信號的捕獲而進(jìn)行一系列闡述。
為了能夠滿足更加精確地監(jiān)聽LIN總線上的信號,更加快速地把接收到的數(shù)據(jù)傳遞到PC電腦,支持不同版本的LIN總線協(xié)議規(guī)則以及低功耗等設(shè)計(jì)要求,本設(shè)計(jì)選用了由埃爾姆(ELM)電子電器公司所提供的ELM633器件作為LIN總線數(shù)據(jù)監(jiān)視器的硬件主芯片,該芯片具有持續(xù)監(jiān)視一個(gè)LIN網(wǎng)絡(luò)的數(shù)據(jù)傳輸、持續(xù)轉(zhuǎn)換LIN信息幀信息以標(biāo)準(zhǔn) ASCII代碼輸出、重復(fù)發(fā)送數(shù)據(jù)至RS232接口等功能,這使得在PC或是PDA等終端設(shè)備上可以輕松實(shí)現(xiàn)LIN總線的數(shù)據(jù)讀取及后續(xù)數(shù)據(jù)分析等工作。此外,ELM633芯片支持固定的LIN總線數(shù)據(jù)通信波特率速度19200BPS,符合目前各大汽車廠商所采用的高速LIN總線數(shù)據(jù)通信的速度要求。ELM633芯片共有8個(gè)針腳,根據(jù)不同的需要有PDIP和SOIC兩種封裝方式可供設(shè)計(jì)人員進(jìn)行選擇,圖1為PDIP插入式封裝形式的ELM633芯片以及針腳示意圖。
圖1 ELM633芯片PDIP封裝形式和芯片元件針腳示意圖
根據(jù)圖1所示,針腳PIN1(VDD)為正電源引腳,在電路中總是與電路的正極端連接,該ELM633芯片的正常供電電壓范圍在4.5伏至5.5伏之間。針腳PIN2(XT1)和PIN3(TX2)用于連接晶體振蕩器并對內(nèi)部時(shí)鐘操作電路提供定時(shí)信號,使用3.57954MHZ頻率的晶體振蕩器被連接在這兩個(gè)針腳之間,同時(shí)再使用2個(gè)推薦值為27pF的晶體負(fù)載電容分別連接在PIN2、PIN3與電路的負(fù)極之間,這樣可以保證LIN總線上有正常的數(shù)據(jù)傳送速率。針腳PIN4(Rxmode)是用來控制在RS232接收輸入端上的信號電平轉(zhuǎn)換,這為各種不同的RS232接口連接方法提供更加靈活的設(shè)置。如果在RS232接口與本芯片的PIN5(RS232Rx)引腳之間僅僅使用一個(gè)電阻連接來減少硬件成本,在這種情況下該引腳就可直接連接到電路負(fù)極,內(nèi)部邏輯電路會自動轉(zhuǎn)換信號極性。如果使用一些標(biāo)準(zhǔn)的電平轉(zhuǎn)換接口電路,如MAX232系列轉(zhuǎn)換芯片或是SN75189/MC1489等電子元器件。在這些情況下ELM633芯片的內(nèi)部轉(zhuǎn)換電路就可不被使用,通過將該針腳PIN4(Rxmode)與系統(tǒng)供電正極相連接來屏蔽內(nèi)部轉(zhuǎn)換的電路。外圍RS232接口可以直接和ELM633芯片的RS232接收輸入端進(jìn)行連接。針腳 PIN5(RS232Rx)是該器件RS232接口的數(shù)據(jù)接收輸入端口,它可以通過一個(gè)電阻或是一個(gè)電平轉(zhuǎn)換器件和PC電腦上的RS232發(fā)送信號端口相連接。如果ELM633芯片發(fā)現(xiàn)該針腳處于一個(gè)激活狀態(tài),特殊的上電監(jiān)控模式被啟用以使系統(tǒng)進(jìn)入完全啟動階段,在這個(gè)模式下,ELM633芯片會顯示ID字符串并立即執(zhí)行相關(guān)命令來監(jiān)視整個(gè)LIN總線上信號活動狀態(tài)。針腳PIN6(Txmode)是RS232接口的發(fā)送數(shù)據(jù)輸出引腳,在空閑階段,即沒有數(shù)據(jù)被傳送的時(shí)候,這個(gè)針腳將輸出一個(gè)高電平。針腳PIN7(LIN)是一個(gè)輸入端口,用于接收LIN總線的信號,由車輛LIN總線上傳來的信號被轉(zhuǎn)換和進(jìn)行緩沖后被傳遞到該引腳,注意該引腳的輸入信號僅限于在零伏至系統(tǒng)電壓之間,因此,該引腳不可以直接連接到車輛LIN總線上。針腳PIN8(Vss)是整個(gè)器件的接地點(diǎn),它應(yīng)該和整個(gè)電路的接地點(diǎn)相連接。為了更加快速地把LIN總線上讀取的信號傳遞到外部設(shè)備上,ELM633器件與外部PC電腦之間串口通信的速度被定為每秒57600個(gè)比特位,這個(gè)速度遠(yuǎn)遠(yuǎn)大于ELM633器件監(jiān)視LIN總線上數(shù)據(jù)傳輸速度19200BPS,這樣就可以保證該器件能夠足夠快地捕捉到LIN總線上的信號。
為了使用一個(gè)標(biāo)準(zhǔn)可靠的RS232接口數(shù)據(jù)傳輸方式,本設(shè)計(jì)選用一個(gè)MAX232電平轉(zhuǎn)換芯片連接在ELM633和PC電腦的RS232接口之間,同時(shí)為了使芯片內(nèi)部電平轉(zhuǎn)換電路不被啟用,PIN4端口必須被設(shè)置為邏輯高電平。由于測試車輛上LIN總線中的信號要用到車輛上的蓄電池電壓,一般車輛蓄電池的供電電壓為12伏,而用于監(jiān)控LIN總線數(shù)據(jù)的ELM633主芯片又需要5伏的外界電壓維持其工作,那么可以借用車輛蓄電池的電壓給ELM633芯片進(jìn)行供電。為此,在電路中需要設(shè)計(jì)一個(gè)12伏轉(zhuǎn)換成5伏的電壓轉(zhuǎn)換電路,78L05是一個(gè)被廣泛使用的3端正電源電壓調(diào)節(jié)器,它可以輸出5伏的固定電壓,適用于100mA電源供給的場合,另外在78L05器件的電壓輸入和輸出端口處安裝電容器進(jìn)行過濾,并在電路中使用LED小燈作為可視的反饋信號,以顯示有可供使用的正極供電電源信號。圖2為LIN總線數(shù)據(jù)監(jiān)視設(shè)備的供電系統(tǒng)原理圖。
圖2 LIN總線數(shù)據(jù)監(jiān)視系統(tǒng)供電原理圖
在車輛LIN總線與ELM633的用于接收LIN總線的信號的針腳PIN7之間需要按圖3所示連接一個(gè)PNP晶體管,用于輸入信號的電平轉(zhuǎn)換,一個(gè)典型的CMOS輸入將電平狀態(tài)轉(zhuǎn)換為系統(tǒng)供電電壓的一半左右,即2.5伏,這可能會導(dǎo)致在汽車使用的環(huán)境中出現(xiàn)噪音問題。通過提供一個(gè)晶體管緩沖,信號輸入閥值被有效地提高到4伏左右,在增加了信號增益、電平固定和轉(zhuǎn)換的同時(shí)提高了抗噪性能。同時(shí)在LIN信號的輸入端需要使用二極管,這可以防止破壞性的反饋信號進(jìn)入電路,并保護(hù)晶體管和其他電子元器件。
圖3 LIN總線數(shù)據(jù)監(jiān)視設(shè)備電路連接原理圖
由此可見,將LIN總線數(shù)據(jù)監(jiān)視設(shè)備中的系統(tǒng)供電電壓線Vbat、接地線GND和LIN總線,分別與車輛上的12伏蓄電池正極導(dǎo)線、接地線以及車輛LIN總線相連接,而RS232接口上的數(shù)據(jù)接收線、數(shù)據(jù)發(fā)送線和接地線分別連接到RS232的標(biāo)準(zhǔn)9針插口的2、3和5號插孔上,再與PC電腦上的9針串行口相連接,這樣便完成了LIN總線數(shù)據(jù)監(jiān)視設(shè)備的硬件連接設(shè)置,在PC電腦端上安裝相關(guān)的應(yīng)用軟件后,就可以實(shí)時(shí)獲取LIN總線上的動態(tài)數(shù)據(jù)了。
LIN標(biāo)準(zhǔn)使用的是一種串行通信協(xié)議,在很多方面和個(gè)人電腦所使用的RS232標(biāo)準(zhǔn)一樣。而在標(biāo)準(zhǔn)的RS232通信標(biāo)準(zhǔn)和LIN總線通信協(xié)議之間的區(qū)別在于LIN總線中還使用了一個(gè)“同步”信號。LIN總線的同步信號由至少13個(gè)連續(xù)位時(shí)間組成,并且都以激活狀態(tài)“0”來表示,這個(gè)至少13個(gè)連續(xù)狀態(tài)“0”位時(shí)間長度在普通的RS232系統(tǒng)標(biāo)準(zhǔn)中從來沒有出現(xiàn)過,而普通的標(biāo)準(zhǔn)RS232協(xié)議中只會出現(xiàn)一個(gè)起始位和8個(gè)數(shù)據(jù)位總共最多9個(gè)激活狀態(tài)“0”位。由此,這13個(gè)連續(xù)狀態(tài)“0”位時(shí)間長度信號就被稱為“同步”信號,它總是由LIN總線系統(tǒng)中的主控制器所產(chǎn)生,該“同步”信號的出現(xiàn)也意味著一組數(shù)據(jù)幀信息傳遞操作將要被實(shí)施。因此,一旦同步信號發(fā)生,信息幀字節(jié)信息將與RS232標(biāo)準(zhǔn)相同的方式被全部發(fā)送出去。被發(fā)送出去的每個(gè)信息幀由兩部分組成,即信息頭部分和應(yīng)答信息部分。LIN總線系統(tǒng)中的主控制器(主節(jié)點(diǎn))總是發(fā)出信息頭部分,而應(yīng)答信息部分可根據(jù)主控制器是發(fā)送數(shù)據(jù)還是獲得數(shù)據(jù)的狀態(tài)分別由主控制器和LIN總線上的子控制器(子節(jié)點(diǎn))來完成。
信息頭中的第一個(gè)字節(jié)被認(rèn)為是“同步字節(jié)”,該字節(jié)的數(shù)值總是被定為0x55,這是因?yàn)樵撟止?jié)的信息創(chuàng)建了一個(gè)比特位“0”和比特位“1”之間的替換模式,它可以被子控制器用來執(zhí)行一個(gè)內(nèi)部定時(shí)標(biāo)定工作,這樣子控制器就可以使用廉價(jià)的RC振蕩器來實(shí)現(xiàn),硬件成本可以得到大幅降低。跟隨著同步字節(jié)之后的是“標(biāo)識字節(jié)”信息,它總是由主控制器發(fā)出,用來表述該信息的具體用途,因此,它也可以被認(rèn)為是一個(gè)命令字節(jié)。應(yīng)答信息部分出現(xiàn)在標(biāo)識字節(jié)信息之后,它通常有2個(gè)、4個(gè)、6個(gè)或是8個(gè)字節(jié)所組成,此外,在其最后還有一個(gè)“校驗(yàn)和”字節(jié)。圖4顯示的是一個(gè)完整的LIN總線信息幀結(jié)構(gòu)。
圖4 LIN總線信息幀結(jié)構(gòu)示意圖
ELM633器件憑借一個(gè)標(biāo)準(zhǔn)的RS232串口與用戶界面進(jìn)行通信聯(lián)系,串口通常也是計(jì)算機(jī)與外部設(shè)備之間的數(shù)據(jù)傳輸通道,其通信方便易行,應(yīng)用廣泛,因此本設(shè)計(jì)在Visual C++6.0下利用WINDOWS API所提供的通信函數(shù)來完成串行通信程序的編制。
在WIN32中,串口和其他通信設(shè)備均被作為文件處理,串口的打開、關(guān)閉和讀寫等操作所有的API函數(shù)與操作文件的函數(shù)相同。利用CreateFile()函數(shù)可以打開串口,獲得串行設(shè)備句柄并對其進(jìn)行通信參數(shù)設(shè)置,包括設(shè)置輸出、接收緩沖區(qū)、超時(shí)控制和事件監(jiān)視等;GetCommState()函數(shù)可以獲取當(dāng)前串口所設(shè)定的波特率數(shù)值、有無奇偶校驗(yàn)、數(shù)據(jù)位和停止位信息。由于ELM633和外界設(shè)備串口通信的數(shù)據(jù)傳輸波特率設(shè)為固定值57600波特,通信參數(shù)被定為八位數(shù)據(jù)位,一位停止位、沒有校驗(yàn)位以及沒有握手信號,因此,如果當(dāng)前設(shè)備與ELM633器件相連接的串口通信參數(shù)數(shù)據(jù)不符合要求,可以通過BCD結(jié)構(gòu)體并使用SetCommState()函數(shù)命令來設(shè)置當(dāng)前串口的通信參數(shù),以滿足ELM633器件串口通信的參數(shù)要求。
在串口通信參數(shù)設(shè)置好以后,就可以編寫發(fā)送給ELM633器件指令的相關(guān)程序。在ELM633器件中規(guī)定了使用兩個(gè)字母“AT”開頭的指令集,比如有詢問當(dāng)前監(jiān)視LIN總線的數(shù)據(jù)通信波特率速度,設(shè)置 ELM633器件默認(rèn)狀態(tài)值,顯示當(dāng)前ELM633器件的ID標(biāo)識信息字符串,復(fù)位整個(gè)ELM633器件,監(jiān)視總線上的所有信息幀以及監(jiān)視單個(gè)特定標(biāo)識信息幀等指令。在VC中要實(shí)現(xiàn)串口數(shù)據(jù)的發(fā)送可以使用WriteFile()函數(shù),對于使用異步輸入輸出的操作方式,可以同時(shí)對一個(gè)串行設(shè)備進(jìn)行讀寫操作,在使用該發(fā)送指令的時(shí)候,最后一個(gè)參數(shù)必須是一個(gè)指向&overlapped結(jié)構(gòu)的指針,可通過&overlapped結(jié)構(gòu)來獲得當(dāng)前的操作狀態(tài)。因此可以先根據(jù)要求定義一個(gè)用于存放發(fā)送命令字節(jié)的數(shù)組,對數(shù)組中的每個(gè)數(shù)組元素進(jìn)行賦值,然后再運(yùn)用WriteFile()函數(shù)將特定的AT指令發(fā)送給ELM633器件。數(shù)據(jù)接收的任務(wù)由ReadFile()函數(shù)來完成,該函數(shù)從串口接收緩沖區(qū)中讀取數(shù)據(jù),在讀取數(shù)據(jù)前,先用ClearCommError()函數(shù)獲得接收緩沖區(qū)中的字節(jié)數(shù)。另外,在程序中還要開一個(gè)用于接收數(shù)據(jù)的線程對串口接收數(shù)據(jù)事件進(jìn)行監(jiān)視,當(dāng)監(jiān)視事件發(fā)生時(shí),該線程可將這個(gè)事件登記到對事件進(jìn)行處理的窗口類中。在整個(gè)應(yīng)用程序結(jié)束或不再使用串行設(shè)備的情況下應(yīng)該將串行口關(guān)閉,可以利用CloseHandle()函數(shù)來關(guān)閉串口以及事件句柄操作。圖5為汽車LIN總線數(shù)據(jù)監(jiān)視器軟件設(shè)計(jì)流程圖。
圖5 汽車LIN總線數(shù)據(jù)監(jiān)視器軟件設(shè)計(jì)流程圖
針對ELM633器件,本設(shè)計(jì)通過使用Visual C++6.0編程軟件開發(fā)了LIN總線數(shù)據(jù)監(jiān)視設(shè)備的應(yīng)用軟件LIN-BUS-Monitor。在該軟件的主界面上可以實(shí)現(xiàn)對串行口及其通信參數(shù)的設(shè)置,開始或停止接收數(shù)據(jù)按鈕發(fā)送針對硬件的操作命令,包括版本信息查詢,監(jiān)視整個(gè)總線上的動態(tài)數(shù)據(jù)以及只監(jiān)視特定標(biāo)識信息幀數(shù)據(jù)等功能。
開啟軟件后首先要完成串口號的選擇和正確波特率參數(shù)的設(shè)置。在串口號輸入框中輸入串口號“COM1”數(shù)據(jù),然后點(diǎn)擊“COM Config”按鈕后,在串口配置顯示框中會顯示出當(dāng)前串口的波特率、停止位、數(shù)據(jù)位和校驗(yàn)位信息,如果此時(shí)的波特率信息不符合要求,可以在波特率設(shè)定輸入框中輸入波特率數(shù)值信息,并按“Set Baud”按鈕對其進(jìn)行設(shè)定,然后再次點(diǎn)擊讀取串口配置信息按鈕后,新狀態(tài)的波特率參數(shù)會顯示在串口配置顯示框中。
在正確設(shè)置了串口配置信息之后,就可以選擇發(fā)送設(shè)置區(qū)域中的按鈕選項(xiàng)來對ELM633器件發(fā)送指令了。如果要監(jiān)視當(dāng)前LIN總線上所有的信息幀數(shù)據(jù),可以點(diǎn)擊發(fā)送設(shè)置中的監(jiān)視全部信息(Monitor ALL)按鈕,此時(shí)在發(fā)送指令信息框中就會出現(xiàn)“Monitoring ALL Frame Status……OK!”的字樣,同時(shí)在接收數(shù)據(jù)區(qū)域中立刻會顯示出當(dāng)前LIN總線上所有被監(jiān)視到的LIN總線數(shù)據(jù)信息,如果想要監(jiān)視固定單個(gè)信息幀數(shù)據(jù)變化的情況,可以通過輸入所需要特別監(jiān)視的信息幀識別號ID(十六進(jìn)制),然后單擊“Monitor ONE”按鈕來監(jiān)視特定單個(gè)識別號的信息幀數(shù)據(jù),這個(gè)功能可以滿足使用者對單個(gè)LIN總線信息幀數(shù)據(jù)內(nèi)容進(jìn)行測試分析,操作顯示界面如圖6所示。
圖6 LIN總線上所有信息幀顯示和LIN總線識別號為0xE2的單個(gè)信息幀數(shù)據(jù)顯示
本設(shè)計(jì)通過對ELM633芯片及外圍電路的搭建,創(chuàng)建了適用于監(jiān)視車輛LIN總線數(shù)據(jù)的硬件環(huán)境,配合PC電腦終端上安裝的LIN總線數(shù)據(jù)監(jiān)視應(yīng)用軟件,實(shí)現(xiàn)了對LIN總線上所有信息幀的監(jiān)視或指定單個(gè)標(biāo)識符信息幀的監(jiān)視操作。該LIN總線數(shù)據(jù)監(jiān)視工具的實(shí)現(xiàn)有助于車輛設(shè)計(jì)開發(fā)工程師對LIN總線信號測試和數(shù)據(jù)分析,也有助于對車輛LIN總線感興趣的工程人員更快、更直觀地學(xué)習(xí)LIN總線的相關(guān)知識。LIN總線數(shù)據(jù)監(jiān)視器的實(shí)現(xiàn)具有一定的實(shí)用價(jià)值。
[1]侯俊杰.深入淺出Windows MFC程序設(shè)計(jì)[M].武漢:華中理工大學(xué)出版社,1998.
[2]李景峰.Visual C++串口通信技術(shù)詳解[M].北京:機(jī)械工業(yè)出版社,2010.
[3]劉俊萍.汽車電腦與總線技術(shù)[M].武漢:武漢理工大學(xué)出版社出版,2009.
[4]周韌研,商斌.Visual C++串口通信開發(fā)入門與編程實(shí)踐[M].北京:電子工業(yè)出版社,2009.
[5]李朝青.PC機(jī)及單片機(jī)數(shù)據(jù)通信技術(shù)[M].北京:北京航空航天大學(xué)出版社,2000.