使用FATFS挂载SD卡使,读取容量,返回 FR_NO_FILESYSTEM;

2019-07-20 21:09发布

void LCD_OD_Test(void)
{             /*!<Flash picture number initial value*/   
  uint8_t KeyInfoTmp;                 /*!<KeyInfo temporary data*/
uint8_t *ptr1=0;
uint8_t *ptr2=0;
uint8_t ptraddr[18];
uint16_t i=0;
uint8_t usage=0;
  uint32_t total=0,free=0;
uint8_t status1=0;
  uint8_t status2=0;
LCD_Init();/*!<LCM&SSD282X Init*/
  MemoryInit();
  while(SD_Init()!=SD_OK)
  {
   StringDisplay(5,52,"SD_Init Fail",RED);
   StringDisplay(5,69,"pleas check",RED);
   Delay_ms(500);
   LED_Toggle(LED2);
  }
  ShowSDCardInfo();
  sprintf((char*)ptraddr,"SD_Size:%dMB",SDCardInfo.CardCapacity>>20);
  StringDisplay(5,52,"SD Successful",GREEN);
  StringDisplay(5,69,ptraddr,GREEN);
  
  while(extraFunctionInit())
  {
   printf(" please check.....");
   Delay_ms(500);
  }
       printf(" after malloc (3)fs1=%p",fs1);
       printf(" after malloc (3)&fs1%d",&fs1);   
  status1=f_mount(0,fs1);
  printf(" Result from f_mount is:%d",status1);
  
  status2=capacityGet(0,&total,&free);
  printf(" Result from FATFS is:%d",status2);
  while(status2)
  {
     StringDisplay(5,86,"SD FATFS FAIL",RED);   
     StringDisplay(5,103,"Check!!",RED);   
  }
   StringDisplay(5,120,"By FATFAS READ",GREEN);
   StringDisplay(5,137,"Total:",GREEN);
   ValueDisplay(102,137,total,GREEN);  
   StringDisplay(5,154,"Free:",GREEN);  
   ValueDisplay(102,154,free,GREEN);
  while(1);


通过串口信息追踪,直接操作SD读取容量,读取里面文件信息也是成功的;
调用malloc分配供FATFS使用的空间也是OK的;
使用f_mount()注册磁盘,返回也是OK的;
然后在通过FATFS获取容量是,返回 FR_NO_FILESYSTEM;
然后通过不停的插入printf,capacityGet()调用f_getfree(),然后f_getfree调用chk_mounted(),
错误发生在chk_mounted()中。如下加粗斜体文字部分,fmt返回值为2,然后就返回了 FR_NO_FILESYSTEM;
串口信息如图片,请教下各位是哪里出问题了、、、、。完全懵逼了。

    fmt = check_fs(fs, bsect = 0);        /* Load sector 0 and check if it is an FAT-VBR (in SFD) */
   printf(" Error test: check_fs(fs, bsect = 0)=fmt =%d",fmt);   
    if (LD2PT(vol) && !fmt) fmt = 1;    /* Force non-SFD if the volume is forced partition */
     printf(" (2)fmt =%d",fmt);  
    if (fmt == 1) {                        /* Not an FAT-VBR, the physical drive can be partitioned */
        /* Check the partition listed in the partition table */
        pi = LD2PT(vol);
        if (pi) pi--;
        tbl = &fs->win[MBR_Table + pi * SZ_PTE];/* Partition table */
        if (tbl[4]) {                        /* Is the partition existing? */
            bsect = LD_DWORD(&tbl[8]);        /* Partition offset in LBA */
            fmt = check_fs(fs, bsect);        /* Check the partition */
        }
    }
printf(" (3)fmt =%d",fmt);    if (fmt == 3) return FR_DISK_ERR;
    if (fmt) return FR_NO_FILESYSTEM;        /* No FAT volume is found */
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
神奇的蛋蛋
2019-07-21 14:26
跪求大神。。。想到单步运行跟直接运行唯一的区别是时间问题,我在程序里试了个遍,在disk_read加上至少800us的延时就能正常读取。
可是想不明白为什么。。
[mw_shl_code=c,true]DRESULT disk_read (
    BYTE drv,        /* Physical drive nmuber (0..) */
    BYTE *buff,        /* Data buffer to store read data */
    DWORD sector,    /* Sector address (LBA) */
    BYTE count        /* Number of sectors to read (1..255) */
)
{
       
        uint8_t status=0;
       
    if(((uint32_t)buff&(uint32_t)0x1)!=0)
        printf(" disk_read error:data is not aligned!buff is %x,count is %d",buff,count);
   
    if (count > 1)
    {
                                status=SDRead(buff,sector,count);
                          Delay_ms(5);                               
    }
    else
    {
                         status=SDRead(buff,sector,count);   
                         Delay_ms(1);               
    }
                //printf(" In disread  status=%d",status);
   if(status==0x00) return RES_OK;
                else return RES_ERROR;
               
}[/mw_shl_code]

一周热门 更多>