OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2780|回复: 1

f_mkdir每次要执行3遍才会操作成功

[复制链接]

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2013-12-17
在线时间
36 小时
发表于 2018-5-18 13:36:27 | 显示全部楼层 |阅读模式
1金钱
大家好,本人在做SPI操作SD卡的FATFS文件系统时发现一个问题,FILINFO finfo;
  DIR dirs;
    char path[50]={"0:/20171234"};   
//  printf("\n  file system(Tini-FatFa0.07C) starting! \n");

  disk_initialize(0);

  f_mount(0, &fs);
    res = f_mkdir("0:/20171234");
  res = f_opendir(&dirs, path);

以上代码我执行f_mkdir函数后打断点看,前两次都是FR_NO_FILESYSTEM,然后复位重启,第三次返回FR_OK,后面读写都正常了,这个有人碰到过吗?是怎么回事?

diskio函数如下:
/*-----------------------------------------------------------------------*/
/* 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 <string.h>
#include "Pro_Memory.h"
#include "diskio.h"
//#include "sdcard.h"
/*-----------------------------------------------------------------------*/
/* Inidialize a Drive                                                    */

#define SECTOR_SIZE 512U

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



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

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



/*-----------------------------------------------------------------------*/
/* Read Sector(s)                                                        */

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) */
)
{
        SD_ReadDisk(&buff[0],sector,count);                                         
    return RES_OK;
}



/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */

DRESULT disk_write (
        BYTE drv,                        /* Physical drive nmuber (0..) */
        const BYTE *buff,        /* Data to be written */
        DWORD sector,                /* Sector address (LBA) */
        BYTE count                        /* Number of sectors to write (1..255) */
)
{
        SD_WriteDisk((u8*)buff,sector,count);  
    return RES_OK;

}

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

DRESULT disk_ioctl (
        BYTE drv,                /* Physical drive nmuber (0..) */
        BYTE ctrl,                /* Control code */
        void *buff                /* Buffer to send/receive control data */
)
{
    return RES_OK;
}


/*-----------------------------------------------------------------------*/
/* 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;
}
                                                       
SD卡的读写扇区函数如下:
u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)
{        u8 r1;
        if(SD_Type!=SD_TYPE_V2HC) sector <<= 9;//
        if(cnt==1)
        {        r1=SD_SendCmd(CMD17,sector,0X01);//
                if(r1==0)//
                {        r1=SD_RecvData(buf,512);//   
                }
        SD_SendCmd(CMD12,0,0X01);        //
        }
        else
        {        r1=SD_SendCmd(CMD18,sector,0X01);//
                do
                {        r1=SD_RecvData(buf,512);//         
                        buf+=512;  
                }while(--cnt && r1==0);        
                SD_SendCmd(CMD12,0,0X01);        //
        }   
        SD_DisSelect();//è&#161;&#207;&#251;&#198;&#172;&#209;&#161;
        return r1;//
}

u8 SD_WriteDisk(u8*buf,u32 sector,u8 cnt)
{        u8 r1;
        if(SD_Type!=SD_TYPE_V2HC)sector *= 512;
        if(cnt==1)
        {        r1=SD_SendCmd(CMD24,sector,0X01);
                if(r1==0)
                {        r1=SD_SendBlock(buf,0xFE);  
                }
        }
        else
        {        if(SD_Type!=SD_TYPE_MMC)
                {        SD_SendCmd(CMD55,0,0X01);       
                        SD_SendCmd(CMD23,cnt,0X01);       
                }
                r1=SD_SendCmd(CMD25,sector,0X01);
                if(r1==0)
                {        do
                        {        r1=SD_SendBlock(buf,0xFC);
                                buf+=512;  
                        }while(--cnt && r1==0);
                        r1=SD_SendBlock(0,0xFD);
                }
        }   
        SD_DisSelect();
        return r1;//
}

大家帮忙看看哪里有问题?
SD卡我是用电脑先格式化过的,格式化扇区为32K。



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-5-19 02:00:48 | 显示全部楼层
参考我们例程学习下吧
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 07:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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