SD卡SPI模式驅(qū)動程序??! |
類別:隨便寫寫 查看:28078 評論:14 |
發(fā)表于:2007-08-20 14:50 |
本文關(guān)鍵詞:SD SPI CMD0 CMD55 ACMD41 初始化 這些天沒有出門,一直在家研究SD卡的SPI模式的初始化順序,這里為大家總結(jié)了一下編寫該程序所需要的知識: 1.SD卡的官方資料(我承認(rèn)這個資料很垃圾,比起民間的技術(shù)總結(jié)它的內(nèi)容可謂又臭又長,但是作為基礎(chǔ)也要了解一下,SD協(xié)議不用看) 2.清晰明了的MMC卡時序圖(雖然這個是MMC卡的,但是在初始化的時候CMD0的時序是一樣的) 電路:我用的SD卡的電路其實(shí)很簡單,參考SD卡的官方資料中的電路鏈接就可以的。 供電問題:由于SD卡的電壓是3.3V,所以你的CPU必須支持3.3V的IO端口輸出。 再來說一說雞毛蒜皮的細(xì)節(jié): 1.為了使SD卡初始化進(jìn)入SPI模式,我們需要使用的命令有3個:CMD0,ACMD41,CMD55(使用ACMD類的指令前應(yīng)先發(fā)CMD55,CMD55起到一個切換到ACMD類命令的作用)。 2. 為什么在使用CMD0以后不使用CMD1?CMD1是MMC卡使用的指令,雖然本文并不想討論MMC卡的問題,但是我還是要說:為了實(shí)現(xiàn)兼容性,上電或者 發(fā)送CMD0后,應(yīng)該首先發(fā)送CMD55+ACMD41確認(rèn)是否有回應(yīng),如果有回應(yīng)則為SD卡,如果等回應(yīng)超時,則可能是MMC卡,再發(fā)CMD1確認(rèn)。 3.正確的回應(yīng)內(nèi)容應(yīng)該是: CMD0——0x01(SD卡處于in-idle-state) CMD55——0x01(SD卡處于in-idle-state) ACMD41——0x00(SD卡跳出in-idle-state,完成初始化準(zhǔn)備接受下一條指令) 這里要說的是如果最后的回應(yīng)內(nèi)容還是0x01的話,可以循環(huán)發(fā)送CMD55+ACMD41,直到回應(yīng)的內(nèi)容0x00。 4. 在所有的指令中,唯獨(dú)CMD0特殊,在向SD卡發(fā)送以前需要向SD卡發(fā)送74+個時鐘。那么為什么要74個CLK呢?因?yàn)樵谏想姵跗?,電壓的上升過程據(jù) SD卡組織的計算約合64個CLK周期才能到達(dá)SD卡的正常工作電壓他們管這個叫做Supply ramp up time,其后的10個CLK是為了與SD卡同步,之后開始CMD0的操作,嚴(yán)格按照此項(xiàng)操作,一定沒有問題。 5.關(guān)于SD卡的SPI總線,在讀入數(shù)據(jù)時SD卡的SPI是CLK的上升沿輸入鎖存,輸出數(shù)據(jù)也是在上升沿。 6.向SD卡寫入一個CMD或者ACMD指令的過程是這樣的: 首先使CS為低電平,SD卡使能;其次在SD卡的Din寫入指令;寫入指令后還要附加8個填充時鐘,是SD卡完成內(nèi)部操作;之后在SD卡的Dout上接受回應(yīng);回應(yīng)接受完畢使CS為低電平,再附加8個填充時鐘。 7.在SD卡的Din沒有數(shù)據(jù)寫入時,應(yīng)使Din保持高電平。 關(guān)于程序,大家請到我在論壇上的這個帖子下載。 最后,還是那句老話,大家有問題可以問我,在這篇文章留言,留言時選擇匿名就可以不注冊留言,必要時留下自己的郵箱,我們可以一起研究。我的郵箱地址在首頁的右上方的圖片上有。 |
聯(lián)系客服