《電子技術(shù)應用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應用 > 嵌入式系統(tǒng)中基于SPI協(xié)議的SD卡擴展實現(xiàn)
嵌入式系統(tǒng)中基于SPI協(xié)議的SD卡擴展實現(xiàn)
2014年微型機與應用第19期
蔡紅專1, 劉 強1, 陳 琎2
1.西京學院 研究生部,陜西 西安 710123; 2.米脂縣職業(yè)教育中心,陜西 榆林 718100
摘要: 介紹了在嵌入式系統(tǒng)中一種基于SPI協(xié)議實現(xiàn)對SD卡的擴展方法,結(jié)合FatFs文件系統(tǒng),使小型嵌入式系統(tǒng)也能容易、方便地擴展大容量存儲器。并在STM32上成功移植,打開SD卡中TXT文本,并通過串口輸出文本中的內(nèi)容。
Abstract:
Key words :

  摘 要: 介紹了在嵌入式系統(tǒng)中一種基于SPI協(xié)議實現(xiàn)對SD卡的擴展方法,結(jié)合FatFs文件系統(tǒng),使小型嵌入式系統(tǒng)也能容易、方便地擴展大容量存儲器。并在STM32上成功移植,打開SD卡中TXT文本,并通過串口輸出文本中的內(nèi)容。

  關(guān)鍵詞: 嵌入式系統(tǒng);SPI協(xié)議;SD卡;FatFs文件系統(tǒng);移植

0 引言

  近年來,在各種嵌入式系統(tǒng)設(shè)計中,對大量數(shù)據(jù)的存儲需求越來越高,例如音樂、圖片以及經(jīng)過A/D轉(zhuǎn)換后得到的大量實時數(shù)據(jù)的存儲。SD卡是一種基于 Flash 的新一代存儲器,具有體積小、容量大、數(shù)據(jù)傳輸快、移動靈活、安全性能好等優(yōu)點,是許多便攜式電子儀器理想的外部存儲介質(zhì)選擇。MCU可以通過SD模式或者SPI模式訪問SD卡,具備串行通信和隨機存取的能力,這很適合SD卡與單片機之間的互連和通信[1]。雖然只有少數(shù)高檔的單片機才提供SD卡接口,但幾乎所有單片機都支持SPI通信。本文著重介紹基于SPI協(xié)議擴展SD卡,并結(jié)合FatFs Module完成文件系統(tǒng)的設(shè)計。

  FatFs是針對小型嵌入式系統(tǒng)的一種通用的FAT文件系統(tǒng)模塊,由標準C語言編寫,并且完全與磁盤I/O層相獨立。所以,對于8051、AVR、PIC、Z80、ARM等MCU,只需要修改文件系統(tǒng)中很少的一部分,F(xiàn)atFs就可以被應用到基于這些低成本MCU的控制系統(tǒng)中。

1 MCU與SD卡接口的設(shè)計


001.jpg

  SD卡只能兼容3.3 V的I/O電平,所以要求MCU能夠支持3.3 V的I/O端口輸出,或者提供電平轉(zhuǎn)換電路,否則很容易損壞SD卡。本文提供一種5 V和3.3 V電平間的轉(zhuǎn)換電路,如圖1和圖2分別是3.3 V轉(zhuǎn)5 V電路和5 V轉(zhuǎn)3.3 V的電路。在SPI模式下,CS/MOSI/MISO/CLK都需要加10 kΩ~100 kΩ左右的上拉電阻,如圖3所示SD卡接口連接圖[2]中R0,R1,R2,R3為4個上拉電阻。

002.jpg

2 SPI協(xié)議的介紹


003.jpg

  SD卡協(xié)議包含如圖4[3]所示3個基本函數(shù)層次。其中SPI模式基礎(chǔ)層主要包括產(chǎn)生片選信號函數(shù)、SD卡在SPI模式時的初始化函數(shù)、單字節(jié)讀/寫函數(shù)、雙字節(jié)讀/寫函數(shù)等底層函數(shù)的封裝。SPI模式中間層主要包括對SD卡命令的寫函數(shù)、數(shù)據(jù)讀取函數(shù)、響應的讀寫等函數(shù)。SD卡的API層主要包括對各種類型SD卡的初始化、SD卡扇區(qū)的讀/寫函數(shù)、SD卡的信息(容量、廠家等)讀取等具有具體功能的應用函數(shù)。

3 SD卡的初始化


