今天,筆者要為大家分享一個由SD引發的災難,以及該災難被我們項目組攻克的技術案例。
去年上半年,我們公司承接了某大型廣告公司的電梯廣告顯示屏的項目,該產品使用了飛思卡爾的IMX6系列芯片作為主控CPU,具備媒體人機觸摸互動、媒體投放、遠程升級、錄像監控等功能。其中很重要的一項功能就是監控和保存功能,因客戶的報價較低,我們理所當然的選擇了SD卡作為錄像數據的保存介質。
沒想到,災難半年后就降臨了,半年前發貨的10K機器,每個月都有10%的損壞率,損壞的機器90%都是SD卡損壞了!關鍵的監控視頻信息全部丟失,客戶不但要求我們賠償SD卡的損失,延長質保期,而且威脅一個月內不解決將終止合作,客戶是老板的唯一大客戶,丟失這個客戶我們離解散就不遠。老板甚至放下狠話:一個月內不解決,你們跳槽,我跳樓。
項目組首先從客戶的使用的電梯的場景入手,場景的特點如下:
1、電梯內部布滿各種通信線、音視頻線、電力線,互相之間的干擾非常嚴重
2、電梯內的廣告機每天晚上12點至早上6點回自動斷電,白天自動上電
3、廣告機只要開機就需要一直錄像,保存到本地的SD卡中。
於是我們首先模擬現場的應用場景,第一個場景公司內部無法模擬,於是先模擬第二和第三個場景,事設備上電10分鍾,掉電5分鍾,只要一上電就開始錄像,提高上下電的頻率。樣本數量使用了50台。
實驗第一天,SD卡損壞0張;
實驗第二天,SD卡損壞1張;
實驗第三天SD卡損壞3張,一直到實驗到第6天,SD卡一共損壞8張。
我們基本找到SD卡損壞的原因:就是設備上下電導致的。於是大家分頭行動,從硬件和軟件、驅動着手,分析掉電可能引起的原因。
首先是驅動工程師查閱MMC的規范“JESD84-B45”時有發現,如下圖1所示
圖1 :JESD84-B45規范中掉電的要求。
文中大概的意思就是,主機在掉電關閉設備前,應該通知SD卡控制,由控制判斷掉電的緊迫性,從而進入對本身設備的保護模式,並且在這之前,應該保持設備的電源處於工作范圍之內。
繼續查閱SD卡2.0規范中,SD卡的標准只保證在讀數據過程中,意外斷電和移除可以對數據進行保護,對寫和擦除過程中的掉電的,完全沒有把握保護數據,也就是SD卡內部的本身固件、用戶數據都是有可能丟失的。
圖2:SD 2.0標准中對SD卡的保護闡述
通過查閱相關的規范,我們知道了原因的所在,就是我們的設備在斷電的時候,還在錄像保存數據,進行不斷的寫和擦除SD卡的操作。
經過討論,我們采用了如下的方案。.其中,方案的核心主要有3個
第一:掉電檢測電路;
第二:超級電容繼續供電電路
第三:掉電后軟件處理機制。
圖3:SD卡掉電保護的處理過程
下圖4是掉電檢測電路,可以精准的檢測一旦電壓跌落至10V(電源為12V供電),馬上送掉電信號給CPU。
圖4:掉電檢測電路
下圖5是超級電容的充放電電路,增加該電路可以使掉電后繼續維持2秒鍾的時間,使CPU完成掉電后的保護處理工作。
圖5:超級電容充放電電路
經過了上述的整改,我們生產了50台設備,進行連續7天24小時,10分鍾一個循環的上下電測試,沒有一台設備的SD卡損壞,證明了上述方案可行。老板的樓,終於不用跳了。
經驗總結,其實CPU原廠提供的DEMO參考設計,基本都是處在能用的狀態,離真正的高可靠應用,還有很大的距離,需要我們工程人員的不斷挖掘和積累。才能設計出高可靠性的產品。
創易棧小編點評:
上述案例Flash的損壞是供電系統不穩定造成,電源電壓的異常可能會導致系統單片機系統工作異常的現象,如輸出電壓小於單片機系統工作所需的最小電壓,輸出電壓不干凈,噪音嚴重等,這些很容易引起單片機內部電路的邏輯紊亂。
Flash的讀寫信號處於不穩定狀態,可能產生滿足Flash的寫操作,從而給系統帶來嚴重的損害。針對以上情況,可以在系統中加入電源監控芯片或使能MCU本身的電源監控電路,在電源異常的情況下禁止對Flash區域操作。
除了電源失效,會造成Flash損壞的常見原因還有以下幾種:
1、用戶代碼對Flash的誤操作不當引起程序丟失或被錯誤改寫
例如,在有對Flash寫入或擦除操作的代碼中,如果用戶誤調用了寫入或擦除函數或者由於程序跑飛而恰好執行了Flash擦除或寫入函數,這自然會導致數據丟失或改變。
針對以上情況,可以在程序中設置多個允許操作的變量,當執行寫入或擦除操作時,對這些變量進行判斷,只有條件全部滿足時,才執行相應的操作。
在一些不需要進行擦除或寫入操作的系統中,對存儲區進行寫保護或擦除保護設置,能有效的防止數據被意外修改。做到了寫入或擦除的可控性,基本可以避免此種情況發生。
2、系統時鍾不穩定
無論對於內部Flash還是外部Flash,系統時鍾的不穩定,都將導致MCU得不到可靠的工作時序信號,從而在讀寫Flash時產生不可預料的后果。
3、環境干擾
環境干擾的可能原因很多,如生產過程中的高溫焊接、靜電、使用環境的溫濕度,強磁場等,都可能影響到Flash或整個系統的穩定。環境干擾的因素很多,在此不展開討論。