[RISC-V MCU 应用开发]

【RISC-V MCU CH32V103测评】10:FATFS移植Demo

[复制链接]
2941|28
手机看帖
扫描二维码
随时随地手机跟帖
740071911|  楼主 | 2020-12-2 09:21 | 显示全部楼层 |阅读模式
本帖最后由 740071911 于 2022-1-7 09:12 编辑

对FatFS移植,主要是将diskio.c接口和ffconf.h的配置
先来看看效果:

因为目录比较多,分两张截图

1.PNG

这里是目录的下半截图

2.PNG

接口文件diskio.c的移植


/* Includes ------------------------------------------------------------------*/
#include "diskio.h"
#include "ffconf.h"
#include "spi_sd.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define BLOCK_SIZE 512 /* Block Size in Bytes */

/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Initializes a Disk
  * @param  pdrv: Physical drive number
  * @retval DSTATUS: Operation status
  */
DSTATUS disk_initialize(BYTE pdrv)
{
    SD_Error res = SD_RESPONSE_FAILURE;
    res =  SD_Init();
    return ((DSTATUS)res);
}

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url]  Gets Disk Status
  * @param  pdrv: Physical drive number
  * @retval DSTATUS: Operation status
  */
DSTATUS disk_status (BYTE pdrv)
{
    if (pdrv) return STA_NOINIT; /* Supports only single drive */
    return 0;
}

/**
  * @brief  Reads Sector
  * @param  pdrv: Physical drive number
  * @param  *buff: Data buffer to store read data
  * @param  sector: Sector address (LBA)
  * @param  count: Number of sectors to read
  * @retval DRESULT: Operation result
  */
DRESULT disk_read (BYTE pdrv, BYTE*buff, DWORD sector, UINT count)
{
    SD_ReadBlock(buff, sector << 9, BLOCK_SIZE);
    return RES_OK;
}

/**
  * @brief  Writes Sector
  * @param  pdrv: Physical drive number
  * @param  *buff: Data to be written
  * @param  sector: Sector address (LBA)
  * @param  count: Number of sectors to write
  * @retval DRESULT: Operation result
  * [url=home.php?mod=space&uid=536309]@NOTE[/url]   The FatFs module will issue multiple sector transfer request
  *         (count > 1) to the disk I/O layer. The disk function should process
  *         the multiple sector transfer properly Do. not translate it into
  *         multiple single sector transfers to the media, or the data read/write
  *         performance may be drasticaly decreased.
  */
#if _USE_WRITE == 1
DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count)
{
    SD_WriteBlock((BYTE *)buff, sector << 9, BLOCK_SIZE);
   
    return RES_OK;
}
#endif /* _USE_WRITE == 1 */

/**
  * @brief  Get current time
  * @param  none
  * @retval DWORD: Current time
  */
DWORD get_fattime ()
{
  return   ((2006UL-1980) << 25) /* Year = 2006 */
          | (2UL << 21)          /* Month = Feb */
          | (9UL << 16)          /* Day = 9 */
          | (22U << 11)          /* Hour = 22 */
          | (30U << 5)           /* Min = 30 */
          | (0U >> 1)            /* Sec = 0 */
              ;
}

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

/**
  * @brief  I/O control operation
  * @param  pdrv: Physical drive number
  * @param  cmd: Control code
  * @param  *buff: Buffer to send/receive control data
  * @retval DRESULT: Operation result
  */
#if _USE_IOCTL != 0
DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff)
{
    DRESULT res = RES_OK;
    switch (cmd)
    {
        /* Get number of sectors on the disk (DWORD) */
        case GET_SECTOR_COUNT :
        *(DWORD*)buff = 131072; /* 4*1024*32 = 131072 */
        res = RES_OK;
        break;
        
        /* Get R/W sector size (WORD) */
        case GET_SECTOR_SIZE :
        *(WORD*)buff = BLOCK_SIZE;
        res = RES_OK;
        break;
        
        /* Get erase block size in unit of sector (DWORD) */
        case GET_BLOCK_SIZE :
        *(DWORD*)buff = 32;
        res = RES_OK;
    }
    return res;
}
#endif /* _USE_IOCTL == 1 */



main.c主函数的实现:

3.PNG

同样,最后附上demo

SD_FATFS_R0.10.rar (714.47 KB)

使用特权

评论回复

相关帖子

jinglixixi| | 2020-12-2 21:15 | 显示全部楼层
本帖最后由 jinglixixi 于 2020-12-2 21:24 编辑

感谢分享!这是我在相同测试环境下,最成功的代码。
ok.jpg

使用特权

