微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32 Fatfs 读写SD卡

stm32 Fatfs 读写SD卡

时间:11-26 来源:互联网 点击:

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

165

166if(drv)

167{

168returnRES_PARERR;//仅支持单磁盘操作,否则返回参数错误

169}

170

171//FATFS目前版本仅需处理CTRL_SYNC,GET_SECTOR_COUNT,GET_BLOCK_SIZ三个命令

172switch(ctrl)

173{

174caseCTRL_SYNC:

175SD_CS_ENABLE();

176if(SD_WaitReady()==0)

177{

178res = RES_OK;

179}

180else

181{

182res = RES_ERROR;

183}

184SD_CS_DISABLE();

185break;

186

187caseGET_BLOCK_SIZE:

188*(WORD*)buff = 512;

189res = RES_OK;

190break;

191

192caseGET_SECTOR_COUNT:

193*(DWORD*)buff = SD_GetCapacity();

194res = RES_OK;

195break;

196default:

197res = RES_PARERR;

198break;

199}

200

201returnres;

202}

203

204/*-----------------------------------------------------------------------*/

205/* User defined function to give a current time to fatfs module */

206/* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */

207/* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */

208DWORDget_fattime (void)

209{

210return0;

211}

这里的结构函数为Fatfs提供和SD卡的通信接口。 在 最新版本的Fatfs中还加入了对中文文件名的支持,需要修改 ffconf.h

#define _CODE_PAGE 936 //- Simplified Chinese GBK (DBCS, OEM, Windows)

同时应该添加 option/cc936.c文件。但是这个文件有700多K占相当大的ROM, 像stm32F103RBT6这种小FLASH的MCU根本不行 ,加入当前工程文件中代码将增加160KB 左右。

配置好Stm32的串口和SPI等IO口设置后,就可以使用Fatfs做一些文件操作了。

4. Fatfs 文件操作

文件分配表FAT(File AllocationTable)用来记录文件所在位置的表格.它对于硬盘的使用是非常重要的,假若丢失文件分配表,那么硬盘上的数据就会因无法定位而不能使用了。

Fatfs 文件系统减轻了操作SD卡的工作量,调用其提供的函数就可以方便的操作文件,读写删改等。

这里提供一个main.c 示例:

001#include "common.h"

002#include

003

004FRESULT scan_files (char* path);

005

006#define F_PUTS 1 //测试向文件写入字符串

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top