新聞中心

stm32 Fatfs 讀寫SD卡

作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
讀寫SD是嵌入式系統(tǒng)中一個比較基礎(chǔ)的功能,在很多應(yīng)用中都可以用得上SD卡。折騰了幾天,總算移植成功了 最新版Fatfs(Fatfs R0.09) ,成功讀寫SD卡下文件。
FatFs (http://elm-chan.org/fsw/ff/00index_e.html)是一個通用的文件系統(tǒng)模塊,用于在小型嵌入式系統(tǒng)中實(shí)現(xiàn)FAT文件系統(tǒng)。 FatFs 的編寫遵循ANSI C,因此不依賴于硬件平臺。它可以嵌入到便宜的微控制器中,如 8051, PIC, AVR, SH, Z80, H8, ARM 等等,不需要做任何修改。
1. SD卡/TF卡 硬件接口
SD卡有兩種操作接口,SDIO和SPI。 使用SDIO口的速度比較快,SPI的速度比較慢 。
SD卡引腳描述如下: SD卡SPI接法如下:
我使用的是正點(diǎn)原子的開發(fā)板,所以采用的是SPI接口的模式。
TF卡SDIO 模式和SPI模式 引腳定義:
可以發(fā)現(xiàn)Micro SD卡只有8個引腳是因?yàn)楸萐D卡少了一個Vss。使用TF轉(zhuǎn)SD的卡套套在Micro SD卡上,這樣一來大小就和SD卡一樣大,這時候卡套上的9個引腳就和SD卡一樣了,你可以完全當(dāng)做SD卡來操作。
2. SD卡底層驅(qū)動
SD卡的操作比較復(fù)雜,需要多看看一些文檔 。 這里附上SD底層驅(qū)動代碼,代碼說明詳見注釋
Sd卡SPi操作底層代碼 :sdcard.csdcard.h
3. Fatfs 移植
FatFs 軟件包中相關(guān)文件:
ffconf.h FatFs 模塊配置文件
ff.h FatFs 和應(yīng)用模塊公用的包含文件
ff.c FatFs 模塊
diskio.h FatFs and disk I/O 模塊公用的包含文件
integer.h 數(shù)據(jù)類型定義
option 可選的外部功能
diskio.c FatFs 與disk I/O 模塊接口層文件(不屬于 FatFs 需要由用戶提供)
FatFs 配置,文件系統(tǒng)的配置項(xiàng)都在 ffconf.h 文件之中:
(1) _FS_TINY :這個選項(xiàng)在R0.07 版本之中開始出現(xiàn),在之前的版本都是以獨(dú)立的文件出現(xiàn),現(xiàn)在通過一個宏來修改使用起來更方便;
(2) _FS_MINIMIZE、_FS_READONLY、_USE_STRFUNC、_USE_MKFS、_USE_FORWARD 這些宏是用來對文件系統(tǒng)進(jìn)行裁剪
(3) _CODE_PAGE :本選項(xiàng)用于設(shè)置語言碼的類型
(4) _USE_LFN :取值為0~3,主要用于長文件名的支持及緩沖區(qū)的動態(tài)分配:
0:不支持長文件名;
1:支持長文件名存儲的靜態(tài)分配,一般是存儲在BSS 段;
2:支持長文件名存儲的動態(tài)分配,存儲在棧上;
3:支持長文件名存儲的動態(tài)分配,存儲在堆上。
(5) _MAX_LFN :可存儲長文件的最大長度,其值一般為(12~255),但是緩沖區(qū)一般占(_MAX_LFN + 1) * 2 bytes;
(6) _LFN_UNICODE :為1 時才支持unicode 碼;
(7) _FS_RPATH :R0.08a 版本改動配置項(xiàng),取值范圍0~2:
0:去除相對路徑支持和函數(shù);
1:開啟相對路徑并且開啟f_chdrive()和f_chdir()兩個函數(shù);
2:在1 的基礎(chǔ)上添加f_getcwd()函數(shù)。
(8) _VOLUMES :支持的邏輯設(shè)備數(shù)目;
(9) _MAX_SS :扇區(qū)緩沖的最大值,其值一般為512;
(10) _MULTI_PARTITION:定義為1 時,支持磁盤多個分區(qū);
(11) _USE_ERASE :R0.08a 新加入的配置項(xiàng),設(shè)置為1 時,支持扇區(qū)擦除;
(12) _WORD_ACCESS :如果定義為1,則可以使用word 訪問;
(13) _FS_REENTRANT :定義為1 時,文件系統(tǒng)支持重入,但是需要加上跟操作系統(tǒng)信號量相關(guān)的幾個函數(shù),函數(shù)在syscall.c 文件中;
(14) _FS_SHARE :文件支持的共享數(shù)目。
Fatfs 開源文件系統(tǒng) 從R0.07e 之后 版本開始就不再提供底層接口文件 diskio.c 模板,這里附上根據(jù)
以上SD卡底層驅(qū)動對應(yīng)的 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,否則返回參數(shù)錯誤
069}
070if(!SD_DET())
071{
072returnRES_NOTRDY;//沒有檢測到SD卡,報(bào)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的返回值轉(zhuǎn)成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,否則返回參數(shù)錯誤
125}
126if(!SD_DET())
127{
128returnRES_NOTRDY;//沒有檢測到SD卡,報(bào)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// 返回值轉(zhuǎn)換
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 下一頁

關(guān)鍵詞: stm32Fatfs讀寫SD

評論


技術(shù)專區(qū)

關(guān)閉