• 基于SPIflash 的fatfs调试步骤


    硬件平台

    CPU: K64

    OS : Mqx

    SDK :KSDK_1.2.0

    Flash:SPI flash AT25DF641A  8M

    移植准备

    1.      FATFS源代码的获取,可以到官网下载最新版本

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

    FatFs Module是一种完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准C语言编写,所以具有良好的硬件平台独立性,可以移植到8051、PIC、AVR、SH、Z80、H8、ARM等系列单片机上而只需做简单的修改。它支持FATl2、FATl6和FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化。

    2.      解压文件会得到两个文件夹,一个是doc文件夹,这里是FATFS的一些使用文档和说明,以后在文件编程的时候可以查看该文档。另一个是src文件夹,里面就是我们所要的源文件。

    3.      建立一个IAR工程,加入SPIflash驱动

    移植步骤

    1.      将ff.c ff.h disco.c disco.h ffconf.h interger.h 添加到工程中去

    2.      修改ffconfig.c的相关配置,特别要注意的是_MAX_SS的设置,flash最大扇区4096

    3.      修改disco.c flash驱动接口,sector大小为4096

    4.      修改disk_ioctl()函数GET_SECTOR_COUNT, GET_SECTOR_SIZE, GET_BLOCK_SIZE,参数错误,后面格式化不成功

    Flash驱动接口的编写

       该项目SDK自带SPI的底层,所以只需要在disco.c中封装相应的接口函数,如果有时间精力可以自己尝试去写。

    测试文件系统

    1.      挂载

    2.      格式化

    3.      读写

    int test_spifatfs(void)

    {

       FATFS fs;

       FIL fl;

       FRESULT res;

       unsigned int r,w;

      

      

      //for mount

       printf("Mount a equipment: ");

       res=f_mount(0,&fs);

       if(!res)

           printf("Mount equipment success,f_mount=%x ",res);

       else

           printf("Mount equipment error,f_mount=%x ",res);

          

      //for format

       printf("Format a equipment: ");

       res=f_mkfs(0,1,2048);

       if(!res)

           printf("Format equipment success,f_mkfs=%x ",res);

       else

           printf("Format equipment error,f_mkfs=%x ",res);

      

      //for write

       printf("Write a file: ");

      res=f_open(&fl,"/test2.dat",FA_CREATE_ALWAYS | FA_WRITE);

       if(!res)

           printf("Create file success,f_open=%x ",res);

       else

           printf("Create file error,f_open=%x ",res);

       for(w=0; w

       {

         TxBuffer[w] = w;

       }    

           

      res=f_write(&fl,TxBuffer,PAGE_SIZE,&w);

       if(!res)

           printf("Write file success,f_write=%x ",res);

       else

           printf("Write file error,f_write=%x ",res);

       

       f_close(&fl);

      

       printf("Write finish! ");

      

       //for read

       printf("Read a file: ");

       res=f_open(&fl,"/test2.dat",FA_OPEN_EXISTING| FA_READ);

       if(!res)

           printf("Open file success,f_open=%x ",res);

       else

           printf("Open file error,f_open=%x ",res);

          

       for(r=0; r

       {

         RxBuffer[r] = 0xff;

       }

          

      res=f_read(&fl,RxBuffer,PAGE_SIZE,&r);

       if(!res)

         printf("Read file success, f_read=%x ",res);

       else          

         printf("Read file error, f_read=%x ",res);

       printf("Data is: ");        

       for(r=0; r

       {

         printf("0x%x ",RxBuffer[r]);

       }

      

       f_close(&fl);

      

       printf(" Read finish! ");

       //for umount

       printf("Umount a equipment: ");

       res = f_mount(0,NULL);

       if(!res)

           printf("Umount equipmentsuccess! ");

       else

           printf("Umount equipmenterror! ");

      

       return 0;

    }

    遇到的问题

    1.      代码调试中函数未定义

    可能是ffconfig.c 中预定义不对

    2.      格式化不成功

    Flash的sector等相关参数不正确

    3.      格式化成功后读写出现错误

    可能是你_MAX_SS设置不正确,根本就没有正确格式化,才导致读写错误

    后期学习

    1.      如何将文件系统加入命令行

    2.      深入学习fat的扇区

  • 相关阅读:
    Go入门笔记-22 访问sqlite3数据库
    Go入门笔记-21 访问consul
    Docker中sh提示符无法回退
    Go入门笔记-20 访问redis
    Docker进阶学习-1
    Musl-libc库编译
    修复 Could not find class [org.springframework.cloud.client.loadbalancer.LoadBalancerProperties]
    Oracle DBLINK 简单使用
    js几种escape()解码与unescape()编码
    解决浏览器图片缓存问题(图片不能及时变过来)
  • 原文地址:https://www.cnblogs.com/3ddan/p/10366067.html
Copyright © 2020-2023  润新知