在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            stm32 Fatfs 讀寫SD卡

            作者: 時(shí)間:2016-11-26 來(lái)源:網(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)原子的開(kāi)發(fā)板,所以采用的是SPI接口的模式。
            TF卡SDIO 模式和SPI模式 引腳定義:
            可以發(fā)現(xiàn)Micro SD卡只有8個(gè)引腳是因?yàn)楸萐D卡少了一個(gè)Vss。使用TF轉(zhuǎn)SD的卡套套在Micro SD卡上,這樣一來(lái)大小就和SD卡一樣大,這時(shí)候卡套上的9個(gè)引腳就和SD卡一樣了,你可以完全當(dāng)做SD卡來(lái)操作。
            2. SD卡底層驅(qū)動(dòng)
            SD卡的操作比較復(fù)雜,需要多看看一些文檔 。 這里附上SD底層驅(qū)動(dòng)代碼,代碼說(shuō)明詳見(jiàn)注釋
            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 版本之中開(kāi)始出現(xiàn),在之前的版本都是以獨(dú)立的文件出現(xiàn),現(xiàn)在通過(guò)一個(gè)宏來(lái)修改使用起來(lái)更方便;
            (2) _FS_MINIMIZE、_FS_READONLY、_USE_STRFUNC、_USE_MKFS、_USE_FORWARD 這些宏是用來(lái)對(duì)文件系統(tǒng)進(jìn)行裁剪
            (3) _CODE_PAGE :本選項(xiàng)用于設(shè)置語(yǔ)言碼的類型
            (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:開(kāi)啟相對(duì)路徑并且開(kāi)啟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 訪問(wèn);
            (13) _FS_REENTRANT :定義為1 時(shí),文件系統(tǒng)支持重入,但是需要加上跟操作系統(tǒng)信號(hào)量相關(guān)的幾個(gè)函數(shù),函數(shù)在syscall.c 文件中;
            (14) _FS_SHARE :文件支持的共享數(shù)目。
            Fatfs 開(kāi)源文件系統(tǒng) 從R0.07e 之后 版本開(kāi)始就不再提供底層接口文件 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;//沒(méi)有檢測(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;//沒(méi)有檢測(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)閉