<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          stm32 Fatfs 讀寫SD卡

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

          上一頁(yè) 1 2 下一頁(yè)

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

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();