魏峰+田錦


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