硬汉嵌入式论坛

 找回密码
 立即注册
查看: 181|回复: 4
收起左侧

[FatFs] 求助FATFS在f_mount后返回错误码FR_NO_FILESYSTEM

[复制链接]

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2025-7-23 09:20:30 | 显示全部楼层 |阅读模式
根据网上的教程野火或者CSDN里的教程移植了FATFS文件系统

在res=f_mount(&fs,"1:",1)提示FR_NO_FILESYSTEM;然后f_mkfs("1:",0,work,sizeof(work));返回值res提示🆗,
后res=f_mount(NULL,"1:",1);
   res=f_mount(&fs,"1:",1);返回值就提示FR_NO_FILESYSTEM;是什么原因呢,是因为接口代码有问题还是spi没写入,求教!
///////////////////////////////////////////////
下面是接口的定义

DSTATUS disk_status(BYTE pdrv) {
        DSTATUS stat=STA_NOINIT;
        switch(pdrv){
                case SD_CARD:
                        break;
                case EX_FLASH:
                        if(SPI_FLASH_TYPE==SPI_FLASH_ID){
                        stat=0;
                        }else{
                        stat|=STA_NOINIT;
                        }
                  break;
                        default:
                                stat=STA_NOINIT;
        }
        return stat;
}


///////////////////////////////

DSTATUS disk_initialize(BYTE pdrv) {
        DSTATUS stat=STA_NOINIT;
        uint16_t i;
  switch(pdrv) {
    case SD_CARD: //SD卡
      break;
    case EX_FLASH://外部flash
      spiflash_init();
          i=500;
          while(--i);
         
          W25QXX_WAKEUP();//唤醒SPI FLASH
      stat=disk_status(EX_FLASH);
                  break;
    default:
                        stat=STA_NOINIT;
  }                 
  return stat;
}

/////////////////////////////////////////////////

DRESULT disk_read(
  BYTE pdrv,   /* Physical drive nmuber (0..) */
  BYTE *buff,  /* Data buffer to store read data */
  DWORD sector,/* Sector address (LBA) */
  UINT count   /* Number of sectors to read (1..128) */
) {
  DRESULT res;
  if(!count) return RES_PARERR;//count不能等于0,否则返回参数错误                          
  switch(pdrv) {
    case SD_CARD: //SD卡
      break;
        case EX_FLASH://外部flash
                for(;count>0;count--)
                {
                        spiflash_read(buff,sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);
                        sector++;
                        buff+=FLASH_SECTOR_SIZE;
                }
                res=RES_OK;
                break;
    default:
      res=RES_PARERR;
  }
  return res;
}

/////////////////////////////////////////////////////

DRESULT disk_write(
  BYTE pdrv,       /* Physical drive nmuber (0..) */
  const BYTE *buff,/* Data to be written */
  DWORD sector,    /* Sector address (LBA) */
  UINT count       /* Number of sectors to write (1..128) */
) {
        uint32_t write_addr;
  DRESULT res=RES_PARERR;  
  if(!count) return RES_PARERR;//count不能等于0,否则返回参数错误                          
  switch(pdrv) {
    case SD_CARD: //SD卡
      break;
        case EX_FLASH://外部flash       
                sector+=512;
                write_addr=sector<<12;
            spiflash_sector_erase(write_addr);
            spiflash_page_write((u8 *)buff,write_addr,count<<12);               
                res=RES_OK;
                break;
                default:
                res=RES_PARERR;
  }
  return res;
}

//////////////////////////////////////////

DRESULT disk_ioctl (
        BYTE pdrv,                /* Physical drive nmuber (0..) */
        BYTE cmd,                /* Control code */
        void *buff                /* Buffer to send/receive control data */
)
{
        DRESULT res = RES_PARERR;

        switch (pdrv) {

        case EX_FLASH :
                switch(cmd){
                //扇区数量:4096*4096/1024/1024=16(MB)
                 case GET_SECTOR_COUNT:
                 *(DWORD * )buff = 4096;
            break;       

        case GET_SECTOR_SIZE :
            *(WORD * )buff = 4096;
            break;       

        case GET_BLOCK_SIZE :
            *(DWORD * )buff = 1;
            break;               
                }
                res = RES_OK;
        break;

    default:
        res = RES_PARERR;

        }

        return res;
}

////////////////////////////////////
找了很多跟踪调试,发现,每次都在:f_mount(xxx, "0:", 1)  -->  mount_volume("0:", xxx, 0)  -->  find_volume(xxx, 0)  -->  check_fs(xxx, 0)  -->  if (ld_word(fs->win + BS_55AA) != 0xAA55) return 3;这里返回3
所以想看看是什么问题
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-23 09:52:05 | 显示全部楼层
先SPI Flash低级格式化,然后文件系统格式化,然后再使用。

这样还不行得考虑下你的驱动移植实现问题了。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-7-23 13:53:02 | 显示全部楼层
eric2013 发表于 2025-7-23 09:52
先SPI Flash低级格式化,然后文件系统格式化,然后再使用。

这样还不行得考虑下你的驱动移植实现问题了 ...

spi_flash是没啥问题的,fs_mkfs之后res返回值为0,但是后面res=f_mount(NULL,"1:",1);
res=f_mount(&fs,"1:",1); 之后提示FR_NO_FILESYSTEM
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-24 09:05:20 | 显示全部楼层
momo0724 发表于 2025-7-23 13:53
spi_flash是没啥问题的,fs_mkfs之后res返回值为0,但是后面res=f_mount(NULL,"1:",1);
res=f_mount(&fs ...

不行的话,参考下我这个

基于V5板子的SPI Flash文件系统+SPI Flash虚拟U盘例子下载(2015-11-03新升级)
https://forum.anfulai.cn/forum.p ... 4894&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-7-24 10:18:27 | 显示全部楼层
eric2013 发表于 2025-7-24 09:05
不行的话,参考下我这个

基于V5板子的SPI Flash文件系统+SPI Flash虚拟U盘例子下载(2015-11-03新升级 ...

好滴我看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 00:07 , Processed in 0.039706 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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