004.jpg

  SD卡在上電后默認工作在SD模式狀態(tài),所以要連續(xù)發(fā)送大于74個最大頻率不超過400 kHz的CLK時鐘來完成與SD卡時鐘的同步,之后開始CMD0的操作,直到CS為有效電平(低電平)SPI模式就被啟用了。接下來按照圖5所示初始化流程來完成SD卡的初始化工作。通過SD卡的初始化,可以識別出插入卡槽中SD卡的類型(MMC、V1、V2或者V2HC),然后就可以開始對SD卡進行數(shù)據(jù)讀寫操作。

4 FatFs介紹


005.jpg

  FatFs模塊的層次如圖6所示,其中應用層主要是由FatFs模塊提供給MCU的一系列具有獨立操作功能的接口函數(shù),而用戶無需了解FatFs模塊的內(nèi)部結(jié)構(gòu)和FAT文件系統(tǒng)協(xié)議,MCU只需要調(diào)用其中的API接口函數(shù)就可以完成在PC機上讀/寫文件操作。

  FatFs模塊主要實現(xiàn)FAT協(xié)議。使用時,直接將FatFs模塊提供的ff.c和ff.h文件包含到程序中,除非有必要,一般不用修改就可使用。

  最底層包括用戶移植代碼,需要根據(jù)不同MCU,編寫存儲媒介的讀/寫接口函數(shù)和供給文件創(chuàng)建修改時的實時時鐘函數(shù)。

5 程序移植

  移植 FatFs 主要分為三步:

  (1) 數(shù)據(jù)類型:在 integer.h 中定義好數(shù)據(jù)的類型。這里需要了解所使用的編譯器和MCU的數(shù)據(jù)類型,并定義好數(shù)據(jù)類型,基本上不需要修改。

  (2) 配置:打開 ffconf.h文件,根據(jù)對文件操作功能的需求,分別對宏定義設(shè)置文件系統(tǒng)的定義配置,以裁剪不必要的API操作函數(shù)。如表1配置API函數(shù)表所示,其中標有“X”的選項函數(shù)即被裁剪掉。例如,_FS_READONLY設(shè)為0時,F(xiàn)atFs為讀/寫文件系統(tǒng);設(shè)為1時,系統(tǒng)為只讀,在宏匯編中裁剪掉與寫操作相關(guān)的函數(shù)。_FS_MINIMIZE,選擇性裁剪API函數(shù)。_USE_STRFUNC,選擇性裁剪與字符操作相關(guān)的API函數(shù)。_USE_MKFS設(shè)為1時,結(jié)合_FS_READONLY為1來使能API函數(shù)f_mkfs(),在驅(qū)動器上創(chuàng)建文件系統(tǒng)。_USE_FASTSEEK,設(shè)為1,使能快速搜索特性。_USE_LABEL設(shè)為1,啟用磁盤卷標功能。_USE_FORWARD設(shè)為1時,結(jié)合_FS_TINY為1,使能f_forward()函數(shù),讀取文件數(shù)據(jù)轉(zhuǎn)移到數(shù)據(jù)流設(shè)備。_CODE_PAGE指定在目標系統(tǒng)上使用的OEM代碼頁,例如,設(shè)936為簡體中文。_FS_RPATH用于配置相對路徑的功能。

008.jpg

006.jpg

  (3) 函數(shù)編寫:打開diskio.c進行底層驅(qū)動編寫,實際上需要編寫6個接口函數(shù),如圖7中diskio結(jié)構(gòu)圖所示[4]。其中前5個接口函數(shù)與MCU底層I/O接口相關(guān),而get_fattime()與系統(tǒng)的RTC時鐘相關(guān)。

  ①DSTATUS disk_initialize(BYZE Drive):函數(shù)初始化邏輯驅(qū)動器,為對SD卡讀/寫做準備,函數(shù)成功時,其返回值的STA_NOINIT標志位被清零,Drive是指定邏輯驅(qū)動器號。應用程序在操作時不應直接調(diào)用此函數(shù),而是調(diào)用FatFs模塊中提供的API函數(shù),如f_mount。

  ②DSTATUS disk_status(BYTE Drive):返回磁盤驅(qū)動器的當前狀態(tài)。Drive是指定邏輯驅(qū)動器號,不調(diào)用此函數(shù)的情況下,函數(shù)體內(nèi)可以直接返回0。

  ③DRESULT disk_read(BYTE Drive,BYTE* Buffer,DWORD SectorNumber,BYTE SectorCount):從磁盤驅(qū)動器的扇區(qū)上讀取數(shù)據(jù)。Drive是指定邏輯驅(qū)動器號,Buffer為指向存儲讀取數(shù)據(jù)的數(shù)組的指針,SectorNumber為開始讀取的扇區(qū)號,SectorCount為需要讀取的扇區(qū)數(shù),函數(shù)成功后返回0。

  ④DRESULT disk_write(BYTE Drive,const BYTE* Buffer,DWORD SectorNumber,BYTE SectorCount):向磁盤驅(qū)動器的扇區(qū)寫入數(shù)據(jù)。Drive是指定邏輯驅(qū)動器號,Buffer為指向?qū)懭氩僮鞯臄?shù)據(jù)字節(jié)數(shù)組的指針,SectorNumber為開始寫入的扇區(qū)號,SectorCount為需要寫入的扇區(qū)數(shù),函數(shù)成功后返回0。

  ⑤DRESULT disk_ioctl(BYTE Drive,BYTE Command,void* Buffer):存儲媒介控制函數(shù)。Drive是指定邏輯驅(qū)動器號,Command是指定的命令代碼,Buffer是指向參數(shù)緩沖區(qū)的指針,函數(shù)成功后返回0。

  ⑥D(zhuǎn)WORD get_fattime(void):獲取當前時間。返回一個32位無符號整數(shù),代表的時鐘信息如表2所示[5]。在簡單使用時,可以令該函數(shù)直接返回一個固定的常數(shù)。

