首页 > 其他分享 >FATs文件系统笔记

FATs文件系统笔记

时间:2023-09-15 16:58:25浏览次数:34  
标签:status case Flash 文件系统 笔记 扇区 FATs SPI pdrv

1.设备状态获取

点击查看代码
DSTATUS disk_status (
    BYTE pdrv   /* 物理编号 */
)
{

    DSTATUS status = STA_NOINIT;

    switch (pdrv) {
    case ATA: /* SD CARD */
        break;

    case SPI_FLASH:
        /* SPI Flash状态检测:读取SPI Flash 设备ID */
        if (sFLASH_ID == SPI_FLASH_ReadID()) {
            /* 设备ID读取结果正确 */
            status &= ~STA_NOINIT;
        } else {
            /* 设备ID读取结果错误 */
            status = STA_NOINIT;;
        }
        break;

    default:
        status = STA_NOINIT;
    }
    return status;
}

2.设备初始化:
参数pdrv,用来指定设备物理编号。对于SPI Flash芯片我们调用SPI_FLASH_Init()函数实现对SPI Flash芯片引脚GPIO初始化配置以及SPI通信参数配置。 SPI_Flash_WAKEUP()函数唤醒SPI Flash芯片,当SPIFlash芯片处于睡眠模式时需要唤醒芯片才可以进行读写操作。

点击查看代码
DSTATUS disk_initialize (
    BYTE pdrv       /* 物理编号 */
)
{
    uint16_t i;
    DSTATUS status = STA_NOINIT;
    switch (pdrv) {
    case ATA:          /* SD CARD */
        break;

    case SPI_FLASH:    /* SPI Flash */
        /* 初始化SPI Flash */
        SPI_FLASH_Init();
        /* 延时一小段时间 */
        i=500;
        while (--i);
        /* 唤醒SPI Flash */
        SPI_Flash_WAKEUP();
        /* 获取SPI Flash芯片状态 */
        status=disk_status(SPI_FLASH);
        break;

    default:
        status = STA_NOINIT;
    }
    return status;
}

3.读取扇区:
野火开发板使用的SPI Flash芯片型号为W25Q256FV,每个扇区大小为4096个字节(4KB),总共有32M字节空间, 为兼容后面实验程序,我们只将后部分16MB空间分配给FatFs使用,前部分16MB空间用于其他实验需要, 即FatFs是从16MB空间开始,为实现这个效果需要将所有的读写地址都偏移4096个扇区空间。

点击查看代码
DRESULT disk_write (
    BYTE pdrv,        /* 设备物理编号(0..) */
    const BYTE *buff, /* 欲写入数据的缓存区 */
    DWORD sector,     /* 扇区首地址 */
    UINT count        /* 扇区个数(1..128) */
)
{
    uint32_t write_addr;
    DRESULT status = RES_PARERR;
    if (!count) {
        return RES_PARERR;    /* Check parameter */
    }

    switch (pdrv) {
    case ATA: /* SD CARD */
        break;

    case SPI_FLASH:
        /* 扇区偏移16MB,外部Flash文件系统空间放在SPI Flash后面16MB空间 */
        sector+=4096;
        write_addr = sector<<12;
        SPI_FLASH_SectorErase(write_addr);
        SPI_FLASH_BufferWrite((u8 *)buff,write_addr,count<<12);
        status = RES_OK;
        break;

    default:
        status = RES_PARERR;
    }
    return status;
}

4.扇区写入
disk_write函数有四个形参,pdrv为设备物理编号。buff指向待写入扇区数据的首地址。sector,指定要读取数据的扇区首地址。 count指定扇区数量。对于SPI Flash芯片,在写入数据之前需要先擦除,所以用到扇区擦除函数(SPI_FLASH_SectorErase)。 然后就是在调用数据写入函数(SPI_FLASH_BufferWrite)把数据写入到指定位置内。

点击查看代码
DRESULT disk_write (
    BYTE pdrv,        /* 设备物理编号(0..) */
    const BYTE *buff, /* 欲写入数据的缓存区 */
    DWORD sector,     /* 扇区首地址 */
    UINT count        /* 扇区个数(1..128) */
)
{
    uint32_t write_addr;
    DRESULT status = RES_PARERR;
    if (!count) {
        return RES_PARERR;    /* Check parameter */
    }

    switch (pdrv) {
    case ATA: /* SD CARD */
        break;

    case SPI_FLASH:
        /* 扇区偏移16MB,外部Flash文件系统空间放在SPI Flash后面16MB空间 */
        sector+=4096;
        write_addr = sector<<12;
        SPI_FLASH_SectorErase(write_addr);
        SPI_FLASH_BufferWrite((u8 *)buff,write_addr,count<<12);    //左移12位实际是乘以4096
        status = RES_OK;
        break;

    default:
        status = RES_PARERR;
    }
    return status;
}

