查看: 3976|回复: 7

[原创] 继续开大,既SPIFLASH后之FATFS文件系统移植

[复制链接]
  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-7-5 22:54:33 | 显示全部楼层 |阅读模式
    对于像SPIFLASH、SD卡这类大容量的存储设备,如果你采用读写扇区的方式,那可真的要下点功夫去做存储空间分配了,呵呵,列一个大大的表格在里面表明变量的存储地址,停!有点头晕!我想静静!不扯淡了,切入正题,关于什么是文件系统,请各位直接找度娘或狗哥哥吧。老规矩,直接上代码!前几天已经在论坛发布了SPI和DSPI驱动W25QXX系列SPIFlash的帖子,需要的自己去看,本部分的用到了SPIFLASH的接口函数。在源码的基础上仅仅修改了diskio.c的几个文件,在main函数中包含ff.h即可使用,(注:没有配置支持中文文件名,需要的自己查资料配置)具体请大家自己看代码吧:
    1. /*-----------------------------------------------------------------------*/
    2. /* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2014        */
    3. /*-----------------------------------------------------------------------*/
    4. /* If a working storage control module is available, it should be        */
    5. /* attached to the FatFs via a glue function rather than modifying it.   */
    6. /* This is an example of glue functions to attach various exsisting      */
    7. /* storage control modules to the FatFs module with a defined API.       */
    8. /*-----------------------------------------------------------------------*/

    9. #include "diskio.h"                /* FatFs lower layer API */
    10. //#include "usbdisk.h"        /* Example: Header file of existing USB MSD control module */
    11. //#include "atadrive.h"        /* Example: Header file of existing ATA harddisk control module */
    12. //#include "sdcard.h"                /* Example: Header file of existing MMC/SDC contorl module */
    13. #include "w25qxx.h"


    14. #define EX_FLASH 0        //外部flash,卷标为1

    15. #define FLASH_SECTOR_SIZE         512                          
    16.                                      
    17. uint16_t            FLASH_SECTOR_COUNT=2048*7;        //W25Q64,前7M字节给FATFS占用
    18. #define FLASH_BLOCK_SIZE           8             //每个BLOCK有8个扇区


    19. //获得磁盘状态
    20. DSTATUS disk_status (
    21.         BYTE pdrv                /* Physical drive nmuber to identify the drive */
    22. )
    23. {
    24.         return RES_OK;
    25. }  
    26. //初始化磁盘
    27. DSTATUS disk_initialize (
    28.         BYTE pdrv                                /* Physical drive nmuber to identify the drive */
    29. )
    30. {
    31.         uint8_t res=0;            
    32.         switch(pdrv)
    33.         {
    34.                 case EX_FLASH://外部flash
    35.                         W25QXX_Init();
    36.                         FLASH_SECTOR_COUNT=2048*12;//W25Q1218,前12M字节给FATFS占用
    37.                         break;
    38.                 default:
    39.                         res=1;
    40.         }                 
    41.         if(res)return  STA_NOINIT;
    42.         else return 0; //初始化成功
    43. }
    44. //读扇区
    45. //pdrv:磁盘编号0~9
    46. //*buff:数据接收缓冲首地址
    47. //sector:扇区地址
    48. //count:需要读取的扇区数
    49. DRESULT disk_read (
    50.         BYTE pdrv,                /* Physical drive nmuber to identify the drive */
    51.         BYTE *buff,                /* Data buffer to store read data */
    52.         DWORD sector,        /* Sector address in LBA */
    53.         UINT count                /* Number of sectors to read */
    54. )
    55. {
    56.         uint8_t res=0;
    57.     if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误                          
    58.         switch(pdrv)
    59.         {
    60.                 case EX_FLASH://外部flash
    61.                         for(;count>0;count--)
    62.                         {
    63.                                 W25QXX_Read(buff,sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);
    64.                                 sector++;
    65.                                 buff+=FLASH_SECTOR_SIZE;
    66.                         }
    67.                         res=0;
    68.                         break;
    69.                 default:
    70.                         res=1;
    71.         }
    72.    //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值
    73.     if(res==0x00)return RES_OK;         
    74.     else return RES_ERROR;          
    75. }
    76. //写扇区
    77. //pdrv:磁盘编号0~9
    78. //*buff:发送数据首地址
    79. //sector:扇区地址
    80. //count:需要写入的扇区数
    81. #if _USE_WRITE
    82. DRESULT disk_write (
    83.         BYTE pdrv,                        /* Physical drive nmuber to identify the drive */
    84.         const BYTE *buff,        /* Data to be written */
    85.         DWORD sector,                /* Sector address in LBA */
    86.         UINT count                        /* Number of sectors to write */
    87. )
    88. {
    89.         uint8_t res=0;  
    90.     if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误                          
    91.         switch(pdrv)
    92.         {
    93.                 case EX_FLASH://外部flash
    94.                         for(;count>0;count--)
    95.                         {                                                                                    
    96.                                 W25QXX_Write((uint8_t*)buff,sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);
    97.                                 sector++;
    98.                                 buff+=FLASH_SECTOR_SIZE;
    99.                         }
    100.                         res=0;
    101.                         break;
    102.                 default:
    103.                         res=1;
    104.         }
    105.     //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值
    106.     if(res == 0x00)return RES_OK;         
    107.     else return RES_ERROR;       
    108. }
    109. #endif
    110. //其他表参数的获得
    111. //pdrv:磁盘编号0~9
    112. //ctrl:控制代码
    113. //*buff:发送/接收缓冲区指针
    114. #if _USE_IOCTL
    115. DRESULT disk_ioctl (
    116.         BYTE pdrv,                /* Physical drive nmuber (0..) */
    117.         BYTE cmd,                /* Control code */
    118.         void *buff                /* Buffer to send/receive control data */
    119. )
    120. {
    121. DRESULT res;                                                                               
    122.         if(pdrv==EX_FLASH)        //外部FLASH  
    123.         {
    124.             switch(cmd)
    125.             {
    126.                     case CTRL_SYNC:
    127.                                 res = RES_OK;
    128.                         break;         
    129.                     case GET_SECTOR_SIZE:
    130.                         *(WORD*)buff = FLASH_SECTOR_SIZE;
    131.                         res = RES_OK;
    132.                         break;         
    133.                     case GET_BLOCK_SIZE:
    134.                         *(WORD*)buff = FLASH_BLOCK_SIZE;
    135.                         res = RES_OK;
    136.                         break;         
    137.                     case GET_SECTOR_COUNT:
    138.                         *(DWORD*)buff = FLASH_SECTOR_COUNT;
    139.                         res = RES_OK;
    140.                         break;
    141.                     default:
    142.                         res = RES_PARERR;
    143.                         break;
    144.             }
    145.         }else res=RES_ERROR;//其他的不支持
    146.     return res;
    147. }
    148. #endif
    149. //获得时间
    150. //User defined function to give a current time to fatfs module      */
    151. //31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */                                                                                                                                                                                                                                          
    152. //15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */                                                                                                                                                                                                                                                
    153. DWORD get_fattime (void)
    154. {                                 
    155.         return 0;
    156. }                       
    复制代码


    FatFs R0.11.zip

    1.57 MB, 下载次数: 48, 下载积分: 威望 1

    官方源码

    FATFS文件系统应用程序手册(中文版).pdf

    170.53 KB, 下载次数: 57, 下载积分: 威望 1

    应用手册

    回复

    使用道具 举报

    该用户从未签到

    713

    主题

    6372

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25023
    最后登录
    2025-7-31
    发表于 2016-7-6 09:36:32 | 显示全部楼层
    谢谢楼主分享!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16

    主题

    78

    帖子

    0

    注册会员

    Rank: 2

    积分
    178
    最后登录
    2018-6-1
    发表于 2016-7-6 09:48:56 | 显示全部楼层
    好东西
    回复

    使用道具 举报

    该用户从未签到

    5

    主题

    24

    帖子

    0

    注册会员

    Rank: 2

    积分
    57
    最后登录
    2018-5-8
    发表于 2016-7-6 09:49:05 | 显示全部楼层
    感谢分享
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-10-17 08:07
  • 签到天数: 273 天

    连续签到: 1 天

    [LV.8]以坛为家I

    74

    主题

    2338

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7513
    最后登录
    2021-8-30
    发表于 2016-7-6 09:52:00 | 显示全部楼层
    感谢你的热心分享,哪天用到了再来拿
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2016-7-6 10:52:02 | 显示全部楼层
    感谢楼主分享资料
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    2

    帖子

    0

    新手上路

    Rank: 1

    积分
    8
    最后登录
    1970-1-1
    发表于 2016-7-28 11:16:49 | 显示全部楼层
    谢谢楼主无私分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    连续签到: 1 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7884
    最后登录
    2025-4-11
    发表于 2016-9-2 09:09:08 | 显示全部楼层
    围观,赞一个
    来根华子
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-2 14:27 , Processed in 0.098521 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表