MicroSD卡(TF卡)spi模式實(shí)現(xiàn)方法_第1頁
MicroSD卡(TF卡)spi模式實(shí)現(xiàn)方法_第2頁
MicroSD卡(TF卡)spi模式實(shí)現(xiàn)方法_第3頁
MicroSD卡(TF卡)spi模式實(shí)現(xiàn)方法_第4頁
MicroSD卡(TF卡)spi模式實(shí)現(xiàn)方法_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

MicroSD卡(TF卡)spi模式實(shí)現(xiàn)方法

現(xiàn)在我們手機(jī)的內(nèi)存卡多為MicroSD卡,又叫TF卡,所以MicroSD卡比SD卡常見。自己曾經(jīng)也想寫寫SD卡的讀取程序,但又不想特地再去買個(gè)SD卡,這時(shí)想起手機(jī)內(nèi)存卡不是和SD卡很像嗎?在網(wǎng)上查了以后發(fā)現(xiàn)SD卡和MicroSD卡其實(shí)也就大小和引腳不一樣,它們的操作其實(shí)是一樣的,所以網(wǎng)上的SD卡讀寫代碼其實(shí)可以直接拿來用。關(guān)于SD卡和MicroSD卡的引腳定義和不同可見下兩表:

我們可以發(fā)現(xiàn)MicroSD卡只有8個(gè)引腳是因?yàn)楸萐D卡少了一個(gè)Vss。當(dāng)然你也可以買個(gè)卡套套在MicroSD卡上,這樣一來大小就和SD卡一樣大,這時(shí)候卡套上的9個(gè)引腳就和SD卡一樣了,你可以完全當(dāng)做SD卡來操作。

spi下電路的連接非常簡(jiǎn)單,接上電源線Vdd和地線Vss,再接上spi的CS,SCLK,DI(MOSI)和DO(MISO)就可以了,其他引腳可以放空。注意SD卡的電源和操作電壓都為2.7-3.6V,5V的單片機(jī)要進(jìn)行電平轉(zhuǎn)換或串電阻限流。還有記得SD卡的CS,SCLKh和DI要用10~100K的電阻上拉。我是套了卡套接的電路,因?yàn)镸icroSD卡的引腳太密了,不好焊接,SD卡相對(duì)引腳好焊。因?yàn)闆]有卡座,而且也沒專門的PCB我就直接焊到卡套上,誒犧牲了一個(gè)卡套。下面是我自己畫的電路圖:

上面MicroSD卡的硬件電路就好了,下面我們講講MicroSD卡的軟件驅(qū)動(dòng)和指令集。SD卡的命令格式如下,6字節(jié)共48位,傳輸時(shí)最高位(MSB)先傳輸:

SD卡的command(命令)占6bit,一般叫CMDx或ACMDx,比如CMD1就是1,CMD13就是13,ACMD41就是41,依此類推。CommandArgument(命令參數(shù))占4byte,并不是所有命令都有參數(shù),沒有參數(shù)的話該位一般就用置0。最后一個(gè)字節(jié)由7bitCRC校驗(yàn)位和1bit停止位組成。在SPI模式下,CRC是被忽略的,可以都置1或置0.但是發(fā)送CMD0時(shí)要記得加上CRC,即最后1字節(jié)為0x95(因?yàn)榘l(fā)送CMD0時(shí)還未進(jìn)入SPI模式,PS:CMD8也要,但一般大家都把發(fā)送CMD8省略了)。

每次發(fā)送完一次命令后,SD卡都會(huì)有回應(yīng)。SD卡的回應(yīng)有多種格式,1字節(jié)的R1,2字節(jié)的R2等,不過一般在SPI模式中我們只用到R1,下面介紹R1的格式:

關(guān)于SD卡SPI和command的發(fā)送要注意以下幾點(diǎn):

1.SD卡的SPI總線,在讀入數(shù)據(jù)時(shí)SD卡的SPI是CLK的上升沿輸入鎖存,輸出數(shù)據(jù)也是在上升沿。

2.向SD卡寫入一個(gè)CMD或者ACMD指令的過程是這樣的:首先使CS為低電平,SD卡使能;其次在SD卡的Din寫入指令;寫入指令后還要附加8個(gè)填充時(shí)鐘,是SD卡完成內(nèi)部操作;之后在SD卡的Dout上接受回應(yīng);回應(yīng)接受完畢使CS為低電平,再附加8個(gè)填充時(shí)鐘。

3.在SD卡的Din沒有數(shù)據(jù)寫入時(shí),應(yīng)使Din保持高電平。關(guān)于這一點(diǎn)我可吃透了苦頭,本來也記得要保持高電平的,結(jié)果不知怎的鬼使神差的置0拉低了。結(jié)果程序出現(xiàn)了各種奇怪的貌似偶然的錯(cuò)誤,比如連續(xù)兩次復(fù)位會(huì)有一次失敗,單步調(diào)試成功全速運(yùn)行又會(huì)失敗。總之在這個(gè)過程中我對(duì)時(shí)序進(jìn)行各種改變,每次解決一個(gè)問題后又會(huì)有新的問題出現(xiàn),多少次動(dòng)搖了我對(duì)MicroSD卡和SD卡的操作是一樣的這個(gè)看法。因?yàn)檫@個(gè)低級(jí)的錯(cuò)誤耽誤了我三四天,看來細(xì)心很重要?。∥乙呀?jīng)不止一次因?yàn)椴患?xì)心浪費(fèi)大量時(shí)間了,希望大家也引以為戒。好了,現(xiàn)在SD卡的命令和回應(yīng)清楚了,我們下面講講SD卡的復(fù)位,初始化和讀寫方法。復(fù)位方法:1.拉高CS,發(fā)送至少74個(gè)clk周期來使SD卡達(dá)到正常工作電壓和進(jìn)行同步2.選低CS,發(fā)送CMD0,需要收到回應(yīng)0x01表示成功進(jìn)入idle狀態(tài)3.拉高CS,發(fā)送8個(gè)時(shí)鐘復(fù)位時(shí)序圖:

