基于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的扇区

原文地址:https://www.cnblogs.com/3ddan/p/10366067.html