CH32V307移植FATFS文件系统 - RISC-V MCU技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

郭祥峰 关注 私信
[文章]

CH32V307移植FATFS文件系统

此篇文章衔接上篇文章SD_SPI驱动
因为SD卡都是需要文件系统支持才能进行读写操作,因此,需要移植FATFS文件系统

fatfs 的官方网站: http://elm-chan.org/fsw/ff/00index_e.html

我这里使用的是最新的R0.15 (November 6, 2022)版本

将fatfs文件系统源码添加到工程目录内

Snipaste_2023-06-14_22-32-47.png

刷新IDE目录,查看到添加的文件内容

Snipaste_2023-06-14_22-34-13.png

Documents内是说明文档和例程文件,这里需要排除构建

image.png

diskio.c文件是移植的接口文件,里面需要根据实际使用情况实现接口函数

disk_status、disk_initialize、disk_read、disk_write、disk_ioctl等函数

这些函数的具体操作需要调用SD_SPI中的相关API,所有需要添加头文件路径

image.png

image.png

image.png

再将接口函数实现即可

/*-----------------------------------------------------------------------*/
/* Low level disk I/O module SKELETON for FatFs     (C)ChaN, 2019        */
/*-----------------------------------------------------------------------*/
/* If a working storage control module is available, it should be        */
/* attached to the FatFs via a glue function rather than modifying it.   */
/* This is an example of glue functions to attach various exsisting      */
/* storage control modules to the FatFs module with a defined API.       */
/*-----------------------------------------------------------------------*/

#include "ff.h"			/* Obtains integer types */
#include "diskio.h"		/* Declarations of disk functions */
#include "sdspi.h"

/* Definitions of physical drive number for each drive */
#define DEV_RAM		0	/* Example: Map Ramdisk to physical drive 0 */
#define DEV_MMC		1	/* Example: Map MMC/SD card to physical drive 1 */
#define DEV_USB		2	/* Example: Map USB MSD to physical drive 2 */

SDSPI_ApiRetStatus_Type app_sdspi_ret;
SDSPI_CardHandler_Type app_sdspi_card;
extern const SDSPI_Interface_Type board_sdspi_if;

/*-----------------------------------------------------------------------*/
/* Get Drive Status                                                      */
/*-----------------------------------------------------------------------*/

DSTATUS disk_status (
	BYTE pdrv		/* Physical drive nmuber to identify the drive */
)
{
	DSTATUS stat;
//	int result;

	switch (pdrv) {
	case DEV_RAM :
		//result = RAM_disk_status();
	    stat = RES_PARERR;
		// translate the reslut code here

		return stat;

	case DEV_MMC :
		//result = MMC_disk_status();
		stat = RES_OK;
		// translate the reslut code here

		return stat;

	case DEV_USB :
		//result = USB_disk_status();
	    stat = RES_PARERR;
		// translate the reslut code here

		return stat;
	}
	
	return STA_NOINIT;
}



/*-----------------------------------------------------------------------*/
/* Inidialize a Drive                                                    */
/*-----------------------------------------------------------------------*/

DSTATUS disk_initialize (
	BYTE pdrv				/* Physical drive nmuber to identify the drive */
)
{
	DSTATUS stat;
	//int result;

	switch (pdrv) {
	case DEV_RAM :
		//result = RAM_disk_initialize();
	    stat = RES_PARERR;
		// translate the reslut code here

		return stat;

	case DEV_MMC :
		//result = MMC_disk_initialize();

		if(!SDSPI_Init(&app_sdspi_card, &board_sdspi_if)){
			stat = RES_OK;
		}else{
			stat = STA_NOINIT;
		}
		// translate the reslut code here

		return stat;

	case DEV_USB :
		//result = USB_disk_initialize();
	    stat = RES_PARERR;
		// translate the reslut code here

		return stat;
	}
	return STA_NOINIT;
}



/*-----------------------------------------------------------------------*/
/* Read Sector(s)                                                        */
/*-----------------------------------------------------------------------*/

DRESULT disk_read (
	BYTE pdrv,		/* Physical drive nmuber to identify the drive */
	BYTE *buff,		/* Data buffer to store read data */
	LBA_t sector,	/* Start sector in LBA */
	UINT count		/* Number of sectors to read */
)
{
	DRESULT res;
	//int result;
//	uint8_t i;

	switch (pdrv) {
	case DEV_RAM :
		// translate the arguments here

		//result = RAM_disk_read(buff, sector, count);
	    res = RES_PARERR;
		// translate the reslut code here

		return res;

	case DEV_MMC :
		// translate the arguments here
			if(!SDSPI_ReadBlocks(&app_sdspi_card,buff, sector, count))
			{
				res = RES_OK;
			}else{
				res = RES_ERROR;
			}
		//result = MMC_disk_read(buff, sector, count);
		

		// translate the reslut code here

		return res;

	case DEV_USB :
		// translate the arguments here

		//result = USB_disk_read(buff, sector, count);
	    res = RES_PARERR;
		// translate the reslut code here

		return res;
	}

	return RES_PARERR;
}



/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */
/*-----------------------------------------------------------------------*/

#if FF_FS_READONLY == 0

DRESULT disk_write (
	BYTE pdrv,			/* Physical drive nmuber to identify the drive */
	const BYTE *buff,	/* Data to be written */
	LBA_t sector,		/* Start sector in LBA */
	UINT count			/* Number of sectors to write */
)
{
	DRESULT res;
	//int result;

	switch (pdrv) {
	case DEV_RAM :
		// translate the arguments here

		//result = RAM_disk_write(buff, sector, count);
	    res = RES_PARERR;
		// translate the reslut code here

		return res;

	case DEV_MMC :
		// translate the arguments here

		//result = MMC_disk_write(buff, sector, count);
		if(!SDSPI_WriteBlocks(&app_sdspi_card,(uint8_t *)buff, sector, count))
		{
			res = RES_OK;
		}else{
			res = RES_ERROR;
		}

		// translate the reslut code here

		return res;

	case DEV_USB :
		// translate the arguments here

		//result = USB_disk_write(buff, sector, count);
	    res = RES_PARERR;
		// translate the reslut code here

		return res;
	}

	return RES_PARERR;
}

#endif


/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions                                               */
/*-----------------------------------------------------------------------*/

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 DEV_RAM :

		// Process of the command for the RAM drive
	    res = RES_PARERR;
		return res;

	case DEV_MMC :

		// Process of the command for the MMC/SD card
		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 :

		// Process of the command the USB drive
	    res = RES_PARERR;
		return res;
	}

	return RES_PARERR;
}


image.png

至此,fatfs文件系统的移植就完成了。后续我们再对具体读写进行测试。

更多回帖

×
发帖