初始化:

復(fù)位成功后,SD卡就進(jìn)入了SPI模式,接著應(yīng)該進(jìn)行初始化。初始化說白了有兩種方法:(1)發(fā)送CMD1,(2)發(fā)送CMD55+ACMD41。我從網(wǎng)上查的資料可以看到這種說法:如果是MMC卡就發(fā)CMD1,SD卡則發(fā)CMD55+ACMD41。但是關(guān)于MicroSD卡要發(fā)哪種卻講的不太清楚,網(wǎng)上用這兩種方法都有人成功過,但有的都成功不了。我自己也碰到了這種問題,剛開始拿了自己手機(jī)上的寫著Nokia的2GB的MicroSD卡(應(yīng)該是雜牌的)初始化了兩天也沒成功,快要放棄的時(shí)候想起來為什么不換張?jiān)囋嚹兀谑蔷驼沂矣呀枇怂氖謾C(jī)內(nèi)存卡,是2GB的Apacer的MicroSD卡(當(dāng)然也可能是雜牌的,室友買那卡的地方一般都是賣各種廉價(jià)電子產(chǎn)品的,大家都知道是雜牌的),結(jié)果一試就成功了。后來我用了令一種方法發(fā)現(xiàn)也可以初始化,也就是說兩種方法都可以初始化成功。但我的那種怎么就不行呢?難道不是所有MicroSD卡都支持SPI模式。我在網(wǎng)上百度了半天也不能確定是不是所有MicroSD卡都支持SPI模式。但我想,現(xiàn)在MicroSD卡的生產(chǎn)公司很多,而且你也并不能保證你的MicroSD卡不是雜牌的。你并不知道生產(chǎn)廠家進(jìn)行了那些改變,因?yàn)榇_實(shí)有些廠家生產(chǎn)的SD卡精簡(jiǎn)了一些命令。所以初始化的時(shí)候建議兩種都試一下,不過我記得SD卡的說明書上推薦使用第二種方法。

下面是初始化方法:

(1)使用CMD1

發(fā)送CMD1,收到0x00表示成功

時(shí)序圖如下:

(2)使用CMD55+ACMD41

1.發(fā)送CMD55(表示使用ACMDx類命令),收到0x01

2.發(fā)送ACMD41,收到0x00表示成功

記住SD卡的初始化速度不能大于400kHz,所以一開始復(fù)位和初始化時(shí)spi的速率要設(shè)置低一點(diǎn)。

讀單塊和多塊:

SD卡讀單塊和多塊的命令分別為CMD17和CMD18,他們的參數(shù)即要讀的區(qū)域的開始地址。因?yàn)榭紤]到一般SD卡的讀寫要求地址對(duì)齊,所以一般我們都將地址轉(zhuǎn)為塊,并以扇區(qū)(塊)(512Byte)為單位進(jìn)行讀寫,比如讀扇區(qū)0參數(shù)就為0,讀扇區(qū)1參數(shù)就為1<<9(即地址512),讀扇區(qū)2參數(shù)就為2<<9(即地址1024),依此類推。

讀單塊方法:

1.發(fā)送CMD17,收到0x00表示成功

2.連續(xù)讀直到讀到開始字節(jié)0xFE

3.讀512個(gè)字節(jié)

4.讀兩個(gè)CRC字節(jié)

讀單塊時(shí)序圖:

讀多塊方法:

1.發(fā)送CMD18讀,收到0x00表示成功

2.連續(xù)讀直到讀到開始字節(jié)0xFE

3.讀512字節(jié)

4.讀兩個(gè)CRC字節(jié)

5.如果還想讀下一扇區(qū),重復(fù)2-4

6.發(fā)送CMD12來停止讀多塊操作

寫單塊和多塊:

SD卡用CMD24和CMD25來寫單塊和多塊,參數(shù)的定義和讀操作是一樣的。

寫單塊方法:

1.發(fā)送CMD24,收到0x00表示成功

2.發(fā)送若干時(shí)鐘

3.發(fā)送寫單塊開始字節(jié)0xFE

4.發(fā)送512個(gè)字節(jié)數(shù)據(jù)

5.發(fā)送2字節(jié)CRC(可以均為0xff)

6.連續(xù)讀直到讀到XXX00101表示數(shù)據(jù)寫入成功

7.繼續(xù)讀進(jìn)行忙檢測(cè)(讀到0x00表示SD卡正忙),當(dāng)讀到0xff表示寫操作完成

寫單塊時(shí)序圖:

寫多塊方法:

1.發(fā)送CMD25,收到0x00表示成功

2.發(fā)送若干時(shí)鐘

3.發(fā)送寫多塊開始字節(jié)0xFC

4.發(fā)送512字節(jié)數(shù)據(jù)

5.發(fā)送兩個(gè)CRC(可以均為0xff)

6.連續(xù)讀直到讀到XXX00101表示數(shù)據(jù)寫入成功

7.繼續(xù)讀進(jìn)行忙檢測(cè),直到讀到0xFF表示寫操作完成

8.如果想讀下一扇區(qū)重復(fù)2-7步驟

9.發(fā)送寫多塊停止字節(jié)0xFD來停止寫操作

10.進(jìn)行忙檢測(cè)直到讀到0xFF

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論