1. 程式人生 > >nor flash之防寫

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保護機制。

本文地址:https://www.cnblogs.com/zqb-all/p/12182920.h