5.其他控制

点击查看代码
DRESULT disk_ioctl (
    BYTE pdrv,    /* 物理编号 */
    BYTE cmd,     /* 控制指令 */
    void *buff    /* 写入或者读取数据地址指针 */
)
{
    DRESULT status = RES_PARERR;
    switch (pdrv) {
    case ATA: /* SD CARD */
        break;

    case SPI_FLASH:
        switch (cmd) {
        /* 扇区数量:4096*4096/1024/1024=16(MB) */
        case GET_SECTOR_COUNT:
            *(DWORD * )buff = 4096;
            break;
        /* 扇区大小  */
        case GET_SECTOR_SIZE :
            *(WORD * )buff = 4096;
            break;
        /* 同时擦除扇区个数 */
        case GET_BLOCK_SIZE :
            *(DWORD * )buff = 1;
            break;
        }
        status = RES_OK;
        break;

    default:
        status = RES_PARERR;
    }
    return status;
}

标签:status,case,Flash,文件系统,笔记,扇区,FATs,SPI,pdrv
From: https://www.cnblogs.com/Charles-Hui/p/17705393.html

相关文章

  • linux里python读写mssql数据库的笔记
    1、安装pyodbcpip3installpyodbc我用的debian12,可以直接aptinstallpython3-pyodbc2、还需要安装linux版的mssqlclient参考这里:https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver......
  • UE4 笔记
    1.FString转TCharTChar*c=(*FString)2.TChar*与char*的互相转换,主要是使用下面的四个宏定义。TCHAR_TO_ANSI(str)ANSI_TO_TCHAR(str)TCHAR_TO_UTF8(str)UTF8_TO_TCHAR(str)[C4668]没有将_WIN32_WINNT_WIN10_TH2"定义为预处理器宏,用0“替换"#if/#elif"添......
  • 【刷题笔记】51. N-Queens
    题目Then-queenspuzzleistheproblemofplacingnqueensonann×nchessboardsuchthatnotwoqueensattackeachother.Givenaninteger n,returnalldistinctsolutionstothe n-queenspuzzle.Eachsolutioncontainsadistinctboardconfigurationoft......
  • HBase/Hadoop学习笔记 (转)
    HBase/Hadoop学习笔记  学习目标:至少掌握五点: 1.    深入理解HTable,掌握如何结合业务涉及高性能的HTable。 2.    掌握与HBase的交互,通过HBaseShell命令及JavaAPI进行数据的增删改查。 3.    掌握如何用MapReduce分析HBase里的数据 4.    掌握如何测试HB......
  • 20211326德永学习笔记2
    第九章总结要点1.I/O库函数与系统调用系统调用函数:open()、read()、write()、lseek()、close();I/O库函数:fopen()、fread()、fwrite()、flseek()、fclose()。I/O库函数一一对应地依赖于系统调用函数。2、I/O库函数的算法-2.1fread算法在第一次调用fread()时,FILE结构体的缓......
  • Python学习笔记-Python异常、模块与包
    了解异常什么是异常当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUG。bug单词的诞生早期计算机采用大量继电器工作,马克二型计算机就是这样的。1945年9月9日,下午三点,马克二型计算机无法正常工作了,技术人员试......
  • 「学习笔记」莫比乌斯反演
    开新坑了。QWQ前置芝士:数论分块。(之后再说。QWQ)积性函数定义一个数论函数\(f(n)\)满足\(f(xy)=f(x)\timesf(y)\)(\(\gcd(x,y)=1\)),则称\(f(n)\)是积性函数。莫比乌斯函数:\(\mu(n)=\begin{cases}1&n=1\\0&n\\text{含有平方因子}\\(-1)^k&k\text{为}\n\\text{的......
  • 学习笔记二
    一、笔记(一)I/O库函数I/O库函数是在C和C++编程中广泛使用的文件操作函数,用于进行输入和输出操作。它们是构建在系统调用之上的高级接口,提供了更方便和高效的文件操作方法。(二)I/O库函数与系统调用I/O库函数与系统调用密切相关,它们封装了底层的系统调用,提供了更高级别、更易用的......
  • Python学习笔记-Python文件操作
    文件的编码简介计算机只能识别:0和1,那么我们丰富的文本文件是如何被计算机识别,并存储在硬盘中呢?使用编码技术(密码本)将内容翻译成0和1存入。编码技术即:翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容。计算机中有许多可用编码:UTF-8GBKBig5等不同的编码,将......
  • openGauss学习笔记-69 openGauss 数据库管理-创建和管理普通表-更新表中数据
    openGauss学习笔记-69openGauss数据库管理-创建和管理普通表-更新表中数据修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行、所有行或者指定的部分行。还可以独立更新某个字段,而其他字段则不受影响。使用UPDATE命令更新现有行,需要提供以下三种信息:表的名称......