STM32下FatFs的移植,實現了壞塊管理,硬件ECC,ECC糾錯,並進行擦寫均衡分析


最近因項目需要,做一個數據采集的單片機平台。需要移植 FatFs 。現在把最后成果貼上來。

 

1、摘要

在 STM32 單片機上,成功移植 FatFs 0.12b,使用的 Nand Flash 芯片為 K9F2G08 。

特點: 系統配合 FatFs 實現了壞塊管理,硬件ECC,軟件 ECC 糾錯

2、代碼分析

2.1、擦寫均衡分析

    在create_chain 函數中實現,每次分配都由當前scl 指向的 free cluster 開始,逐塊檢查,是否有可用 cluster 存在。如果沒有則取下一塊,直到回到起始點,說明已經沒有 free cluster 了。

                       

    因為每次都緊鄰 scl 取 free cluster, 那么每次的起始 scl 值在哪里,就決定了擦寫位置。

 

    通過查看代碼,很可惜,發現 scl 每次都重新從 1 開始查找 free cluster。所以,默認條件下,FatFs 不支持擦寫均衡。

   如果能把每次分配的cluster號記錄下來,下次接着向后分配,則可實現擦寫均衡。未來有時間再來實現吧。也許你現在就能實現哦,另忘了實現了分享一份給我。

2.2、壞塊管理分析

通過2.1對create_chain 函數的分析,我們知道get_fat是完成真實的 free cluster的分配。而每次 get_fat 函數都會調用 move_window 函數實際的讀入一次該 sector。所以,我們只需要在讀取函數中,對壞塊進行檢查,返回 出錯,則分配的 cluster 自動移到下一個。從而完成跳過壞塊存儲數據。

具體實現如下:

 

     如果 FSMC_NAND_ReadSmallPage 檢測到壞塊,則 NAND_disk_read 返回 RES_ERROR。

 

2.3、STM32的硬件ECC

在FSMC_NAND_Init 函數中打開STM32的硬件ECC配置。如下紅色字。

 

FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND;

  FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable;

  FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;

  FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable;

  FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_256Bytes;

  FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0x00;

  FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x00;

  FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p;

  FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;

 

這里使用的是 FSMC_ECCPageSize_256Bytes ,而 K9F2G08 的最小page 為 2048, 所以,我們在驅動中,會再把 2048 的page 頁再分為8個256的小頁面分別進行 ECC 運算。這樣做的好處很明顯,壞處就是加大了復雜度。具體實現參見 FSMC_NAND_WriteSmallPage和FSMC_NAND_ReadSmallPage 函數。

 

 

每次在硬件運算 ECC 開始時都需要打開ECC開關,算完一頁后,又需要關閉開關。在讀取ECC值之前還必須等待計算完畢。

while(FSMC_GetFlagStatus(FSMC_Bank2_NAND,FSMC_FLAG_FEMPT)==Bit_RESET);

做到這幾條就可以通過 FSMC_GetECC 函數獲取正確的 ECC 值了。

另外因為我們的計算特性,所以在壞塊標志后特別加入了一個我們自定義的ECC標識。

 

2.4、ECC糾錯

首先是 ECC 錯誤識別,代碼如下:

 

 說明:eccRd為存儲時計算的ECC什值; eccCl 為當前運算的值。

 eccXor 不為零時,說明檢測到錯誤。再通過 FSMC_NAND_GetBitPosition 函數獲得具體的出錯bit的位置。具體算法請閱參考文獻。

 

2.5、文件組成

FatFs 目錄     

+----  ffconf.h   對 FatFs 進行配置的文件     

+----  ff.h     

+----  ff.c       是 FatFs 的實現文件,擦寫均衡在 create_chain 函數中已實現。

+----  ccsbcs.c   文件名支持英文     

+----  cc936.c    文件名支技中文     

+----  diskio.c   是 FatFs 與自定義驅動層的接口函數     

+----  NandDisk.c 為自己實現的 NandFlash 匹配函數,壞塊管理在這里實現。       

BSP 目錄     

+----  fsmc_nand.h  對 K9F2G08 的各種參數定義     

+----  fsmc_nand.c  實現硬件級別的讀寫驅動,STM32 的 硬件 ECC 在這里使用。還實現了 ECC 自動糾錯

 

注:為了獲得 64*2K 的擦除緩沖區,系統還使用了一塊 SRAM 芯片,以支持 malloc 內存 分配函數。這個文件由你自己的系統提供。
 

3、引用文獻

FatFs 系統

http://elm-chan.org/fsw/ff/00index_e.html

ECC 算法詳細說明

http://www.360doc.com/content/11/0523/17/496343_118837985.shtml

STM32   ECC校驗的一些心得

http://www.51hei.com/bbs/dpj-32707-1.html

 

最后如果想要下載程序的朋友請點這里:源程序下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM