打印

求人指点一下我的FatFS移植不能创建txt文件

[复制链接]
8313|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aoshi0603|  楼主 | 2011-8-10 09:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 aoshi0603 于 2011-8-10 11:15 编辑

应用源码:
 
//Task 20
void Task20_DataAccesss(void *pdata)
{
  pdata = pdata;
  INT8U err;
  
  u8 data1[512] = { "12345678" };
  u8 data2[512] = { "0" };
  FATFS fs;
  FIL file;
  FRESULT res;
  UINT btw, bw;
  
  OSTimeDlyHMSM(0, 0, 10, 0 );  /* Wait 10 second    */
  
  //开打文件 test1.txt , 如果该文件不存在, 创建该文件:
  res = f_mount(0, &fs);
  if(res == FR_OK)
  {
    res = f_open(&file, "test1.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE);
    if(res == FR_OK)/* 这一处进不来, 检查res值为13,即FR_NO_FILESYSTEM,  (13) There is no valid FAT volume on the physical drive */

    {
      btw = 256, bw = 0;
      res = f_write(&file, data1, btw, &bw);
      if(res == FR_OK)          {
        if(btw == bw)
        {}
      }
      //f_close(&file);
    }
    //else f_mount(0, NULL);
  }
  
  //读取文件 test1.txt 前8个字节:
  btw = 8, bw = 0;
  res = f_read(&file, data2, btw, &bw);
  if(res == FR_OK)
  {
    if(btw == bw)
    {
      //显示接收数据:
      LCMprintf( 0, 80, "%3d", data2[0]);
      LCMprintf( 3, 80, "%3d", data2[1]);
      LCMprintf( 6, 80, "%3d", data2[2]);
      LCMprintf( 9, 80, "%3d", data2[3]);
      LCMprintf(12, 80, "%3d", data2[4]);
      LCMprintf(15, 80, "%3d", data2[5]);
      LCMprintf(18, 80, "%3d", data2[6]);
      LCMprintf(21, 80, "%3d", data2[7]);
    }
  }
  
  f_close(&file);
  f_mount(0, NULL);
  
  while(1)
  {
    OSSemPend (AckSem, 0, &err);
  }
}

为什么res = f_open(&file, "test1.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE);的返回结果值为13:
FR_NO_FILESYSTEM,  (13) There is no valid FAT volume on the physical drive */


相关帖子

沙发
aoshi0603|  楼主 | 2011-8-10 15:28 | 只看该作者
差不多知道怎么回事了, 出现错误FR_NO_FILESYSTEM,  (13) There is no valid FAT volume on the physical drive */
可能的原因是因为没有格式化存储器, 在f_mount(0, &fs);之后使用f_mkfs(0,0,_MAX_SS);格式化驱动器.

为了简便,我在RAM中建立一个数组u8 RamStorage[16][512];将其做为存储器,在使用使用f_mkfs(0,0,_MAX_SS);时返回错误:return FR_MKFS_ABORTED;        /* Too small volume */
我想可能的原因是我分配的u8 RamStorage[16][512];太小了, 我贴上我的diskio.c源文件, 望大家给看一下,我的底层函数写的对不对

使用特权

评论回复
板凳
aoshi0603|  楼主 | 2011-8-10 15:33 | 只看该作者
本帖最后由 aoshi0603 于 2011-8-10 15:38 编辑

大家帮我看一下,我的diskio.c底层文件写的对不对,
内容很少, 因为是对RAM操作的,
在调用f_mkfs(0,0,0);时出现了两个错误:
if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_vol) != RES_OK || n_vol < 128)
                return FR_DISK_ERR;

if (n_vol < b_data + au) return FR_MKFS_ABORTED;        /* Too small volume */
这个是不是因为分配的RAM存储区u8 RamStorage[16][512];太小了???

/*-----------------------------------------------------------------------*/
/* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2007        */
/*-----------------------------------------------------------------------*/
/* This is a stub disk I/O module that acts as front end of the existing */
/* disk I/O modules and attach it to FatFs module with common interface. */
/*-----------------------------------------------------------------------*/

#include "includes.h"


u8 RamStorage[16][512];

/*-----------------------------------------------------------------------*/
/* Inidialize a Drive                                                    */

DSTATUS disk_initialize (
        BYTE drv                /* Physical drive nmuber (0..) */
)
{
  return RES_OK;                //初始化成功
}



/*-----------------------------------------------------------------------*/
/* Return Disk Status                                                    */

DSTATUS disk_status (
        BYTE drv                /* Physical drive nmuber (0..) */
)
{
  return RES_OK;
}



