魏峰+田錦
摘 要: 在此論述了嵌入式車載終端的存儲系統(tǒng)抗干擾設(shè)計方法。以車載終端在現(xiàn)實工作環(huán)境中所遇故障為例,分析溫度、文件系統(tǒng)、芯片質(zhì)量及存儲電路設(shè)計等幾種疑似故障原因并列出論證方法,通過改進NANDFLASH的設(shè)計電路,增加電容以保障存儲系統(tǒng)端口電壓從而達到穩(wěn)定電路的目的,可以方便地擴充到同類系統(tǒng)的設(shè)計方案中。在實際工作環(huán)境中,實驗證明了方案的有效性。
關(guān)鍵詞: 嵌入式系統(tǒng); NANDFLASH; U?boot; BootStrap; 抗干擾
中圖分類號: TN911?34; TP368.2 文獻標識碼: A 文章編號: 1004?373X(2015)14?0052?03
0 引 言
近年來隨著嵌入式技術(shù)的發(fā)展,在智能公交行業(yè)隨處可見嵌入式系統(tǒng)產(chǎn)品。常見的嵌入式Linux系統(tǒng)硬件是由微處理器、外圍存儲器、I/O系統(tǒng)以及外設(shè)組成,南京普天研發(fā)生產(chǎn)的CPVD?IV型智能調(diào)度設(shè)備采用AT91SAM9260為主控芯片,以三星公司生產(chǎn)的64 MB的K9F1208UOD作為NANDFLASH,以K4s561632J為SDRAM所組成的一套嵌入式系統(tǒng)方案。
公交車載設(shè)備由于工作環(huán)境復(fù)雜,受溫度、車況、電源和道路等條件影響故障幾率很高。針對在商業(yè)使用初期出現(xiàn)的問題以及造成的干擾,歷經(jīng)各種方案分析和實驗驗證,從而確定故障的問題所在并進行集成電路的改進和完善。
1 嵌入式系統(tǒng)啟動過程分析
嵌入式設(shè)備開機后BootStrap引導(dǎo)加載NANDFLASH中U?boot程序,然后解壓Linux內(nèi)核,啟動文件系統(tǒng)和應(yīng)用程序,從而使終端進入工作狀態(tài)[1]。
1.1 Bootstrap啟動過程
AT91SAM9260具有片內(nèi)和片外2種引導(dǎo)方式,由于本系統(tǒng)采用外部NANDFLASH引導(dǎo),所以設(shè)置BMS=0;系統(tǒng)上電后,MCU會自動將NANDFLASH的前4 KB代碼(Bootstrap)拷貝到SRAM中運行[2]。Bootstrap首先進入main()函數(shù)中執(zhí)行hw_init()初始化硬件:關(guān)閉看門狗器件,避免因為初始化硬件造成無法喂狗而頻繁重啟,然后配置相關(guān)的PLL頻率,使能I?Cache,配置相關(guān)的PIOS,使管腳輸出合適的電平啟動周圍外設(shè),并進一步配置Matrix,算法流程圖1所示。
部分代碼如下:
/* Disable watchdog */
writel(AT91C_WDTC_WDDIS, AT91C_BASE_WDTC + WDTC_WDMR);
/* Configure PLLA = MOSC * (PLL_MULA + 1) / PLL_DIVA */
pmc_cfg_plla(PLLA_SETTINGS, PLL_LOCK_TIMEOUT);
/* Switch MCK on PLLA output PCK = PLLA = 2 * MCK */
pmc_cfg_mck(MCKR_SETTINGS, PLL_LOCK_TIMEOUT);
/* Configure PLLB */
pmc_cfg_pllb(PLLB_SETTINGS, PLL_LOCK_TIMEOUT);
圖1 Bootstrap啟動流程圖
初始化硬件后,調(diào)用load_NANDFLASH(IMG_ADDRESS, IMG_SIZE, JUMP_ADDR)函數(shù)從內(nèi)存空間中調(diào)用U?boot映像到JUMP_ADDR地址中運行。函數(shù)參數(shù)定義如下:
#define IMG_ADDRESS 0x20000
/* Image Address in NANDFLASH */
#define IMG_SIZE 0x30000
/* Image Size in NANDFLASH */
#define MACH_TYPE 0x44B
/* AT91SAM9260?EK */
#define JUMP_ADDR 0x23F00000
/* Final Jump Address */
對于BootStrap的大小,根據(jù)AT91SAM9260芯片內(nèi)存空間設(shè)置的大小,限制在4 KB大小,SRAM空間大小分配[3]如圖2所示。
圖2 AT91SAM9260內(nèi)存分配圖
1.2 U?boot啟動過程分析
U?boot加載后,主要分成兩個階段來啟動:第一段進入Start.S用匯編語言實現(xiàn)MCU體系結(jié)構(gòu)的設(shè)備初始化;第二階段進入start_armboot() 用C語言來實現(xiàn)外圍所用到的硬件體系,并在do_bootm()中執(zhí)行do_bootm_Linux()來調(diào)用Linux內(nèi)核。
2 NANDFLASH系統(tǒng)設(shè)計方案
NANDFLASH作為智能調(diào)度設(shè)備的主體部分,存儲大部分數(shù)據(jù)信息和引導(dǎo)開機程序鏡像,能否正常工作非常重要。K9F1208為三星公司出產(chǎn)的64 MB的NANDFLASH,在商業(yè)領(lǐng)域和工業(yè)領(lǐng)域應(yīng)用廣泛,為Atmel公司設(shè)計的標配方案選擇芯片。芯片管腳圖如圖3所示,主要數(shù)據(jù)線[4]是:
[RE]:連接MCU的NANDOE管腳,控制NANDFLASH讀使能;
[WE]:連接MCU的NANDWE管腳,控制NANDFLASH寫使能;
[RB]:NANDFLASH讀/忙控制管腳,連接MCU的PC13管腳,并通過10 KΩ上拉電阻接入3.3 V電壓。
圖3 NANDFLASH管腳圖
3 故障現(xiàn)象及理論分析
在產(chǎn)品應(yīng)用初期,現(xiàn)場開機工作時候出現(xiàn)故障:LCD顯示屏出現(xiàn)“白屏”現(xiàn)象,無任何顯示信息,且串口無任何調(diào)試信息;而同一產(chǎn)品在實驗室啟動正常,能顯示諸如gprs,gps等圖標。此故障占設(shè)備總數(shù)的30%,嚴重地阻礙了產(chǎn)品的交付使用。從使用環(huán)境、芯片質(zhì)量和電路設(shè)計等方面分析出現(xiàn)此類故障原因有以下幾種:
3.1 高溫導(dǎo)致系統(tǒng)工作不正常
由于公交車工作環(huán)境比較惡劣,顛簸比較厲害,而且夏季太陽高溫直曬,很容易造成設(shè)備故障。認為高溫是故障的原因之一,理由如下:
(1) 車載設(shè)備出現(xiàn)故障高發(fā)原因在6月以后,為夏季高溫時間,且設(shè)備很容易受太陽直射;
(2) 車載設(shè)備安裝位置靠近發(fā)動機位置,發(fā)動機工作致使車蓋位置溫度燙手;
(3) 由于防水的原因,設(shè)備外殼采用鋁制外殼,結(jié)實且密不透風(fēng),很容易將外面高溫導(dǎo)入設(shè)備內(nèi)部;
(4) 經(jīng)測試高溫時設(shè)備內(nèi)部達到60 ℃左右,有可能造成MCU無法正常工作。
針對高溫問題,分別采取以下措施和方法驗證:
(1) 修改設(shè)備安裝位置,遠離發(fā)動機、水箱和光照強的地方,避免高溫傳導(dǎo)造成設(shè)備內(nèi)問題提升;
(2) 進行高溫實驗,隨機抽取10~20臺設(shè)備連續(xù)高溫24 h以上驗證超高溫后能否正常工作。
經(jīng)連續(xù)3個批次高溫驗證,實驗數(shù)據(jù)如表1所示。
表1 高溫老化測試數(shù)據(jù)
經(jīng)實驗數(shù)據(jù)可以得出結(jié)論,過高溫可以出現(xiàn)部分延遲啟動但不是出現(xiàn)此類故障原因的主要問題,此原因排除。
3.2 YAFFS2文件系統(tǒng)存在BUG
YAFFS2文件系統(tǒng)具有可讀/寫、能夠識別并標識 NANDFLASH壞塊的功能,如果判別存儲器為壞的情況下工作不會正常。針對此類問題專門撰寫一個針對數(shù)據(jù)的循環(huán)打開讀/寫的程序來驗證設(shè)備,發(fā)現(xiàn)經(jīng)過3 h以上的不斷循環(huán)讀/寫后,在串口終端會發(fā)出NANDFLASH出現(xiàn)大量“bad block…”等信息,并使系統(tǒng)無法正常啟動。由于啟動信息會出現(xiàn),不是需要解決的故障原因。通過破壞性測試檢測出YAFFS2文件系統(tǒng)的脆弱性,此版本軟件無法長時間進行讀/寫,此后修改為可讀/寫的JFFS2文件系統(tǒng)[5],避免了因為大量壞塊信息導(dǎo)致無法對NANDFLASH進行讀/寫的YAFFS2的BUG。
3.3 NANDFLASH質(zhì)量不過關(guān)
針對此類問題,對出現(xiàn)故障設(shè)備采取更換NANDFLASH措施,實驗效果如舊,經(jīng)同類比較此原因排除。
3.4 電路抗干擾能力不強
針對上述原因排除,將注意力轉(zhuǎn)到集成電路本身,由于電路屬于Atmel經(jīng)典設(shè)計方案,經(jīng)過全世界無數(shù)生產(chǎn)廠家使用驗證不存在設(shè)計方案錯誤問題,只能根據(jù)代碼走向流程來進行大膽假設(shè),認為NANDFLASH根本工作。針對這種問題,輸入不同電源電壓,比較不同結(jié)果,數(shù)據(jù)如表2所示。
表2 嵌入式系統(tǒng)電源供給效果顯示
根據(jù)不同電壓數(shù)據(jù)可以得出,提升電源電壓后嵌入式系統(tǒng)穩(wěn)定工作,與設(shè)備工作現(xiàn)場故障現(xiàn)象相似。根據(jù)公交公司反饋情況最后得出由于公交車蓄電池老化,導(dǎo)致電池供電不穩(wěn),為故障的主要原因。在于蓄電池從逐漸啟動到正常供電過程中,由于過程漫長而NANDFLASH由于已經(jīng)處在故障狀態(tài),導(dǎo)致嵌入式系統(tǒng)無法正常工作。
4 FLASH電路改進及測試結(jié)果分析
由上述理論研究和實驗結(jié)果可以證明,改變NANDFLASH供給電源成為主要的解決問題的關(guān)鍵。分析AT91SAM9260與NANDFLASH連接的管腳,當[RB]輸入的電平為高時可以從NANDFLASH讀數(shù)據(jù),為低則存儲器處于忙狀態(tài),系統(tǒng)無法讀取數(shù)據(jù),處于錯誤狀態(tài),此為問題所在。解決問題關(guān)鍵在于解決[RB]電平干擾,采取外接100 pF電容方案能夠解決電壓故障,并通過電容充電可以使系統(tǒng)啟動正常[6],電路如圖4所示。
圖4 NANDFLASH保護電路圖
保護電路修改后,模擬現(xiàn)場電池環(huán)境供給,串口輸出:
Start AT91Bootstrap...
顯示已經(jīng)MCU已經(jīng)從NANDFLASH讀出數(shù)據(jù)并串口輸出,電路修改正常。
5 創(chuàng)新點
通過MCU的控制端口直接與NANDFLASH外圍管腳相連是通用標準電路,本方案通過修改NANDFLASH的外圍控制電路,增加[RB]管腳電壓控制保護,從而達到消除系統(tǒng)電源不穩(wěn)定狀態(tài)下的干擾問題。
6 結(jié) 語
本文以智能車載產(chǎn)品為基礎(chǔ),討論并解決在實際工作中嵌入式系統(tǒng)設(shè)備所出現(xiàn)的穩(wěn)定性問題。為了進行更深入的研究和開發(fā),還需要對嵌入式系統(tǒng)的底層驅(qū)動和功能進行開發(fā),以便實現(xiàn)更多的功能。隨著信息技術(shù)的快速發(fā)展,嵌入式系統(tǒng)中存儲技術(shù)應(yīng)用必將更穩(wěn)定,并在智能交通領(lǐng)域得到廣泛應(yīng)用。
參考文獻
[1] 孫紀坤,張小全.嵌入式Linux系統(tǒng)開發(fā)技術(shù)詳解:基于ARM[M].北京:人民郵電出版社,2006.
[2] 程前,陳思泰.基于AT91SAM9260的嵌入式系統(tǒng)的Bootloader啟動流程[EB/OL].[2015?02?15].http://www.docin.com.
[3] 劉淼.嵌入式系統(tǒng)接口設(shè)計與Linux驅(qū)動程序開發(fā)[M].北京:北京航空航天大學(xué)出版社,2006.
[4] Anon.ARM的啟動代碼(2):AT91SAM9260啟動詳解 [EB/OL].[2011?08?23].http://blog.csdn.net/coolbacon/article.
[5] 宋寶華.Linux設(shè)備驅(qū)動開發(fā)詳解[M].北京:人民郵電出版社,2008.
[6] 安毅,蔡伯根.基于ARM的嵌入式大容量存儲設(shè)備的設(shè)計[J].微計算機信息,2008(17):146?148.
[7] 楊忻愷,張為公,于兵,等.基于DSP的車載視頻監(jiān)控存儲系統(tǒng)的設(shè)計[J].電子器件,2009(4):805?808.