首页 > 其他分享 >移植FatFs到W25Q256

移植FatFs到W25Q256

时间:2023-09-29 23:34:55浏览次数:42  
标签:sector W25Q256 return res FatFs File printf 移植

1. 移植diskio.c

diskio.c文件用来连接硬件存储器和ff.c文件

a. 为W25Q256设置驱动编号

/*将W25Q256设为驱动1*/
#define W25Q256		1	/*Map Flash W25Q256 to physical drive 1 */

b.配置disk_status函数,获取W25Q256状态

DSTATUS disk_status (
	BYTE pdrv		/* Physical drive nmuber to identify the drive */
)
{
    DSTATUS stat;
    int result;
    switch (pdrv) {
        case ATA :
            return stat;
            /*读取W25Q256状态*/
        case W25Q256 :  
            /*读取W25Q256设备ID,确认状态*/
            if(0xEF4019 == BSP_W25Q256_ReadID())
            {
                /* 设备ID正确 */
                stat = 0;
            }
            else
            {
                /* 设备ID错误 */
                stat = STA_NOINIT;
            }
            result = stat;
            return stat;
    }  
    return STA_NOINIT;
}

 c.连接初始化函数

DSTATUS disk_initialize (
    BYTE pdrv				/* Physical drive nmuber to identify the drive */
)
{
    DSTATUS stat;
    int result;
    switch (pdrv) {
        case ATA :
            //		result = ATA_disk_initialize();
            // translate the reslut code here
            return stat;
        case W25Q256 :
            BSP_W25Q256_Init();/*初始化W25Q256*/
            stat=disk_status(W25Q256);/*获取W25Q256状态*/
            result = stat;
            return stat;
    }
    return STA_NOINIT;
}

 d.连接读取函数

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 ATA :
            // translate the arguments here
            //		result = ATA_disk_read(buff, sector, count);
            // translate the reslut code here
            return res;
        case W25Q256 :
            /* 扇区偏移16MB,外部Flash文件系统空间放在Flash后面16MB空间 
        一共512Block*16 = 8192 Sector = 32MB
        sector+=4096 表示从第4096个sector开始
        第4096个sector地址:0x4096 000
        第4097个sector地址:0x4097 000
        相差0x1000*/
            sector+=4096;
            /*sector*0x1000 将第几个Sector转换为W25Q256地址
        count*4096 第二个参数是Byte数量,一个Sector有4096个Byte*/
            BSP_W25Q256_Read_Data(sector*0x1000,count*4096 ,buff);
            res = RES_OK;
            return res;
    }
    return RES_PARERR;
}

e.连接写函数

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 ATA :
            // translate the arguments here
            //result = ATA_disk_write(buff, sector, count);
            // translate the reslut code here
            return res;
        case W25Q256 :
            /* 扇区偏移16MB,外部Flash文件系统空间放在Flash后面16MB空间 
        一共512Block*16 = 8192 Sector = 32MB*/
            sector+=4096;
            BSP_W25Q256_Sector_Erase(sector*0x1000);
            BSP_W25Q256_Write_General(sector*0x1000,(u8 *)buff,count*4096);
            res = RES_OK;
            result = res;
            return res;
    }
    return RES_PARERR;
}

f.其他命令函数

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 ATA :
            // Process of the command for the ATA drive
            return res;
        case W25Q256 :
            switch (cmd) {
                    /* 扇区数量:4096sector*/
                case GET_SECTOR_COUNT:
                    *(DWORD * )buff = 4096;		
                    break;
                    /* 扇区大小 4096Byte */
                case GET_SECTOR_SIZE :
                    *(WORD * )buff = 4096;
                    break;
                    /* 同时擦除扇区个数 */
                case GET_BLOCK_SIZE :
                    *(DWORD * )buff = 1;
                    break;        
            }
            res = RES_OK;
            return res;
    }
    return RES_PARERR;
}

2.配置ffconf.h 配置各种状态

#define	_USE_MKFS		1 //格式化分区使能
#define _CODE_PAGE	    936 //选择简体中文,加入cc936.c
#define	_USE_LFN	    2    //打开LFN
#define	_MAX_LFN	    255
#define _VOLUMES	    2 //两个分卷ATA和W25Q256
#define	_MIN_SS		    512
#define	_MAX_SS		    4096      //sector大小设置

 3.测试FatFs

    {
        printf("\n******FATFS TEST******");
        /*注册一个FatFs工作区域*/
        f_mkfs("1:",0,0);
        if(0==f_mount(&Fs_1,"1:",1))
        {
            printf("\nW25Q256 注册成功");
        }
        else
        {
            printf("\nW25Q256 注册失败");
            printf("\n格式化文件系统");
            /*格式化文件系统*/
            f_mkfs("1:",0,0);
        }
        /*显示芯片ID*/
        printf("\nW25Q256 ID:0X%X",BSP_W25Q256_ReadID());
        /*新建变量保存操作状态*/
        uint8_t FatFsState;
        /*开始新建文件并写入数据*/
        printf("\n开始新建文件并写入数据!");
        /*新建文件File_1.txt,指针File_1*/
        FatFsState = f_open(&File_1, "1:File_1.txt",FA_CREATE_ALWAYS | FA_WRITE );
        printf("\nf_open 1:File_1.txt state:%d",FatFsState);
        /*写入数据*/
        FatFsState = f_write(&File_1,File_1Content,sizeof(File_1Content),&File1Num);
        printf("\nf_write 1:File_1.txt state:%d",FatFsState);
        /*关闭文件*/
        FatFsState = f_close(&File_1);
        printf("\nf_close 1:File_1.txt state:%d",FatFsState);
        /*写入完成*/
        printf("\n写入完成!");
        printf("\nWrite File1 Number:%d",File1Num);
        printf("\nWrite File1 Content:%s",File_1Content);
        /*打开文件*/
        printf("\n打开文件1:File_1.txt!读取内容");
        FatFsState = f_open(&File_1, "1:File_1.txt",FA_OPEN_EXISTING | FA_READ );
        printf("\nf_open 1:File_1.txt state:%d",FatFsState);
        /*读取数据*/
        FatFsState = f_read(&File_1, ReadFile_1Content, sizeof(ReadFile_1Content), &File1Num);
        printf("\nf_read 1:File_1.txt state:%d",FatFsState);
        /*关闭文件*/
        FatFsState = f_close(&File_1);
        printf("\nf_close 1:File_1.txt state:%d",FatFsState);
        /**读取的数据*/
        printf("\n读取完成!");
        printf("\nRead File1 Number:%d",File1Num);
        printf("\nRead File1 Content:%s",ReadFile_1Content);
        /*计算存储空间*/
        DWORD free_clust;
        FATFS *pFs_1;
        f_getfree("1:", &free_clust, &pFs_1);
        DWORD fre_sect, tot_sect;
        tot_sect = (pFs_1->n_fatent - 2) * pFs_1->csize;
        fre_sect = free_clust * pFs_1->csize;
        printf("\n设备总空间:%d\n可用空间:  %d\n", (int)tot_sect, (int)fre_sect);
        f_mount(NULL,"1:",1);
    }

 测试结果:

 

