打印

用过fatfs文件系统的大侠进来看看

[复制链接]
3529|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxfasx|  楼主 | 2011-2-18 15:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我现在用LPC2368读写SD卡,文件系统为fatfs,用f_open创建文件时老发生错误,有时返回无文件系统,有时返回磁盘错误。有关底层移植函数如下:
DSTATUS disk_initialize (
BYTE drv            /* Physical drive nmuber (0..) */
)
{
DSTATUS stat;
if (drv)
{
  return STA_NOINIT;         /* Supports only single drive */
}
    if (!SD_Initialize(&sds))                 /* Initialization succeded */
{
     stat = 0;        /* Clear STA_NOINIT */
}
return stat;
}初始化函数

DSTATUS disk_status (
BYTE drv  /* Physical drive nmuber (0..) */
)
{
DSTATUS stat;
if (drv)
{
  return STA_NOINIT;     /* Supports only single drive */
}
else
{
  stat = 0;
}
return stat;
}
读状态函数
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) */
)
{
INT8U res = 0;
if (drv || (!count))
{
  return RES_PARERR;
}
//if (Stat & STA_NOINIT) return RES_NOTRDY;
if (count == 1)  /* Single block read   */
{
   res = SD_ReadBlock(&sds, sector, buff);
}
else             /* Multiple block read */
{
  res = SD_ReadMultiBlock(&sds, sector, count, buff);
}
     if(res == 0x00)
    {
        return RES_OK;
    }
    else
    {
        return RES_ERROR;
    }
}
读扇区函数,其中SD卡的底层读块程序正确

DRESULT disk_ioctl (
BYTE drv,  /* Physical drive nmuber (0..) */
BYTE ctrl,  /* Control code */
void *buff  /* Buffer to send/receive control data */
)
{
DRESULT res;
BYTE n, csdbuf[16],ret;
DWORD csize;
if (drv)
{
  return RES_PARERR;
}
//if (stat & STA_NOINIT) return RES_NOTRDY;
//res = RES_ERROR;
//if (Stat & STA_NOINIT) return RES_NOTRDY;
switch (ctrl)
{
     case CTRL_SYNC       : res = RES_OK; break;
     case GET_SECTOR_COUNT: ret = SdCmd_Send_CSD(&sds, 16, csdbuf);
                            if (ret != SD_NO_ERR)
                         return ret;
          {
              if((csdbuf[0] >> 6) == 1) /* SDC ver 2.00 */
              {
                  csize = csdbuf[9] + ((WORD)csdbuf[8] << 8) + 1;
                  *(DWORD*)buff = (DWORD)csize << 10;
              }
              else /* MMC or SDC ver 1.XX */
              {
                  n = (csdbuf[5] & 15) + ((csdbuf[10] & 128) >> 7) + ((csdbuf[9] & 3) << 1) + 2;
                  csize = (csdbuf[8]>> 6) + ((WORD)csdbuf[7] << 2) + ((WORD)(csdbuf[6] & 3) << 10) + 1;
                  *(DWORD*)buff = (DWORD)csize << (n - 9);
              }
              res = RES_OK;
          }
          break;
     case GET_SECTOR_SIZE : /* Get sectors on the disk (WORD) */
                      *(WORD*)buff = 512;
                      res = RES_OK;
                      break;
     case GET_BLOCK_SIZE  : ret = SdCmd_Send_CSD(&sds, 16, csdbuf);
                            if (ret != SD_NO_ERR)
                         return ret;
                         {
                          *(DWORD*)buff = (((csdbuf[SECTOR_SIZE_POS1] & SECTOR_SIZE_MSK1) << 1) +     
                                ((csdbuf[SECTOR_SIZE_POS2] & SECTOR_SIZE_MSK2) >> 7) + 1) << ((csdbuf[13] >> 6) - 1);
                          res = RES_OK;
                         }
                            break;

     default              : res = RES_PARERR; break;
}
return res;
}
调了两天,老创建不了文件,头大,有做过相关的朋友进来指点看看,谢谢!

相关帖子

沙发
金鱼木鱼| | 2011-2-20 20:24 | 只看该作者
没用过,帮你顶起来

使用特权

评论回复
板凳
我爸是李刚| | 2011-2-21 12:36 | 只看该作者
完全不懂,帮顶

使用特权

评论回复
地板
小云001| | 2011-2-21 13:39 | 只看该作者
楼主,帮不上忙了。

使用特权

评论回复
5
zxfasx|  楼主 | 2011-2-22 13:13 | 只看该作者
已搞定,谢谢各位

使用特权

评论回复
6
hehu8| | 2011-11-8 09:57 | 只看该作者
本帖最后由 hehu8 于 2011-11-8 10:50 编辑

5# zxfasx
你好,我现在也在keil下调试2368下的FatFs+ZLG_SD_MCI程序。
在没有fatfs时ZLG_SD_MCI单块读写,多块读写都正常。
加上fatfs时就会在ZLG_SD_MCI驱动SD_ReadBlock()函数里返回不了,即跳转到这个地方返回不了。
SDRD_BLK_END:
       SdCmd_Deselect_Card(sds, 0);/* CMD7: 退出传输状态 */
       SD_ReleaseOSSem(sds);             /* 释放访问卡信号量 */
    return ret;


调用SD_ReadMultiBlock()也是这种情况。
但是跟踪调试发现单块数据读出来都正常,就是在上面两个函数里返回不了。出现指令异常。
能给指点一下吗?谢谢!

刚刚终于解决了,原因是用的keil里自带的启动文件,里边的heap空间太小,造成程序跑飞了。


qq:363020987

使用特权

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

本版积分规则

个人签名:菩萨保佑!

13

主题

389

帖子

2

粉丝