野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 214|回复: 3

FATFS文件系统——sector+=512后,f_open()返回7

[复制链接]
发表于 2019-12-7 17:25:31 | 显示全部楼层 |阅读模式
求助。
FATFS文件系统移植视频中的例程,我自己在编写程序的过程中出现1个问题
sector 没有偏移512之前,程序可以正常运行。
运行结果:

扇区未偏移

扇区未偏移

sector 偏移512之后,程序再执行完f_open后返回7,FR_DENIED。

扇区偏移

扇区偏移









/***************************程序***************************/
disk_read:

write

write




disk_write:



disk_ioctl:

ioctl

ioctl






read

read
回复

使用道具 举报

 楼主| 发表于 2019-12-8 10:27:11 | 显示全部楼层
我用资料盘给的例程也是f_open返回7
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-8 10:32:39 | 显示全部楼层
main.c文件如下


#include "stm32f10x.h"
#include "./usart/bsp_usart.h"
#include "./led/bsp_led.h"
#include "./flash/bsp_spi_flash.h"
#include "ff.h"                        /* Declarations of FatFs API */



FATFS   fs;
FIL     fp;
UINT    bw;
UINT    br;
const char wData[]="欢迎使用野火开发板!";
char rData[4096]="";
/*
* 函数名:main
* 描述  :主函数
* 输入  :无
* 输出  :无
*/
int main(void)
{        
        FRESULT res;
        LED_GPIO_Config();
        LED_BLUE;
       
        /* 配置串口为:115200 8-N-1 */
        USART_Config();
        printf("\r\n这是一个 FATFS文件系统移植实验 \r\n");
               
        res = f_mount(&fs,"1:",1);
       
        printf("f_mount res=%d\n",res);
       
        if(res==FR_NO_FILESYSTEM)
        {
                res=f_mkfs("1:",0,0);
                printf("\r\nf_mkfs res=%d\n",res);
               
                //格式化后要取消挂载再重新挂载
                res = f_mount(NULL,"1:",1);
                res = f_mount(&fs,"1:",1);
               
                printf("\r\nsecond f_mount res=%d\n",res);
        }
       
        res=f_open(&fp,"1:abcd.txt",FA_OPEN_ALWAYS|FA_READ|FA_WRITE );  
        printf("f_open res=%d\n",res);
        if(res==FR_OK )
        {
                res=f_write(&fp,wData,sizeof(wData),&bw);
                printf("\r\nbw=%d",bw);
                if(res==FR_OK )
                {       
                        f_lseek(&fp,0);
                        res=f_read(&fp,rData,f_size(&fp),&br);
                       
                        if(res==FR_OK )
                        {
                                printf("\r\n文件内容:%s br=%d",rData,br);
                        }
                }       
        }
        f_close(&fp);  
       
        while(1);  
}


回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-8 10:36:14 | 显示全部楼层
diskio.c

#include "diskio.h"                /* FatFs lower layer API */
#include "./flash/bsp_spi_flash.h"
//#include "usbdisk.h"        /* Example: Header file of existing USB MSD control module */
//#include "atadrive.h"        /* Example: Header file of existing ATA harddisk control module */
//#include "sdcard.h"                /* Example: Header file of existing MMC/SDC contorl module */

/* Definitions of physical drive number for each drive */
//#define ATA                0        /* Example: Map ATA harddisk to physical drive 0 */
//#define MMC                1        /* Example: Map MMC/SD card to physical drive 1 */
//#define USB                2        /* Example: Map USB MSD to physical drive 2 */

#define SD_CARD                0
#define SPI_FLASH        1
/*-----------------------------------------------------------------------*/
/* Get Drive Status                                                      */
/*-----------------------------------------------------------------------*/

DSTATUS disk_status (
        BYTE pdrv                /* Physical drive nmuber to identify the drive */
)
{
        DSTATUS stat;
//        int result;

        switch (pdrv) {
        case SD_CARD :
        //        result = ATA_disk_status();

                // translate the reslut code here

                return stat;

        case SPI_FLASH :
               
        if(SPI_FLASH_ReadID()==sFLASH_ID)
        {
                 //状态正常
                stat = 0 ;
        }
        else
        {
                 //状态异常
                stat = STA_NOINIT ;
        }
                return stat;

        }
        return STA_NOINIT;
}



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

DSTATUS disk_initialize (
        BYTE pdrv                                /* Physical drive nmuber to identify the drive */
)
{
        DSTATUS stat;
        //int result;

        switch (pdrv) {
        case SD_CARD :
        //        result = ATA_disk_initialize();

                // translate the reslut code here

                return stat;

        case SPI_FLASH :
                       
         SPI_FLASH_Init();

         SPI_Flash_WAKEUP();
       
                return disk_status(SPI_FLASH);

        }
        return STA_NOINIT;
}



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

DRESULT disk_read (
        BYTE pdrv,                /* Physical drive nmuber to identify the drive */
        BYTE *buff,                /* Data buffer to store read data */
        DWORD sector,        /* Sector address in LBA */
        UINT count                /* Number of sectors to read */
)
{
        DRESULT res;
//        int result;

        switch (pdrv) {
        case SD_CARD :
                // translate the arguments here

                //result = ATA_disk_read(buff, sector, count);

                // translate the reslut code here

                return res;

        case SPI_FLASH :  
                /*扇区偏移2MB,外部FLASH文件系统空间放在SPI FLASH后面6MB空间*/
        //        sector += 512;
                SPI_FLASH_BufferRead(buff,sector*4096,count*4096);
       
                res=RES_OK ;
       
                return res;

        }

        return RES_PARERR;
}



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

#if _USE_WRITE
DRESULT disk_write (
        BYTE pdrv,                        /* Physical drive nmuber to identify the drive */
        const BYTE *buff,        /* Data to be written */
        DWORD sector,                /* Sector address in LBA */
        UINT count                        /* Number of sectors to write */
)
{
        DRESULT res;
        //int result;
  
        switch (pdrv) {
        case SD_CARD  :
                // translate the arguments here

                //result = ATA_disk_write(buff, sector, count);

                // translate the reslut code here

                return res;

        case SPI_FLASH :
                        /*扇区偏移2MB,外部FLASH文件系统空间放在SPI FLASH后面6MB空间*/
                        //sector += 512;
       
                        //必须先擦除再写入
                        SPI_FLASH_SectorErase(sector*4096);
                        SPI_FLASH_BufferWrite((u8 *)buff,sector*4096,count*4096);
            
                        res=RES_OK ;
       
                return res;

        }

        return RES_PARERR;
}
#endif


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

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

        switch (pdrv) {
        case SD_CARD  :

                // Process of the command for the ATA drive

                return res;

        case SPI_FLASH  :
                        switch(cmd)
                        {
                                //返回扇区个数
                                case GET_SECTOR_COUNT:
                                        /*扇区数量:1536*4096/1024/1024=6(MB)*/
                                        *(DWORD * )buff = 2048;
                                break;
                               
                                //返回扇区大小
                                case GET_SECTOR_SIZE:
                                        *(WORD*)buff = 4096;
                                break;
                               
                                //返回擦除扇区的最小个数 (单位是扇区)
                                case GET_BLOCK_SIZE:
                                        *(DWORD*)buff = 1;
                                break;
                        }

                 res=RES_OK ;

                return res;

        }

        return RES_PARERR;
}
#endif



//返回时间
DWORD get_fattime (void)
{
        return  0;
}

回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|站点地图|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号-2 ) 大学生ARM嵌入式2群

GMT+8, 2020-8-8 06:39 , Processed in 0.626595 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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