nor flash之寫保護

背景

沒有電池的嵌入式設備,很容易發生隨機掉電。因此要讓產品可靠穩定,就必須保證各種場景下的掉電安全。
例如系統更新過程隨機掉電,不能導致系統無法啓動。例如正常讀寫flash過程中掉電,最多正在傳輸的數據丟掉,但不能導致flash其他數據出錯,否則輕則丟數據,重則直接變磚無法啓動。本文主要分析flash數據出錯的情況。

問題:flash掉電數據出錯

爲什麼掉電會導致flash數據出錯呢?因爲在產品掉電時,對用戶來說拔下插頭是一瞬間,但對於板子上的各個器件來說,卻是存在一個掉電過程,即電壓從正常值掉到0的過程,這個不是瞬間的。而掉電時機是隨機的無法預測的,也就是開始掉電的時候,主控可能正在讀flash,寫flash,擦除flash,SPI總線上還有很多波形在歡快地傳輸着。而各個器件也各自有一個工作電壓的範圍,因此當電壓開始掉落時,各個器件還會繼續做自己的事情,直到電壓掉到實際工作電壓之下,才停止工作。

flash的規格書上會標註工作電壓,例如標稱3.6V-2.7V,那麼在電壓從正常的3.3V一路掉到2.7V的過程中,我們可以知道flash都還能正常工作,可以正常接收命令進行讀寫擦等,但從2.7V再往下掉就開始超出flash正常的工作電壓,flash就不保證繼續正常工作了。那是不是到了2.7V flash就不工作了呢,抱歉,也不是,flash要到某個更低的電壓纔會徹底歇菜停止運轉,我們假設爲2.3V吧。

那麼問題來了,電壓跌落到2.7V-2.3V之間呢,這個時候flash是怎麼樣的? 答案是flash是處於不穩定態,可能還在工作,但不保證正常工作。
不保證正常工作的意思是,我也許還能工作,但不保證工作的結果是對的。例如此時收到一條擦除A地址的數據的命令,實際可能把表示A地址的波形解析成B地址,然後就把B地址的數據擦了。或者收到寫A地址的命令,卻寫到了B地址。

解決方式

硬件解法

既然知道flash在掉電時,會存在一段電壓區間,工作不穩定。那麼硬件解法就是設法避免這種場景。

例如加快掉電速度,那這段危險區間的時間就變短了,出錯的概率就降低了。如果能很快把flash的電掉下來,則flash就沒有時間可以出錯了。

例如設法在電壓掉到2.7V之前,先把主控的電斷了或者把SPI的通信阻斷掉,這樣flash就不會收到波形,也就不會解析錯了。

硬件上的解決方式,規避方式,降低概率方式應該還是蠻多的,但硬件解法有個問題,就是需要增加成本,這個對於有些追求可靠性的產品來說,可靠穩定最重要,增加點成本問題不大。但對於有些價格敏感競爭激烈的產品來說,就是大問題了。

軟件解法

軟件上其實沒有特別好的解決方式,只能通過降低flash的擦寫頻率,啓用寫保護等手段,最終達到把概率降到足夠低的目的。

降低flash擦寫頻率,這個很好理解,寫得越多,在掉電時撞上正在操作flash的概率就越大,那麼出錯的概率就越大。但是否寫flash,寫多少這個是跟應用相關的。下主面要介紹下nor flash寫保護,這個是可以在驅動層面做的。

nor寫保護

寫保護是nor提供的功能,即可以通過配置一些寄存器,將某些區域保護起來。如果沒有解除保護,那對這個區域的寫入和擦除,都會被直接忽略掉。

例如在不穩定狀態下,寫A的命令被理解爲寫B了,此時如果B是處於寫保護區域,那這個命令會被忽略掉,不會造成實質性的破壞性的影響。

BP保護

大多數nor flash支持使用BP位來配置寫保護,這種保護的特點是其保護的數據是成片的,一般是從flash頭部開始的一片數據,或者從flash尾部開始的一片數據。

例如 winbond的這款flash就標註了

 

從規格書可很容易看出,保護的範圍是BP bit再結合其他的一些bit 一起決定的,可以保護1/2, 3/4, 7/8 等多種範圍。
這些bit的位置,設置方式,規格書中都有描述,按照規定在驅動中操作對應的寄存器即可。

不同廠家的保護bit設置都不太一樣,涉及到BP bit,SEC bit, CMP bit等,每適配一款新的nor,都得重新查下規格書才行。

特別要注意的是,區分好具體的設置是持久化的還是掉電丟失的,具體的bit是否有OTP的特性,即one time program,只能寫入一次,無法逆轉。

獨立塊保護

除了普遍支持的BP寫保護,也就是分片保護之外,有些flash還提供了更細粒度的寫保護,即獨立塊保護(individual block protect)。

還是以winbond爲例,當WPS(write protect selection) bit被設置,則寫保護切換到獨立塊保護。

在這種模式下,BP的設置就無效了,每次上電默認處於完全寫保護的狀態。

主控可以針對每個block(64KB)進行獨立的解鎖和上鎖。對於首尾兩個block,還可以細緻到sector(4KB)進行保護。

 

兩種寫保護的比較

相對而言,獨立塊保護的出錯概率肯定是比BP保護的概率低的,因爲寫入A或擦除A時,必須先對A進行解保護。

對於BP保護來說,爲了解開A的寫保護,必須解開一片區域。假如A處於flash的中間位置,那麼解保護的範圍會接近1/2 flash的範圍。此時發生解析錯誤,把A解析成B,那麼B落在這片未保護的區域的概率還是比較高的。

對於獨立塊保護來說,爲了解開A的寫保護,需要解開的區域僅爲1個block甚至1個sector,那麼出錯後的B剛好落在這個範圍的概率自然就大大降低了。

當然,具有獨立塊保護功能的flash,其成本肯定要高些,售價一般也會高一些吧。

小結

flash掉電會有誤擦誤寫的風險,寫保護只是降低誤擦誤寫的概率,並不能完全解決。只要有寫入和擦除,就可能會撞上掉電。

硬件解決增加成本,軟件使用寫保護則只能降低概率。部分flash支持獨立塊保護機制,理論上出錯概率會遠小於BP保護機制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章