MicroSD卡(TF卡)SPI模式實現方法


現在我們手機的內存卡多為Micro SD卡,又叫TF卡,所以Micro SD卡比SD卡常見。自己曾經也想寫寫SD卡的讀取程序,但又不想特地再去買個SD卡,這時想起手機內存卡不是和SD卡很像嗎?在網上查了以后發現SD卡
和Micro SD卡其實也就大小和引腳不一樣,它們的操作其實是一樣的,所以網上的SD卡讀寫代碼其實可以直接拿來用。關於SD卡和Micro SD卡的引腳定義和不同可見下兩表:

  我們可以發現Micro SD卡只有8個引腳是因為比SD卡少了一個Vss。當然你也可以買個卡套套在Micro SD卡上,這樣一來大小就和SD卡一樣大,這時候卡套上的9個引腳就和SD卡一樣了,你可以完全當做SD卡來操作。

spi下電路的連接非常簡單,接上電源線Vdd和地線Vss,再接上spi的CS,SCLK,DI(MOSI)和DO(MISO)就可以了,其他引腳可以 放空。注意SD卡的電源和操作電壓都為2.7-3.6V,5V的單片機要進行電平轉換或串電阻限流。

還有記得SD卡的CS,SCLKh和DI要用 10~100K的電阻上拉。我是套了卡套接的電路,因為Micro SD卡的引腳太密了,不好焊接,SD卡相對引腳好焊。因為沒有卡座,而且也沒專門的PCB我就直接焊到卡套上,誒犧牲了一個卡套。

下面是我自己畫的電路 圖:

上面Micro SD卡的硬件電路就好了,下面我們講講Micro SD卡的軟件驅動和指令集。

SD卡的命令格式如下,6字節共48位,傳輸時最高位(MSB)先傳輸:

SD卡的command(命令)占6 bit,一般叫CMDx或ACMDx,比如CMD1就是1,CMD13就是13,ACMD41就是41,依此類推。Command Argument(命令參數)占4 byte,並不是所有命令都有參數,沒有參數的話該位一般就用置0。

最后一個字節由7 bit CRC校驗位和1 bit停止位組成。在SPI模式下,CRC是被忽略的,可以都置1或置0.但是發送CMD0時要記得加上CRC,即最后1字節為0x95(因為發送 CMD0時還未進入SPI模式,PS:CMD8也要,

但一般大家都把發送CMD8省略了)。每次發送完一次命令后,SD卡都會有回應。SD卡的回應有多種格式,1字節的R1,2字節的R2等,不過一般在SPI模式中我們只用到R1,下面介紹R1的格式:

關於SD卡SPI和command的發送要注意以下幾點:

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

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

3.在SD卡的Din沒有數據寫入時,應使Din
保持高電平。關於這一點我可吃透了苦頭,本來也記得要保持高電平的,結果不知怎的鬼使神差的置0拉低了。結果程序出現了各種奇怪的貌似偶然的錯誤,比如連
續兩次復位會有一次失敗,單步調試成功全速運行又會失敗。總之在這個過程中我對時序進行各種改變,每次解決一個問題后又會有新的問題出現,多少次動搖了我
對MicroSD卡和SD卡的操作是一樣的這個看法。因為這個低級的錯誤耽誤了我三四天,看來細心很重要啊!我已經不止一次因為不細心浪費大量時間了,希
望大家也引以為戒。

好了,現在SD卡的命令和回應清楚了,我們下面講講SD卡的復位,初始化和讀寫方法。

 

復位方法:

1.拉高CS,發送至少74個clk周期來使SD卡達到正常工作電壓和進行同步

2.選低CS,發送CMD0,需要收到回應0x01表示成功進入idle狀態

3.拉高CS,發送8個時鍾

復位時序圖:

初始化:

    復位成功后,SD卡就進入了SPI模式,接着應該進行初始化。初始化說白了有兩種方法:(1)發送CMD1,(2)發送CMD55+ACMD41。

我從網 上查的資料可以看到這種說法:如果是MMC卡就發CMD1,SD卡則發CMD55+ACMD41。但是關於Micro SD卡要發哪種卻講的不太清楚,網上用這兩種方法都有人成功過,但有的都成功不了。

我自己也碰到了這種問題,剛開始拿了自己手機上的寫着Nokia的 2GB的Micro SD卡(應該是雜牌的)初始化了兩天也沒成功,快要放棄的時候想起來為什么不換張試試呢,於是就找室友借了他的手機內存卡,

是2GB的Apacer的 Micro SD卡(當然也可能是雜牌的,室友買那卡的地方一般都是賣各種廉價電子產品的,大家都知道是雜牌的),結果一試就成功了。后來我用了令一種方法發現也可以 初始化,

也就是說兩種方法都可以初始化成功。但我的那種怎么就不行呢?難道不是所有Micro SD卡都支持SPI模式。我在網上百度了半天也不能確定是不是所有Micro SD卡都支持SPI模式。

但我想,現在Micro SD卡的生產公司很多,而且你也並不能保證你的Micro SD卡不是雜牌的。你並不知道生產廠家進行了那些改變,因為確實有些廠家生產的SD卡精簡了一些命令。所以初始化的時候建議兩種都試一下,

不過我記得SD 卡的說明書上推薦使用第二種方法。

 

下面是初始化方法:

(1)使用CMD1

發送CMD1,收到0x00表示成功

時序圖如下:

 

讀多塊方法:

    1.發送CMD18讀,收到0x00表示成功

    2.連續讀直到讀到開始字節0xFE

    3.讀512字節

    4.讀兩個CRC字節

    5.如果還想讀下一扇區,重復2-4

    6.發送CMD12來停止讀多塊操作

 

    寫單塊和多塊:

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

    寫單塊方法:

    1.發送CMD24,收到0x00表示成功

    2.發送若干時鍾

    3.發送寫單塊開始字節0xFE

    4.發送512個字節數據

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

    6.連續讀直到讀到XXX00101表示數據寫入成功

    7.繼續讀進行忙檢測(讀到0x00表示SD卡正忙),當讀到0xff表示寫操作完成

    寫單塊時序圖:

寫多塊方法:

    1.發送CMD25,收到0x00表示成功

    2.發送若干時鍾

    3.發送寫多塊開始字節0xFC

    4.發送512字節數據

    5.發送兩個CRC(可以均為0xff)

    6.連續讀直到讀到XXX00101表示數據寫入成功

    7.繼續讀進行忙檢測,直到讀到0xFF表示寫操作完成

    8.如果想讀下一扇區重復2-7步驟

    9.發送寫多塊停止字節0xFD來停止寫操作

    10.進行忙檢測直到讀到0xFF

 

原文:http://blog.csdn.net/ming1006/article/details/7281597

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM