使用該例子做移植時,出現了形形色色的問題,按我最原始的想法,是將w25x16分成幾個區域, 如下圖:
0x00000 ~ 0x00fff (4k) 作為頭資訊,0x01000 ~ 0x01fff (4k) 作為配置資訊,0x02000 ~ 0x03ffff (256k) 作為保留區域,從0x100000 ~ 0x1fffff (1m)作為資料區,以後還可以擴充套件成其他型號flash。
看似簡單的問題,其實也確實挺簡單,但因為對神舟iv所帶的flash操作函式不熟悉,導致出現奇怪的問題。
w25x16 分為幾個部分,1個塊等於64k,包含16個扇區,每個扇區是4k。 乙個扇區包含16個頁,每個頁是256個位元組。 有三種擦除方式,第一是整個晶元擦除 (chip erase),w25x16差不多需要20幾秒。 塊擦除神舟庫函式沒有實現,扇區擦除是毫秒級別。
對於flash的操作,最重要的就是先擦除,否則寫進去的資料是錯誤的。測試情況也是如此。
spi_flash_sectorerase 這個函式用於擦除乙個扇區(4k),引數我錯誤的認為是擦除第n個扇區,蹭這樣使用 spi_flash_sectorerase(1),這明顯是擦除第乙個扇區,這還引起了我迷惑了很久的乙個問題,為什麼每次寫入conf區後,header的資料就不正確了。還出現過寫入4k的資料,只有前面一部分是正常的,也是因為擦除的區域錯誤引起。
主要是它的引數其實還是乙個位址。如,要操作conf區域,就得先使用spi_flash_sectorerase(0x1000),這裡使用spi_flash_sectorerase(0x1fff)也是可以的,只要沒有操過扇區的邊界。如spi_flash_sectorerase(0x2000)就不行了,很明顯已經是擦除第二個扇區了,如果仍然是往0x1000位址區寫入資料,讀出來的可能就是錯誤資料。使用spi_flash_bufferwrite函式,對於讀取和寫入的資料大小,可以比較隨意,幾個位元組也是可以的。但如果是用於做資料儲存,跟eeprom就有很大區別,不能簡單的通過移動指標來訪問資料,它需要整塊整塊的來儲存。
使用flash做資料儲存,而且資料量比較大,考慮到flash本身擦些次數有限 100000次左右,暫不考慮頁擦除方式,採用扇區方式,自然就得至少分配4k的緩衝來作為儲存。初步想法是在收到訊號後插入到緩衝,在主迴圈中呼叫函式監控資料,待到滿足4k大小時,就寫入到flash,這裡不能簡單這樣寫入,需要先讀出來一次,並檢測該扇區是否還存在空閒位置並做相應的處理。還提供一種方式,用於立即寫入flash,少量資料時也寫入到flash,這樣防止資料因為數量問題丟失。