/*-----------------------------------------------------------------------*/
/* Read Sector(s)                                                        */
/* The disk_read function reads sector(s) from the disk drive.                 */

DRESULT disk_read (
  BYTE  Drive,           /* Physical drive number (0..9)                */
  BYTE* Buffer,         /* Pointer to the read data buffer        */
  DWORD SectorNumber,      /* Specifies the start sector number in logical block address (LBA).        */
  BYTE  SectorCount             /* Specifies number of sectors to read. The value can be 1 to 255.        */
)
{
  u16 n;
  switch(Drive)
  {
  case 0:                        /* 读片上 Flash */
    if(SectorCount == 0)        //不能为0
      return RES_PARERR;
    while(SectorCount--)
    {
      for(n=0;n<512;n++)
      {
        *Buffer++ = RamStorage[SectorNumber][n];
      }
      SectorNumber++;
    }
    return RES_OK;
   
  case 1:                /* 读外部 NAND FLASH */
    return RES_NOTRDY;
   
  default:
    return RES_PARERR;
   
  }
}

/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */
/* The disk_write writes sector(s) to the disk.                                 */

#if _READONLY == 0
DRESULT disk_write (
  BYTE  Drive,                /* Specifies the physical drive number(0..9)                */
  const BYTE* Buffer,        /* Pointer to the byte array to be written.                */
  DWORD SectorNumber,        /* Specifies the start sector number in logical block address (LBA).        */
  BYTE  SectorCount        /* Specifies the number of sectors to write. The value can be 1 to 255.        */
)
{
  u16 n;
  
  switch(Drive)
  {
  case 0:                /* 读片上 Flash */
    while(SectorCount--)
    {
      for(n=0;n<512;n++)
      {
        RamStorage[SectorNumber][n] = *Buffer++;
      }
      SectorNumber++;
    }
    return RES_OK;
   
  case 1:                /* 读外部 NAND FLASH */
    return RES_NOTRDY;
   
  default:
    return RES_PARERR;
  }
}
#endif /* _READONLY */



/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions                                               */

DRESULT disk_ioctl (
  BYTE Drive,                /* Drive number */
  BYTE Command,                /* Control command code */
  void* Buffer                /* Parameter and data buffer */
)
{
  switch(Drive)
  {
  case 0:                /* 读片上 Flash */
    {
      switch(Command)
      {
      case CTRL_SYNC:
      
        /* Make sure that the disk drive has finished pending write process.
        When the disk I/O module has a write back cache, flush the dirty sector immediately.
        This command is not used in read-only configuration. */
        
        return RES_OK;
        
      case GET_SECTOR_SIZE:
        
        /* Returns sector size of the drive into the WORD variable pointed by Buffer.
        This command is not used in fixed sector size configuration, _MAX_SS is 512.
        */
        
        *(WORD*)Buffer = 512;
        return RES_OK;
        
      case GET_SECTOR_COUNT:
        
        /* Returns number of available sectors on the drive into the DWORD variable pointed by Buffer.
        This command is used by only f_mkfs function to determine the volume size to be created.
        */
        
        *(DWORD*)Buffer = 4;
        return RES_OK;
        
      case GET_BLOCK_SIZE:
        
        /* Returns erase block size of the flash memory in unit of sector into the DWORD variable pointed by Buffer.
        The allowable value is 1 to 32768 in power of 2.
        Return 1 if the erase block size is unknown or disk devices.
        This command is used by only f_mkfs function and it attempts to align data area to the erase block boundary.
        */
        
        *(WORD*)Buffer = 512;
        return RES_OK;
      
      case CTRL_ERASE_SECTOR:
        
        /* Erases a part of the flash memory specified by a DWORD array {<start sector>, <end sector>} pointed by Buffer.
        When this feature is not supported or not a flash memory media, this command has no effect.
        The FatFs does not check the result code and the file function is not affected even if the sectors are not erased well.
        This command is called on removing a cluster chain when _USE_ERASE is 1.
        */
        
        return RES_OK;
        
      default:
        return RES_PARERR;
      }
    }
   
  case 1:                /* 读外部 NAND FLASH */
    return RES_NOTRDY;
  default:
    return RES_PARERR;
  }
}


/*-----------------------------------------------------------------------*/
/* User defined function to give a current time to fatfs module          */
/* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */                                                                                                                                                                                                                                          
/* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */                                                                                                                                                                                                                                                
DWORD get_fattime (void)
{
  return 0;
}

使用特权

评论回复
地板
song19881218| | 2012-12-12 16:58 | 只看该作者
加上这句试试res = f_mkfs(0 , 0, _MAX_SS);

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

113

帖子

3

粉丝