zoukankan      html  css  js  c++  java
  • 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.
    ", FS_PARTITION_NAME);
    11        else
    12            rt_kprintf("Create a block device successful on the %s partition of flash .
    ", FS_PARTITION_NAME);
    13 
    14        if (dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == 0)
    15        {
    16            rt_kprintf("mount %s OK
    ", 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
    ", FS_PARTITION_NAME);
    25           }else{
    26               rt_kprintf("mount failed so reset mcu!
    ");/*2次挂载失败就重启*/
    27               rt_hw_cpu_reset();
    28           }
    29        }
    30        return RT_EOK;
    31 }
    View Code
  • 相关阅读:
    SSH框架总结(框架分析+环境搭建+实例源码下载)(转)
    用PowerMockito来mock私有方法(转)
    Mockito简介(转)
    统治世界的十大算法
    ThreadLocal用法和实现原理(转)
    在Eclipse中使用JUnit4进行单元測试(0基础篇)
    libgdx, mouse 关节
    sprintf,你知道多少?
    北京簋街 美食全然攻略 + 簋街好吃的夜宵去处-----店铺介绍大全
    codeforces-148D-Bag of mice-概率DP
  • 原文地址:https://www.cnblogs.com/jieruishu/p/13577619.html
Copyright © 2011-2022 走看看