新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > stm32 Fatfs 读写SD卡

stm32 Fatfs 读写SD卡

作者: 时间:2016-11-26 来源:网络 收藏
读写SD是嵌入式系统中一个比较基础的功能,在很多应用中都可以用得上SD卡。折腾了几天,总算移植成功了 最新版Fatfs(Fatfs R0.09) ,成功读写SD卡下文件。
FatFs (http://elm-chan.org/fsw/ff/00index_e.html)是一个通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统。 FatFs 的编写遵循ANSI C,因此不依赖于硬件平台。它可以嵌入到便宜的微控制器中,如 8051, PIC, AVR, SH, Z80, H8, ARM 等等,不需要做任何修改。
1. SD卡/TF卡 硬件接口
SD卡有两种操作接口,SDIO和SPI。 使用SDIO口的速度比较快,SPI的速度比较慢 。
SD卡引脚描述如下: SD卡SPI接法如下:
我使用的是正点原子的开发板,所以采用的是SPI接口的模式。
TF卡SDIO 模式和SPI模式 引脚定义:
可以发现Micro SD卡只有8个引脚是因为比SD卡少了一个Vss。使用TF转SD的卡套套在Micro SD卡上,这样一来大小就和SD卡一样大,这时候卡套上的9个引脚就和SD卡一样了,你可以完全当做SD卡来操作。
2. SD卡底层驱动
SD卡的操作比较复杂,需要多看看一些文档 。 这里附上SD底层驱动代码,代码说明详见注释
Sd卡SPi操作底层代码 :sdcard.csdcard.h
3. Fatfs 移植
FatFs 软件包中相关文件:
ffconf.h FatFs 模块配置文件
ff.h FatFs 和应用模块公用的包含文件
ff.c FatFs 模块
diskio.h FatFs and disk I/O 模块公用的包含文件
integer.h 数据类型定义
option 可选的外部功能
diskio.c FatFs 与disk I/O 模块接口层文件(不属于 FatFs 需要由用户提供)
FatFs 配置,文件系统的配置项都在 ffconf.h 文件之中:
(1) _FS_TINY :这个选项在R0.07 版本之中开始出现,在之前的版本都是以独立的文件出现,现在通过一个宏来修改使用起来更方便;
(2) _FS_MINIMIZE、_FS_READONLY、_USE_STRFUNC、_USE_MKFS、_USE_FORWARD 这些宏是用来对文件系统进行裁剪
(3) _CODE_PAGE :本选项用于设置语言码的类型
(4) _USE_LFN :取值为0~3,主要用于长文件名的支持及缓冲区的动态分配:
0:不支持长文件名;
1:支持长文件名存储的静态分配,一般是存储在BSS 段;
2:支持长文件名存储的动态分配,存储在栈上;
3:支持长文件名存储的动态分配,存储在堆上。
(5) _MAX_LFN :可存储长文件的最大长度,其值一般为(12~255),但是缓冲区一般占(_MAX_LFN + 1) * 2 bytes;
(6) _LFN_UNICODE :为1 时才支持unicode 码;
(7) _FS_RPATH :R0.08a 版本改动配置项,取值范围0~2:
0:去除相对路径支持和函数;
1:开启相对路径并且开启f_chdrive()和f_chdir()两个函数;
2:在1 的基础上添加f_getcwd()函数。
(8) _VOLUMES :支持的逻辑设备数目;
(9) _MAX_SS :扇区缓冲的最大值,其值一般为512;
(10) _MULTI_PARTITION:定义为1 时,支持磁盘多个分区;
(11) _USE_ERASE :R0.08a 新加入的配置项,设置为1 时,支持扇区擦除;
(12) _WORD_ACCESS :如果定义为1,则可以使用word 访问;
(13) _FS_REENTRANT :定义为1 时,文件系统支持重入,但是需要加上跟操作系统信号量相关的几个函数,函数在syscall.c 文件中;
(14) _FS_SHARE :文件支持的共享数目。
Fatfs 开源文件系统 从R0.07e 之后 版本开始就不再提供底层接口文件 diskio.c 模板,这里附上根据
以上SD卡底层驱动对应的 diskio.c 源码:
001#include "common.h"
002/*-----------------------------------------------------------------------*/
003/* Inidialize a Drive */
004
005DSTATUS disk_initialize (
006BYTEdrv/* Physical drive nmuber (0..) */
007)
008{
009u8 state;
010
011if(drv)
012{
013returnSTA_NOINIT;//仅支持磁盘0的操作
014}
015
016state = SD_Init();
017if(state == STA_NODISK)
018{
019returnSTA_NODISK;
020}
021elseif(state != 0)
022{
023returnSTA_NOINIT;//其他错误:初始化失败
024}
025else
026{
027return0;//初始化成功
028}
029}
030
031
032
033/*-----------------------------------------------------------------------*/
034/* Return Disk Status */
035
036DSTATUS disk_status (
037BYTEdrv/* Physical drive nmuber (0..) */
038)
039{
040if(drv)
041{
042returnSTA_NOINIT;//仅支持磁盘0操作
043}
044
045//检查SD卡是否插入
046if(!SD_DET())
047{
048returnSTA_NODISK;
049}
050return0;
051}
052
053
054
055/*-----------------------------------------------------------------------*/
056/* Read Sector(s) */
057
058DRESULT disk_read (
059BYTEdrv,/* Physical drive nmuber (0..) */
060BYTE*buff,/* Data buffer to store read data */
061DWORDsector,/* Sector address (LBA) */
062BYTEcount/* Number of sectors to read (1..255) */
063)
064{
065u8 res=0;
066if(drv || !count)
067{
068returnRES_PARERR;//仅支持单磁盘操作,count不能等于0,否则返回参数错误
069}
070if(!SD_DET())
071{
072returnRES_NOTRDY;//没有检测到SD卡,报NOT READY错误
073}
074
075
076
077if(count==1)//1个sector的读操作
078{
079res = SD_ReadSingleBlock(sector, buff);
080}
081else//多个sector的读操作
082{
083res = SD_ReadMultiBlock(sector, buff, count);
084}
085/*
086do
087{
088if(SD_ReadSingleBlock(sector, buff)!=0)
089{
090res = 1;
091break;
092}
093buff+=512;
094}while(--count);
095*/
096//处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值
097if(res == 0x00)
098{
099returnRES_OK;
100}
101else
102{
103returnRES_ERROR;
104}
105}
106
107
108
109/*-----------------------------------------------------------------------*/
110/* Write Sector(s) */
111
112#if _READONLY == 0
113DRESULT disk_write (
114BYTEdrv,/* Physical drive nmuber (0..) */
115constBYTE*buff,/* Data to be written */
116DWORDsector,/* Sector address (LBA) */
117BYTEcount/* Number of sectors to write (1..255) */
118)
119{
120u8 res;
121
122if(drv || !count)
123{
124returnRES_PARERR;//仅支持单磁盘操作,count不能等于0,否则返回参数错误
125}
126if(!SD_DET())
127{
128returnRES_NOTRDY;//没有检测到SD卡,报NOT READY错误
129}
130
131// 读写操作
132if(count == 1)
133{
134res = SD_WriteSingleBlock(sector, buff);
135}
136else
137{
138res = SD_WriteMultiBlock(sector, buff, count);
139}
140// 返回值转换
141if(res == 0)
142{
143returnRES_OK;
144}
145else
146{
147returnRES_ERROR;
148}
149}
150#endif /* _READONLY */
151
152
153
154/*-----------------------------------------------------------------------*/
155/* Miscellaneous Functions */
156
157DRESULT disk_ioctl (
158BYTEdrv,/* Physical drive nmuber (0..) */
159BYTEctrl,/* Control code */
160void*buff/* Buffer to send/receive control data */
161)
162{
163DRESULT res;
164

上一页 1 2 下一页

关键词: stm32Fatfs读写SD

评论


技术专区

关闭