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的文件,可以进行使用。
网友评论