歡迎您光臨本站 登入註冊首頁

SD卡的SPI模式的初始化順序

admin @ 2014-03-26 , reply:0

概述

這些天沒有出門,一直在家研究SD卡的SPI模式的初始化順序,這裡為大家總結了一下編寫該程序所需要的知識:SD卡的官方資料(我承認這個資料很垃圾,比起民間的技術總結它的內容可謂又臭又長,但是作為基礎也要……

這些天沒有出門,一直在家研究SD卡的SPI模式的初始化順序,這裡為大家總結了一下編寫該程序所需要的知識:

  1. SD卡的官方資料(我承認這個資料很垃圾,比起民間的技術總結它的內容可謂又臭又長,但是作為基礎也要了解一下,SD協議不用看)
  2. 清晰明了的MMC卡時序圖(雖然這個是MMC卡的,但是在初始化的時候CMD0的時序是一樣的)

電路:我用的SD卡的電路其實很簡單,參考SD卡的官方資料中的電路鏈接就可以的。
供電問題:由於SD卡的電壓是3.3V,所以你的CPU必須支持3.3V的IO埠輸出。

再來說一說雞毛蒜皮的細節:

  1. 為了使SD卡初始化進入SPI模式,我們需要使用的命令有3個:CMD0,ACMD41,CMD55(使用ACMD類的指令前應先發CMD55,CMD55起到一個切換到ACMD類命令的作用)。
  2. 為什麼在使用CMD0以後不使用CMD1?CMD1是MMC卡使用的指令,雖然本文並不想討論MMC卡的問題,但是我還是要說:為了實現兼容性,上電或者發送CMD0后,應該首先發送CMD55+ACMD41確認是否有回應,如果有回應則為SD卡,如果等回應超時,則可能是MMC卡,再發CMD1確認。
  3. 正確的回應內容應該是:
        CMD0——0x01(SD卡處於in-idle-state)
        CMD55——0x01(SD卡處於in-idle-state)
        ACMD41——0x00(SD卡跳出in-idle-state,完成初始化準備接受下一條指令)
        這裡要說的是如果最後的回應內容還是0x01的話,可以循環發送CMD55+ACMD41,直到回應的內容0x00。
  4. 在所有的指令中,唯獨CMD0特殊,在向SD卡發送以前需要向SD卡發送74+個時鐘。那麼為什麼要74個CLK呢?因為在上電初期,電壓的上升過程據SD卡組織的計算約合64個CLK周期才能到達SD卡的正常工作電壓他們管這個叫做Supply ramp up time,其後的10個CLK是為了與SD卡同步,之後開始CMD0的操作,嚴格按照此項操作,一定沒有問題。
  5. 關於SD卡的SPI匯流排,在讀入數據時SD卡的SPI是CLK的上升沿輸入鎖存,輸出數據也是在上升沿。
  6. 向SD卡寫入一個CMD或者ACMD指令的過程是這樣的:
    首先使CS為低電平,SD卡使能;其次在SD卡的Din寫入指令;寫入指令后還要附加8個填充時鐘,是SD卡完成內部操作;之後在SD卡的Dout上接受回應;回應接受完畢使CS為低電平,再附加8個填充時鐘。
  7. 在SD卡的Din沒有數據寫入時,應使Din保持高電平。

[admin via 研發互助社區 ] SD卡的SPI模式的初始化順序已經有10957次圍觀

http://cocdig.com/docs/show-post-44602.html