标签:sector,W25Q256,return,res,FatFs,File,printf,移植
From: https://www.cnblogs.com/Yannnnnn/p/17737511.html

相关文章

  • FatFs文件系统移植应用笔记
    FatFs文件系统移植应用笔记使单片机拥有按文件访问存储器中数据的能力,要满足两个必要的条件。其一是存储器已完成格式化操作,即存储器按FAT/FAT16/FAT32等格式记录数据,其二是软件中实现文件系统功能,即能够按照存储器中文件记录的格式,操作已有的数据或添加新数据。FatFs是一个轻......
  • QT之ARM平台的移植
    原文: https://www.cnblogs.com/jzcn/p/15201582.html在开发板中运行QT程序的基本条件是具备QT环境,那么QT的移植尤为重要,接下载我将和小伙伴们一起学习QT的移植。一、准备材料tslib源码qt-everywhere-src-5.12.9.tar.xz源码arm开发版二、获取安装包tslib源码的git获取......
  • 关于FatFs文件系统中使用f_write函数写入数据时注意事项
    在我们使用f_write函数向SD卡或FLASH写入数据时,会出现SD卡或Flash返回正常但数据并没有写入的现象,如下图: 文件打开只是一个空文件。原因如下:f_write后没关闭,缓存的写入流在进行f_open时被清掉了,所以读到一个空文件。遇到以上问题时,需要进行如下操作:f_write完了先f_close,再......
  • GD32F427移植-RT-Thread标准版
    GD32移植RT-Thread标准版1前言这篇文档主要记录自己基于BSP移植RTT标准板到GD32的过程。目标芯片:GD32F427V使用工具:keil、env2参考资料【GD32F427开发板试用】从0开始到RTthread移植教你动手移植RT-Thread到国产MCU【国产MCU移植】手把手教你使用RT-Thread制作GD32系列......
  • 尚观6410开发板移植linux 3.6.6问题记录及经验小结
    原文:https://www.cnblogs.com/iwantcomputer/p/8489831.html尚观6410开发板移植linux3.6.6问题记录及经验小结把开发板右上角的红色启动选项开关,两个都拨到下面(NAND),连接串口,已经内置了uboot1.16。根文件系统使用ext2的ramdisk,由于网卡无法驱动故无法使用nfs的根文件系统,网卡......
  • Linux内核裁剪移植
    目录前奏内核移植步骤制作可引导的LinuxISO文件对新机器配置网络前奏rambo@debian:~$cat/etc/issueDebianGNU/Linux12\n\lrambo@debian:~$free-htotalusedfreesharedbuff/cacheavailableMem:15Gi1.......
  • 在RISC-V上移植系统
    预备知识GNUBinutils参考文档GNUBinutils是一系列用来生成可执行文件的软件的集合体,它包括我们常常使用的ld,as等软件。即使你没有亲自使用过这些软件,只要你使用了gcc就相当于间接使用了它们,因为gcc会在生成可执行程序时使用这些软件。我们需要准备好as和ld的参考文档,因为我们......
  • arm linux 移植 ffmpeg 库 + x264 + x265
    背景Ffmpeg中带有h264的解码,没有编码,需要添加x264。libx264是一个自由的H.264编码库,是x264项目的一部分,使用广泛,ffmpeg的H.264实现就是用的libx264。FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转......
  • RK3568开发笔记(十一):开发版buildroot固件移植一个ffmpeg播放rtsp的播放器Demo
    前言  目标开发任务还有个功能,就是播放rtsp摄像头,当然为了更好的坐这个个,我们必须支持rtsp播放失败之后重新尝试,比如5s重新尝试打开一次,从而保障联网后重新打开,然后达成这个功能。 Demo   补充  得益于方案上的buildroot已经移植了ffmpeg4.1.3。  ......
  • RK3568开发笔记(十):开发板buildroot固件移植开发的应用Demo,启动全屏显示
    前言  上一篇,移植应用前的通讯接口工作和全屏工作都已经完成了。本篇移植开发的商业应用。<br>交叉编译好应用  (略),参照《RK3568开发笔记(八):开发板烧写buildroot固件(支持hdmi屏),搭建Qt交叉编译开发环境,编译一个Demo,目标板运行Demo测试》<br>解决全屏标题栏占用问题  交叉......