W25Q128在RTT下的文件系統


因為要做TFTP的驗證測試,先要在板子上實現文件系統,所以就對W25Q128進行在RTT下的文件系統移植。

當按照RT-Thread中使用SPI操作FLASH(W25Q128),並在W25Q128上掛載文件系統操作后出現了以下錯誤

 

 然而這個問題並不是如https://github.com/MrShuimitao/RT-Thread-stm32f769-qspi中所說,SFUD_FLASH_EXT_INFO_TABLE不支持;實際情況是,SPI2上掛載了3個設備(2個ADE7913,還有W25Q128),在APP中用到了ADE7913而沒有用到W25Q128,在BOOT中僅去掉ADE7913的驅動還不行,當將2個ADE7913的CS引腳設置成輸出且置高之后,W25Q128可以識別但是還是掛載失敗:

 

 后經指點掛載函數的時機不對,當將INIT_COMPONENT_EXPORT(dfs_mount_init);改用NIT_ENV_EXPORT(dfs_mount_init);后就成功了

 

 同時對於SPI設備,不需要顯式將Fnxx_hal_msp.c中的HAL_SPI_MspInit()拷貝到board.c,因為這個已經通過__weak進行調用路徑說明了,只需要將Fnxx_hal_msp.c加到工程下即可調用。

同時關於SPI的MSB/LSB maser/slave, mode0~3,SPI-CLK等參數也不是非得調用rt_spi_configure(&pspi_dev, &spicfg)進行參數設置,默認也是可以得。

 0XEF13,表示芯片型號為W25Q80
0XEF14,表示芯片型號為W25Q16
0XEF15,表示芯片型號為W25Q32
0XEF16,表示芯片型號為W25Q64
0XEF17,表示芯片型號為W25Q128
0XEF18,表示芯片型號為W25Q256

W25Q80掛載文件系統要注意:被掛載的分區的容量不能小於128*最小擦除單位(4096B)=512K否則MKFS格式化文件系統時會失敗,跟蹤發現返回FR_MKFS_ABORTED錯誤:

4096扇區,掛載成FAT,要格式化成功,至少要800KB以上。
且還要修改格式化參數。所以建議4MB以下的FLASH不要用FAT,用littlefs

 

 同時因為dfs_mkfs只需要操作一次,一般第一次操作芯片會掛載失敗進入else分支,進行格式化,重啟后下一次就成功了(如果系統嚴重依賴文件系統必須軟件顯式軟重啟);但是還是有偶爾重啟還會失敗(這對批量燒寫很是個問題),但在格式化后再掛載失敗幾率就大大減少。

 1 int dfs_mount_init(void)
 2 {
 3     uint8_t tmp =0;
 4     struct fal_blk_device *blk_dev;
 5     /* fal init */
 6        fal_init();
 7    /* create block device */
 8        blk_dev = (struct fal_blk_device *) fal_blk_device_create(FS_PARTITION_NAME);
 9        if (blk_dev == RT_NULL)
10            rt_kprintf("Can't create a block device on '%s' partition.\n", FS_PARTITION_NAME);
11        else
12            rt_kprintf("Create a block device successful on the %s partition of flash .\n", FS_PARTITION_NAME);
13 
14        if (dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == 0)
15        {
16            rt_kprintf("mount %s OK\r\n", FS_PARTITION_NAME);
17        }
18        else
19        {
20            //mkfs("elm", FS_PARTITION_NAME);
21            dfs_mkfs("elm",FS_PARTITION_NAME);
22           if (dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == 0)/*減少靠重啟掛載失敗幾率*/
23           {
24               rt_kprintf("mount %s OK\r\n", FS_PARTITION_NAME);
25           }else{
26               rt_kprintf("mount failed so reset mcu!\r\n");/*2次掛載失敗就重啟*/
27               rt_hw_cpu_reset();
28           }
29        }
30        return RT_EOK;
31 }
View Code

 


免責聲明!

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



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