009.jpg

6 結(jié)束語

  本文簡述了一種免費開源的FatFs文件系統(tǒng)基于SPI模式下,使各種小型嵌入式系統(tǒng)能夠擴展、管理SD卡這種大容量存儲器,并在STM32上成功移植,效果演示圖如圖8所示,讀出SD卡中TEXT文件夾下的“l(fā)iuqiang.txt”文件里的內(nèi)容等信息,并通過串口打印出來。

007.jpg

參考文獻

  [1] 段琪煒,周洪利. 基于MMC卡的嵌入式文件系統(tǒng)的設(shè)計與實現(xiàn)[J].現(xiàn)代計算機,2006(7):94-96,109.

  [2] 李寧. ARM開發(fā)工具RealViewMDK使用入門[M].北京:北京航空航天大學出版社,2008: 266-280.

  [3] 王永虹,徐煒,郝立平. STM32系列為ARM Cortex-M3微控制器原理與實踐[M].北京:北京航空航天大學出版社,2008: 305-313.

  [4] 張洪濤,莫文承,李兵兵. 基于SPI協(xié)議的 SD卡讀寫機制與實現(xiàn)方法[J]. 電子元器件應用,2008( 3):42-43,47.

  [5] 譚浩強. C程序設(shè)計(第三版)[M].北京:清華大學出版社,2006.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲女优在线| 欧美激情第二页| 最新成人在线| 久久riav二区三区| 午夜精品久久久久久久蜜桃app | 在线一区二区三区做爰视频网站| 亚洲国产一区二区三区a毛片| 黄色成人av网站| 国产午夜精品一区二区三区视频 | 一区二区免费在线播放| 亚洲精品你懂的| 91久久久久久| 亚洲人成网站777色婷婷| 亚洲激情一区二区| 91久久精品美女| 亚洲精品视频免费观看| 亚洲精品国久久99热| 日韩一区二区高清| 一本色道久久综合狠狠躁篇怎么玩| 亚洲日本中文字幕免费在线不卡| 亚洲欧洲另类国产综合| 日韩亚洲欧美高清| 一区二区三区日韩| 亚洲视频综合在线| 亚洲男人的天堂在线aⅴ视频| 亚洲欧美综合精品久久成人| 欧美在线高清| 亚洲高清资源| 亚洲日本成人| 一区二区精品| 亚洲欧美综合| 久久超碰97人人做人人爱| 久久精视频免费在线久久完整在线看| 久久精品亚洲精品| 久久婷婷国产综合国色天香| 美女国内精品自产拍在线播放| 欧美高清影院| 国产精品久久777777毛茸茸| 国产欧美精品在线| 国产综合香蕉五月婷在线| 在线日韩av| 一本久道综合久久精品| 亚洲欧美国产视频| 亚洲国产综合在线看不卡| 一区二区三区色| 性一交一乱一区二区洋洋av| 久久午夜精品一区二区| 欧美精品在线一区二区| 国产精品高潮呻吟久久av无限| 国产亚洲精品自拍| 亚洲三级电影全部在线观看高清| 99视频一区| 欧美亚洲免费电影| 99www免费人成精品| 午夜精品美女久久久久av福利| 久久久久久久尹人综合网亚洲| 欧美黄色片免费观看| 国产精品久久久久久久电影| 狠狠综合久久av一区二区小说 | 欧美中文字幕在线播放| 久久综合五月天婷婷伊人| 欧美精品一区二区三| 国产欧美一区二区三区在线老狼| 在线观看91精品国产麻豆| 在线亚洲观看| 亚洲国产裸拍裸体视频在线观看乱了中文| 一区二区三区视频在线看| 久久精品99国产精品日本 | 日韩午夜激情电影| 久久激情网站| 亚洲一本大道在线| 欧美.www| 国产日产欧产精品推荐色| 亚洲精品一区中文| 久久不射2019中文字幕| 一区二区三区色| 久久综合久久美利坚合众国| 国产精品久久国产三级国电话系列 | 一二美女精品欧洲| 看欧美日韩国产| 国产精品一区2区| 亚洲精品免费在线观看| 欧美在线影院| 午夜在线a亚洲v天堂网2018| 欧美国产日产韩国视频| 国产一区二区三区在线观看网站| 夜夜爽www精品| 亚洲精品日韩综合观看成人91| 欧美综合国产| 欧美日在线观看| 亚洲国产美女| 久久精品视频免费| 欧美一级二区| 欧美午夜激情在线| 亚洲国产福利在线| 久久超碰97人人做人人爱| 欧美一激情一区二区三区| 欧美视频一区在线| 91久久久在线| 亚洲国产欧美在线人成| 久久久久久精| 国产美女精品免费电影| 正在播放日韩| 亚洲午夜一二三区视频| 欧美精品日韩综合在线| 亚洲国产合集| 亚洲欧洲一区二区在线播放| 久热精品视频在线| 国产亚洲欧美日韩美女| 午夜精品久久久久久| 午夜久久久久| 国产精品九九| 亚洲香蕉视频| 亚洲综合色视频| 国产精品jvid在线观看蜜臀| 99精品视频网| 亚洲午夜久久久| 欧美偷拍另类| 宅男噜噜噜66一区二区66| 中日韩视频在线观看| 欧美日韩岛国| 日韩视频免费观看| 亚洲一区二区网站| 欧美亚日韩国产aⅴ精品中极品| 亚洲精品一区久久久久久| 亚洲最新在线| 欧美日韩在线观看一区二区| 99国产精品国产精品久久| 国产精品99久久久久久久久| 欧美精品三级日韩久久| 日韩一二三区视频| 亚洲尤物在线视频观看| 国产精品看片你懂得| 亚洲免费在线| 久久九九久精品国产免费直播| 国产亚洲欧美日韩在线一区 | 中文av一区特黄| 欧美日韩亚洲综合在线| 亚洲精品一区久久久久久| 亚洲午夜精品网| 国产精品一区二区久久久| 午夜视黄欧洲亚洲| 久久久久久有精品国产| 伊人久久成人| 亚洲美女电影在线| 欧美日韩hd| 亚洲调教视频在线观看| 欧美与欧洲交xxxx免费观看| 国产一区二区久久精品| 亚洲激情自拍| 欧美日韩精品一区二区三区| 亚洲午夜激情网页| 久久精品国产精品亚洲| 亚洲国产精品成人精品| 亚洲午夜电影在线观看| 国产日韩精品视频一区二区三区| 亚洲福利视频二区| 欧美日本一区二区高清播放视频| 亚洲一区二区免费| 久久久国产精彩视频美女艺术照福利| 在线日本欧美| 亚洲欧美日韩国产| 极品中文字幕一区| 99视频精品全部免费在线| 国产精品视区| 亚洲黄色影片| 国产精品久久一卡二卡| 欧美中文日韩| 欧美日韩美女在线| 欧美一区二区视频在线观看2020| 奶水喷射视频一区| 亚洲视频日本| 免费亚洲电影在线| 亚洲午夜一级| 欧美freesex8一10精品| 亚洲手机成人高清视频| 久久亚洲精品欧美| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲美女视频在线观看| 久久久人人人| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 国产欧美一区二区精品忘忧草| 亚洲精品色婷婷福利天堂| 国产精品久久久久久久久久久久久久 | 亚洲精品国产精品乱码不99| 国产精品vvv| 亚洲国产另类精品专区| 国产精品丝袜久久久久久app| 亚洲日本va午夜在线影院| 国产精品一级久久久| 亚洲青色在线| 国产一区二区看久久| 亚洲一区一卡| 亚洲国产美女| 久久久欧美精品sm网站| 亚洲一区二区三区在线看| 欧美激情女人20p| 久久精精品视频| 国产伦精品一区二区三区高清版| 99国产精品久久久久久久|