查看: 5375|回复: 4

FatFS文件系统移植

[复制链接]
  • TA的每日心情
    奋斗
    2015-1-22 18:04
  • 签到天数: 189 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-12-3 18:39:41 | 显示全部楼层 |阅读模式
    分享到:
    在做好spi驱动以后,进行SD卡的FATFS文件系统移植只需要去实现FATFS给出的6个接口函数即可跑起文件系统了,接口代码实现如下:
    1. /*--------------------------------------------------------------------------
    2. 这里为FS文件系统的底层函数
    3. 移植FS文件系统总共需要写6个底层函数

    4. ---------------------------------------------------------------------------*/

    5. DSTATUS disk_initialize (
    6.         BYTE drv                                /* Physical drive nmuber (0..) */
    7. )
    8. {
    9. uint8_t Status;
    10.        
    11. switch (drv)
    12. {
    13.         case 0 :          
    14.     Status = SDCard_Init();
    15.     if(Status == 0)
    16.           return 0;
    17.     else
    18.           return STA_NOINIT;
    19.        
    20.         case 1 :          
    21.                 return STA_NOINIT;
    22.                   
    23.         case 2 :
    24.                 return STA_NOINIT;
    25.   }
    26.         return STA_NOINIT;
    27. }



    28. /*-----------------------------------------------------------------------*/
    29. /* Return Disk Status                                                    */

    30. DSTATUS disk_status (
    31.         BYTE drv                /* Physical drive nmuber (0..) */
    32. )
    33. {
    34.     switch (drv)
    35.         {
    36.           case 0 :               
    37.           /* translate the reslut code here        */
    38.             return 0;
    39.           case 1 :
    40.           /* translate the reslut code here        */
    41.             return 0;
    42.           case 2 :
    43.           /* translate the reslut code here        */
    44.             return 0;
    45.           default:
    46.         break;
    47.         }
    48.         return STA_NOINIT;
    49. }



    50. /*-----------------------------------------------------------------------*/
    51. /* Read Sector(s)                                                        */

    52. DRESULT disk_read (
    53.         BYTE drv,                /* Physical drive nmuber (0..) */
    54.         BYTE *buff,                /* Data buffer to store read data */
    55.         DWORD sector,        /* Sector address (LBA) */
    56.         BYTE count                /* Number of sectors to read (1..255) */
    57. )
    58. {
    59.   uint8_t Status;
    60.   if( !count )
    61.   {   
    62.     return RES_PARERR;  /* count不能等于0,否则返回参数错误 */
    63.   }
    64.   switch (drv)
    65.   {
    66.     case 0:
    67.     if(count==1)            /* 1个sector的读操作 */      
    68.     {      
    69.           Status =  SDCard_ReadSingleBlock(sector ,&buff[0] );
    70.     }                                                
    71.     else                    /* 多个sector的读操作 */     
    72.     {   
    73.       Status = SDCard_ReadMultiBlock(sector , &buff[0] ,count);
    74.     }                                                
    75.     /* Check if the Transfer is finished */
    76.     if(Status == 0)
    77.     {
    78.       return RES_OK;
    79.     }
    80.     else
    81.     {
    82.       return RES_ERROR;
    83.     }   
    84.         case 1:       
    85.           break;

    86.     case 2:       
    87.           break;

    88.     default:
    89.       break;
    90.   }
    91.   return RES_ERROR;
    92. }



    93. /*-----------------------------------------------------------------------*/
    94. /* Write Sector(s)                                                       */

    95. #if _READONLY == 0
    96. DRESULT disk_write (
    97.         BYTE drv,                        /* Physical drive nmuber (0..) */
    98.         const BYTE *buff,                /* Data to be written */
    99.         DWORD sector,                /* Sector address (LBA) */
    100.         BYTE count                        /* Number of sectors to write (1..255) */
    101. )
    102. {
    103.   uint8_t Status;
    104.   if( !count )
    105.   {   
    106.     return RES_PARERR;  /* count不能等于0,否则返回参数错误 */
    107.   }
    108.   switch (drv)
    109.   {
    110.     case 0:
    111.     if(count==1)            /* 1个sector的写操作 */      
    112.     {   
    113.        Status = SDCard_WriteSingleBlock( sector ,&buff[0] );
    114.     }                                                
    115.     else                    /* 多个sector的写操作 */   
    116.     {   
    117.        Status = SDCard_WriteMultiBlock(sector ,&buff[0] ,count);          
    118.     }
    119.                                                
    120.     if(Status == 0)
    121.     {
    122.        return RES_OK;
    123.     }
    124.     else
    125.     {
    126.        return RES_ERROR;
    127.     }
    128.     case 2:
    129.            break;
    130.     default :
    131.        break;
    132.   }
    133. return RES_ERROR;
    134. }
    135. #endif /* _READONLY */



    136. /*-----------------------------------------------------------------------*/
    137. /* Miscellaneous Functions                                               */

    138. DRESULT disk_ioctl (
    139.         BYTE drv,                /* Physical drive nmuber (0..) */
    140.         BYTE ctrl,                /* Control code */
    141.         void *buff                /* Buffer to send/receive control data */
    142. )
    143. {
    144.     if (drv)
    145.     {   
    146.         return RES_PARERR;  /* 仅支持单磁盘操作,否则返回参数错误 */
    147.     }
    148.         switch (ctrl)
    149.         {
    150.           case CTRL_SYNC :             
    151.                 return RES_OK;
    152.           case GET_SECTOR_COUNT :
    153.            // *(DWORD*)buff = SDCardInfo.CardCapacity/SDCardInfo.CardBlockSize;
    154.             return RES_OK;
    155.           case GET_BLOCK_SIZE :
    156.             //*(WORD*)buff = SDCardInfo.CardBlockSize;
    157.             return RES_OK;       
    158.           case CTRL_POWER :
    159.                 break;
    160.           case CTRL_LOCK :
    161.                 break;
    162.           case CTRL_EJECT :
    163.                 break;
    164.       /* MMC/SDC command */
    165.           case MMC_GET_TYPE :
    166.                 break;
    167.           case MMC_GET_CSD :
    168.                 break;
    169.           case MMC_GET_CID :
    170.                 break;
    171.           case MMC_GET_OCR :
    172.                 break;
    173.           case MMC_GET_SDSTAT :
    174.                 break;       
    175.         }
    176.         return RES_PARERR;   
    177. }

    178. /* 得到文件Calendar格式的建立日期,是DWORD get_fattime (void) 逆变换 */                                                       
    179. /*-----------------------------------------------------------------------*/
    180. /* User defined function to give a current time to fatfs module          */
    181. /* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */                                                                                                                                                                                                                                          
    182. /* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */                                                                                                                                                                                                                                                
    183. DWORD get_fattime (void)
    184. {
    185.    
    186.     return 0;
    187. }
    复制代码
    最后一个是获取时间的函数,因为还没有驱动RTC,所以这个留空,可以不用去写。
    下面是基于文件系统读写的一个小例子:

    1. FATFS fs;           
    2.         FRESULT res;                 
    3.         DIR dirs;
    4.         FIL fsrc, fdst;         // file objects
    5.         UINT br, bw;            // File R/W count
    6. char path[20]="0:/webnet/test.txt";   
    7. uint8_t textFileBuffer[] = "这是一个FATFS移植demo\r\n";

    8.    FRESULT scan_files (char* path)

    9. {

    10.     FRESULT res;

    11.     FILINFO fno;

    12.     DIR dir;

    13.     int i;

    14.     char *fn;

    15. #if _USE_LFN

    16.     static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1];

    17.     fno.lfname = lfn;

    18.     fno.lfsize = sizeof(lfn);

    19. #endif

    20.     res = f_opendir(&dir, path);

    21.     if (res == FR_OK) {

    22.         i = strlen(path);

    23.         for (;;) {

    24.             res = f_readdir(&dir, &fno);

    25.             if (res != FR_OK || fno.fname[0] == 0) break;

    26.          if (fno.fname[0] == '.') continue;

    27. #if _USE_LFN

    28.             fn = *fno.lfname ? fno.lfname : fno.fname;

    29. #else

    30.             fn = fno.fname;

    31. #endif

    32.             if (fno.fattrib & AM_DIR) {

    33.                 sprintf(&path[i], "/%s", fn);

    34.                 res = scan_files(path);

    35.                 if (res != FR_OK) break;

    36.                 path[i] = 0;
    37.             } else {

    38.                 printf("%s/%s\r\n", path, fn);

    39.             }

    40.         }

    41.     }



    42.     return res;

    43. }
    44. int main(void)
    45. {
    46.         uint8_t state;
    47.                 FATFS fs;           
    48.         FRESULT res;                 
    49.         DIR dirs;
    50.         FILINFO finfo;
    51.        
    52. systick_hw_init();
    53. led_hw_init();
    54. UART0_Init(115200);
    55.         state=SDCard_Init();
    56.    if(state==0)
    57.                  {
    58.                           printf("SD卡初始化成功!\r\n");
    59.                         }
    60.                         else
    61.                         {
    62.                                    printf("SD卡初始化失败!\r\n");
    63.                         }
    64.                  printf("SD容量为:%dM\r\n",SDCard_GetCapacity()/(1024*1024));
    65.                  res = disk_initialize(0);
    66.                         while(res!= FR_OK)printf("Fatfs failed!\r\n");
    67.                 res=f_mount(0, &fs);
    68.                         while(res!= FR_OK)printf("Fatfs failed!\r\n");
    69.                         if ( res == FR_OK )
    70.   {
    71.                 /*创建test.txt文件*/
    72.                 res = f_open( &fsrc,(char*)path, FA_CREATE_NEW  | FA_WRITE);
    73.     /* 将缓冲区的数据写到文件中 */
    74.                 res = f_write(&fsrc, textFileBuffer, sizeof(textFileBuffer), &br);
    75.           printf( "\r\n test.txt 文件创建成功 \r\n" );   
    76.       /*关闭文件 */
    77.     f_close(&fsrc);      
    78.   }else
    79.         {
    80.   printf("Fatfs failed!");
    81.   }
    82. res=scan_files("0:/webnet");//遍历webnet文件夹下所有文件
    83. while(1){
    84. PIOB->PIO_CODR=(0x01<<LED0_PIN);
    85. delay_ms(100);
    86. PIOB->PIO_SODR=(0x01<<LED0_PIN);
    87. delay_ms(100);
    88. }

    89. }

    复制代码
    这个例子是在sd卡的webnet目录下创建一个test.txt,同时把这个目录下所以文件都遍历,把文件名都打印输出,运行会输出如下:
    QQ截图20131028142503.png
    9.fatfs.rar (1.31 MB, 下载次数: 21)
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-10-29 22:48
  • 签到天数: 731 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-12-4 10:01:04 | 显示全部楼层
    赞一个!有个znFAT也挺好的。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-1-22 18:04
  • 签到天数: 189 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2013-12-4 10:06:54 | 显示全部楼层
    suyong_yq 发表于 2013-12-4 10:01
    赞一个!有个znFAT也挺好的。

    znFAT是国人做的,也很不错的,这个FATFS是一个日本人做的,很多用这个。znFAT移植也差不多的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-4-2 16:02
  • 签到天数: 257 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-12-6 15:25:04 | 显示全部楼层
    去年也搞过fats,其实就是把一个SPI 读写的函数移植下就可以了。不过我没深入研究下去文件的结构。主要是没搞具体应用。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-1-9 19:40
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2014-1-7 20:02:37 | 显示全部楼层
    貌似ATMEL STUDIO 6里面有现成的SD卡驱动和FATFS可以用啊
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-20 04:21 , Processed in 0.152834 second(s), 23 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.