评论回复
740071911|  楼主 | 2020-12-3 08:49 | 显示全部楼层
jinglixixi 发表于 2020-12-2 21:15
感谢分享!这是我在相同测试环境下,最成功的代码。

你有空试试长文件名,我还没弄

使用特权

评论回复
zhengfish| | 2020-12-3 09:12 | 显示全部楼层
看看...

使用特权

评论回复
jinglixixi| | 2020-12-3 09:36 | 显示全部楼层
740071911 发表于 2020-12-3 08:49
你有空试试长文件名,我还没弄

你看看下面这个是否能借用一下来辅助解决,此外使用长文件的特殊点是啥。
https://bbs.21ic.com/icview-3049580-1-1.html

使用特权

评论回复
740071911|  楼主 | 2020-12-3 16:36 | 显示全部楼层
jinglixixi 发表于 2020-12-3 09:36
你看看下面这个是否能借用一下来辅助解决,此外使用长文件的特殊点是啥。
https://bbs.21ic.com/icview-3 ...

就是显示不全 捕获.PNG

使用特权

评论回复
评论
740071911 2020-12-3 16:37 回复TA
有个波浪线看到吗 
jinglixixi| | 2020-12-3 19:04 | 显示全部楼层
本帖最后由 jinglixixi 于 2020-12-3 19:05 编辑

这个问题可以这样看,在显示不全的时候与显示全的时候,文件名都占8个字符,也就是说在读取文件名时是应该是正确的,只是在显示时做了压缩处理,以~代替了因8个字符限制的而无法显示的内容。换句话说,就是你为显示文件名的变量扩展了宽度或是动态的长度结构就可达到目的。 l.jpg

使用特权

评论回复
评论
740071911 2020-12-3 19:51 回复TA
没有全读出来了 
740071911|  楼主 | 2020-12-3 19:50 | 显示全部楼层
jinglixixi 发表于 2020-12-3 19:04
这个问题可以这样看,在显示不全的时候与显示全的时候,文件名都占8个字符,也就是说在读取文件名时是应该 ...

捕获.PNG

英文长文件名是支持的,只是不支持中文的长文件名

使用特权

评论回复
jinglixixi| | 2020-12-3 22:25 | 显示全部楼层
740071911 发表于 2020-12-3 19:50
英文长文件名是支持的,只是不支持中文的长文件名

那你能把中文的长文件名的编码存起来吗,看看原因所在。看中文文件名是能显示汉字,且只有8个字符长度,而英文却超过8个字符长度,证明两者分配的存储宽度不一样。

使用特权

评论回复
740071911|  楼主 | 2020-12-4 08:53 | 显示全部楼层
jinglixixi 发表于 2020-12-3 22:25
那你能把中文的长文件名的编码存起来吗,看看原因所在。看中文文件名是能显示汉字,且只有8个字符长度, ...

编码那就要100多K的数组,flash总共才64K

使用特权

评论回复
jinglixixi| | 2020-12-4 10:12 | 显示全部楼层
740071911 发表于 2020-12-4 08:53
编码那就要100多K的数组,flash总共才64K

可以做个小实验,假设只有一个文件,且是长中文文件名,然后提取其文件名的内容,这样不是能把容量压下来吗,再适当将文件名的存放空间与长中文文件名的程度匹配来显示文件看是否有效。

使用特权

评论回复
740071911|  楼主 | 2020-12-4 11:44 | 显示全部楼层
jinglixixi 发表于 2020-12-4 10:12
可以做个小实验,假设只有一个文件,且是长中文文件名,然后提取其文件名的内容,这样不是能把容量压下来 ...

恩可以试试

使用特权

评论回复
caizhiwei| | 2020-12-5 21:10 | 显示全部楼层
赞一个,今天找了一张128MB的 tf卡,来做实验的

使用特权

评论回复
发呆二极管| | 2021-12-24 23:45 | 显示全部楼层
学习一下~

使用特权

评论回复
hcn001| | 2021-12-29 11:02 | 显示全部楼层
666666666666

使用特权

评论回复
kkxxzz| | 2021-12-29 18:48 | 显示全部楼层
okokok!!!!!!!!!!!!

使用特权

评论回复
kkzz| | 2022-1-2 11:12 | 显示全部楼层
查看一下资料。      

使用特权

评论回复
hudi008| | 2022-1-2 11:12 | 显示全部楼层
fat32和fatfs有什么区别?

使用特权

评论回复
lzmm| | 2022-1-2 11:12 | 显示全部楼层
可以使用CSV格式吗   

使用特权

评论回复
minzisc| | 2022-1-2 11:13 | 显示全部楼层
这个支持多大的内存卡   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:想低声说句不在乎,可会飞的心总是在高处!

47

主题

840

帖子

5

粉丝