stm32 Fatfs 讀寫SD卡
讀寫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 |
005 | DSTATUS disk_initialize ( |
006 | BYTEdrv/* Physical drive nmuber (0..) */ |
007 | ) |
008 | { |
009 | u8 state; |
010 |
011 | if(drv) |
012 | { |
013 | returnSTA_NOINIT;//僅支持磁盤0的操作 |
014 | } |
015 |
016 | state = SD_Init(); |
017 | if(state == STA_NODISK) |
018 | { |
019 | returnSTA_NODISK; |
020 | } |
021 | elseif(state != 0) |
022 | { |
023 | returnSTA_NOINIT;//其他錯誤:初始化失敗 |
024 | } |
025 | else |
026 | { |
027 | return0;//初始化成功 |
028 | } |
029 | } |
030 |
031 |
032 |
033 | /*-----------------------------------------------------------------------*/ |
034 | /* Return Disk Status */ |
035 |
036 | DSTATUS disk_status ( |
037 | BYTEdrv/* Physical drive nmuber (0..) */ |
038 | ) |
039 | { |
040 | if(drv) |
041 | { |
042 | returnSTA_NOINIT;//僅支持磁盤0操作 |
043 | } |
044 |
045 | //檢查SD卡是否插入 |
046 | if(!SD_DET()) |
047 | { |
048 | returnSTA_NODISK; |
049 | } |
050 | return0; |
051 | } |
052 |
053 |
054 |
055 | /*-----------------------------------------------------------------------*/ |
056 | /* Read Sector(s) */ |
057 |
058 | DRESULT disk_read ( |
059 | BYTEdrv,/* Physical drive nmuber (0..) */ |
060 | BYTE*buff,/* Data buffer to store read data */ |
061 | DWORDsector,/* Sector address (LBA) */ |
062 | BYTEcount/* Number of sectors to read (1..255) */ |
063 | ) |
064 | { |
065 | u8 res=0; |
066 | if(drv || !count) |
067 | { |
068 | returnRES_PARERR;//僅支持單磁盤操作,count不能等于0,否則返回參數(shù)錯誤 |
069 | } |
070 | if(!SD_DET()) |
071 | { |
072 | returnRES_NOTRDY;//沒有檢測到SD卡,報(bào)NOT READY錯誤 |
073 | } |
074 |
075 |
076 |
077 | if(count==1)//1個sector的讀操作 |
078 | { |
079 | res = SD_ReadSingleBlock(sector, buff); |
080 | } |
081 | else//多個sector的讀操作 |
082 | { |
083 | res = SD_ReadMultiBlock(sector, buff, count); |
084 | } |
085 | /* |
086 | do |
087 | { |
088 | if(SD_ReadSingleBlock(sector, buff)!=0) |
089 | { |
090 | res = 1; |
091 | break; |
092 | } |
093 | buff+=512; |
094 | }while(--count); |
095 | */ |
096 | //處理返回值,將SPI_SD_driver.c的返回值轉(zhuǎn)成ff.c的返回值 |
097 | if(res == 0x00) |
098 | { |
099 | returnRES_OK; |
100 | } |
101 | else |
102 | { |
103 | returnRES_ERROR; |
104 | } |
105 | } |
106 |
107 |
108 |
109 | /*-----------------------------------------------------------------------*/ |
110 | /* Write Sector(s) */ |
111 |
112 | #if _READONLY == 0 |
113 | DRESULT disk_write ( |
114 | BYTEdrv,/* Physical drive nmuber (0..) */ |
115 | constBYTE*buff,/* Data to be written */ |
116 | DWORDsector,/* Sector address (LBA) */ |
117 | BYTEcount/* Number of sectors to write (1..255) */ |
118 | ) |
119 | { |
120 | u8 res; |
121 |
122 | if(drv || !count) |
123 | { |
124 | returnRES_PARERR;//僅支持單磁盤操作,count不能等于0,否則返回參數(shù)錯誤 |
125 | } |
126 | if(!SD_DET()) |
127 | { |
128 | returnRES_NOTRDY;//沒有檢測到SD卡,報(bào)NOT READY錯誤 |
129 | } |
130 |
131 | // 讀寫操作 |
132 | if(count == 1) |
133 | { |
134 | res = SD_WriteSingleBlock(sector, buff); |
135 | } |
136 | else |
137 | { |
138 | res = SD_WriteMultiBlock(sector, buff, count); |
139 | } |
140 | // 返回值轉(zhuǎn)換 |
141 | if(res == 0) |
142 | { |
143 | returnRES_OK; |
144 | } |
145 | else |
146 | { |
147 | returnRES_ERROR; |
148 | } |
149 | } |
150 | #endif /* _READONLY */ |
151 |
152 |
153 |
154 | /*-----------------------------------------------------------------------*/ |
155 | /* Miscellaneous Functions */ |
156 |
157 | DRESULT disk_ioctl ( |
158 | BYTEdrv,/* Physical drive nmuber (0..) */ |
159 | BYTEctrl,/* Control code */ |
160 | void*buff/* Buffer to send/receive control data */ |
161 | ) |
162 | { |
163 | DRESULT res; |
關(guān)鍵詞:
stm32Fatfs讀寫SD
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號放大器
評論