美文网首页我爱编程
运动控制器31:FATFS文件系统的接口函数2-媒体接口层

运动控制器31:FATFS文件系统的接口函数2-媒体接口层

作者: 吴松乾 | 来源:发表于2018-01-31 23:56 被阅读0次

    FATFS将物理层和平台层完全分开,这样大大的方便了FATFS的使用,物理层的控制不属于FATFS,我们需要自己编写物理层的程序,而物理层和FATFS的接口函数如下所示,另外一下常用的物理层驱动,FATFS也提供了驱动,比如下面的链接提供了SD卡的驱动操作 How to Use MMC/SDC,驱动SD卡或者数码相机用的MMC卡可以参考下面的介绍。

    媒体层函数

    disk_status - Get device status

    在单个磁盘的系统中,这里返回0,我们编写的函数如下:

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

    存储器的初始化函数定义如下:

    // Inidialize a Drive
    DSTATUS disk_initialize(BYTE drv)       /* Physical drive nmuber(0..) */
    {
        DSTATUS res;
        if(drv)
            res = STA_NOINIT;
        else
            res = (SPIFLASH_disk_initialize() ? STA_NOINIT : 0);
    
        return res;
    }
    

    而SPIFLASH_disk_initialize实际上调用的是我们定义在SPI_FLASH头文件中的SPI_FLASH_SPI_Init,我们在进行格式化一个磁盘的时候,就进行了磁盘的初始化,这样应用层和物理层进行了连接。

    disk_read - Read sector(s)
    disk_write - Write sector(s)

    下面是我们的程序,对上面的两个函数进行了修改,如下:

    /* 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) */
    )
    {   
        UINT i;
        if (SPI_FLASH_ID != SPI_FLASH_Check_Is_OK())
        {
           return RES_ERROR;    //FR_DISK_ERR
        }
    
        for(i=0;i<count;i++)
        {
            SPI_FLASH_Read_Sector_512bytes(sector, buff);
            sector ++;
            buff += _MAX_SS;
        }
        
        return RES_OK;
    }
    
    /*-----------------------------------------------------------------------*/
    /* Write Sector(s)                                                       */
    
    #if _READONLY == 0
    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) */
    )
    {
        int i;
    
        if (SPI_FLASH_ID != SPI_FLASH_Check_Is_OK())
        {
           return RES_ERROR;    //FR_DISK_ERR
        }
        //写入文件就会对FLASH扇区进行擦写,有点危险,flash读写次数只有10W次
        for(i=0;i<count;i++)
        {   
            SPI_FLASH_Write_Sector_512bytes(sector, (BYTE *)buff);
            sector ++;
            buff += _MAX_SS;
        }
        
        return RES_OK;  
    }
    #endif /* _READONLY */
    
    disk_ioctl - Control device dependent functions

    这个实际上用来返回物理存储器的一些参数,比如扇区大小,512字节,扇区总数已获取存储器的总容量。

    get_fattime - Get current time

    返回系统的时间,这个时间可以自己随便定义,如下:

    DWORD date;
            date = ((2015-1980) << 25) | (4<<21) | (2<<16)|\
                (0<<11) | (1<<5) | (10);
        return date;
    

    这样,我们对物理层和FATFS系统进行了连接。
    官网还提供了各个平台的一个示范应用,需要下载可以点击此链接各平台的FATFS应用(包括STM32)
    另外,可以将上面所有应用层和物理层的函数进行打包成一个APP的接口文件,里面可以直接调用format_disk进行格式化,我们的系统中,有一个fatfs_app.h的文件,可以进行使用。

    相关文章

      网友评论

        本文标题:运动控制器31:FATFS文件系统的接口函数2-媒体接口层

        本文链接:https://www.haomeiwen.com/subject/tndrzxtx.html