此篇文章衔接上篇文章SD_SPI驱动
因为SD卡都是需要文件系统支持才能进行读写操作,因此,需要移植FATFS文件系统
fatfs 的官方网站: http://elm-chan.org/fsw/ff/00index_e.html
我这里使用的是最新的R0.15 (November 6, 2022)版本
将fatfs文件系统源码添加到工程目录内
刷新IDE目录,查看到添加的文件内容
Documents内是说明文档和例程文件,这里需要排除构建
diskio.c文件是移植的接口文件,里面需要根据实际使用情况实现接口函数
disk_status、disk_initialize、disk_read、disk_write、disk_ioctl等函数
这些函数的具体操作需要调用SD_SPI中的相关API,所有需要添加头文件路径
再将接口函数实现即可
#include "ff.h"
#include "diskio.h"
#include "sdspi.h"
#define DEV_RAM 0
#define DEV_MMC 1
#define DEV_USB 2
SDSPI_ApiRetStatus_Type app_sdspi_ret;
SDSPI_CardHandler_Type app_sdspi_card;
extern const SDSPI_Interface_Type board_sdspi_if;
DSTATUS disk_status (
BYTE pdrv
)
{
DSTATUS stat;
switch (pdrv) {
case DEV_RAM :
stat = RES_PARERR;
return stat;
case DEV_MMC :
stat = RES_OK;
return stat;
case DEV_USB :
stat = RES_PARERR;
return stat;
}
return STA_NOINIT;
}
DSTATUS disk_initialize (
BYTE pdrv
)
{
DSTATUS stat;
switch (pdrv) {
case DEV_RAM :
stat = RES_PARERR;
return stat;
case DEV_MMC :
if(!SDSPI_Init(&app_sdspi_card, &board_sdspi_if)){
stat = RES_OK;
}else{
stat = STA_NOINIT;
}
return stat;
case DEV_USB :
stat = RES_PARERR;
return stat;
}
return STA_NOINIT;
}
DRESULT disk_read (
BYTE pdrv,
BYTE *buff,
LBA_t sector,
UINT count
)
{
DRESULT res;
switch (pdrv) {
case DEV_RAM :
res = RES_PARERR;
return res;
case DEV_MMC :
if(!SDSPI_ReadBlocks(&app_sdspi_card,buff, sector, count))
{
res = RES_OK;
}else{
res = RES_ERROR;
}
return res;
case DEV_USB :
res = RES_PARERR;
return res;
}
return RES_PARERR;
}
#if FF_FS_READONLY == 0
DRESULT disk_write (
BYTE pdrv,
const BYTE *buff,
LBA_t sector,
UINT count
)
{
DRESULT res;
switch (pdrv) {
case DEV_RAM :
res = RES_PARERR;
return res;
case DEV_MMC :
if(!SDSPI_WriteBlocks(&app_sdspi_card,(uint8_t *)buff, sector, count))
{
res = RES_OK;
}else{
res = RES_ERROR;
}
return res;
case DEV_USB :
res = RES_PARERR;
return res;
}
return RES_PARERR;
}
#endif
DRESULT disk_ioctl (
BYTE pdrv,
BYTE cmd,
void *buff
)
{
DRESULT res;
switch (pdrv) {
case DEV_RAM :
res = RES_PARERR;
return res;
case DEV_MMC :
switch(cmd)
{
case GET_SECTOR_COUNT:
*(DWORD *)buff = app_sdspi_card.blockCount;
res = RES_OK;
break;
case GET_BLOCK_SIZE:
*(DWORD *)buff = SDSPI_DEFAULT_BLOCK_SIZE;
res = RES_OK;
break;
}
return res;
case DEV_USB :
res = RES_PARERR;
return res;
}
return RES_PARERR;
}
至此,fatfs文件系统的移植就完成了。后续我们再对具体读写进行测试。
|