前面的文章提到過SD卡主要分爲兩個操做模式,一是初始化和識別操做模式,另外一種就是這篇文章須要分析的數據傳輸模式啦。編程
數據傳輸模式:緩存
數據傳輸模式主要有六種狀態,分別是Stand-by狀態、Transfer狀態、Sending-data狀態、Receive-data狀態、Programming狀態、Disconnect狀態。這六種狀態經過不一樣的Command就能夠切換到某種狀態,換句話說,這六種狀態貫穿了整個數據傳輸模式。spa
要理解數據傳輸模式的流程,老衲認爲除了理解這六種狀態,還須要對Commands有必定的瞭解,越熟悉越好,固然,這並非叫你去背Commands。好了,咱們來看看數據傳輸模式的流程框圖:翻譯
老衲我第一次看到這圖的時候,簡直看暈了,有木有!!太噁心了吧,誰定義的協議,敢不敢再複雜一點?沒辦法,作IT的就是苦逼,只能慢慢一點點啃,在理解流程以前,咱們必須講協議裏的英文翻譯一遍,而後結合流程圖理解究竟是怎麼一回事,最後結合代碼來看,這才能真正明白數據傳輸的過程是怎麼一回事,下面是對英文協議裏數據傳輸模式的翻譯:ci
數據傳輸模式(翻譯):it
在SD卡識別模式結束以前,控制器使用的時鐘頻率均爲Fod。在數據傳輸模式,控制器可能會使用Fpp頻率。控制器發送一條SSEND_CSD(CMD9)命令來獲取SD卡CSD寄存器(Card Specific Data)裏面的描述值,譬如,塊長度,卡容量信息等。廣播命令SET_DSR(CMD4)配置全部識別卡的驅動段。對應於應用總線LayOut(長度),卡的數量和數據傳輸頻率,這個命令設置DSR寄存器。時鐘頻率在那個點上也應該從Fod切換Fpp。SET_DSR命令對Host和卡都是可選的。配置
CMD7 用來選擇一個卡並將它置於傳輸狀態(Transfer state),在任什麼時候間只能有一個卡處於傳輸狀態。 若是已有一個卡處於傳輸狀態, 它和主機的鏈接將釋放,並返回到 Stand-by狀態。當 CMD7 以保留相對地址「0x0000」發送時,全部卡將返回到 Stand-by 狀態。這能夠用來識別新的卡而不重置其餘已註冊的卡。 在這種狀態下已有一個 RCA 地址的卡不響應識別命令(ACMD41,CMD2,CMD3)。programming
數據傳輸模式下各個狀態的轉換關係總結以下:im
·所 有的數據讀命令均可以被中止命令(CMD12)在任意時刻終止。數據傳輸會終止,SD卡返回Transfer狀態。讀命令有:塊讀操做(CMD17)、多 塊讀操做(CMD18)、發送寫保護(CMD30)、發送scr(ACMD51)以及讀模式下的普通命令(CMD56)。總結
·全部的數據寫命令均可以被中止命令(CMD12)在任意時刻終止。寫命令也會在取消選擇命令(CMD7)以前中止。寫命令有:塊寫操做(CMD24,CMD25)、編程命令(CMD27)、鎖定/解鎖命令(CMD42)以及寫模式下的普通命令(CMD56)。
·數據傳輸一旦完成,SD卡會退出數據寫狀態,進入Programming狀態(傳輸成功)或者Transfer狀態(傳輸失敗)若是塊寫操做被叫停,可是寫操做包含的最終塊其長度和CRC校驗是正確的話,數據會被編程到SD卡(從緩存寫入到Flash)。
·卡可能提供塊寫緩衝。 這意味着在前一塊數據被操做時,下一塊數據能夠傳送給卡。若是全部卡寫緩衝已滿, 只要卡在 Programming State, DAT0 將保持低電平(BUSY)。
·寫 CSD、CID、寫保護和擦除時沒有緩衝。這代表在卡因這些命令而處於忙時,再也不接收其餘數據傳輸命令。 在卡忙時 DAT0 保持低電平, 並處於 Programming State。實際上若是 CMD 和 DAT0 線分離,並且主機佔有的忙 DAT0 線和其餘 DAT0 線分開,那麼在卡忙時,主機能夠訪問其餘卡。
·在卡被編程(programming)時,禁止參數設置命令。參數設置命令包括:設置塊長度(CMD16),擦除塊開始(CMD32)和擦除塊結束(CMD33)。卡在操做時不容許讀命令。
·使用 CMD7 指令把另外一個卡從 Stand-by 狀態轉移到 Transfer 狀態不會停止擦除和編程(programming)操做。卡將切換到 Disconnect 狀態並釋放 DAT 線。
·使用 CMD7 指令能夠不選中處於 Disconnect 狀態的卡。卡將進入 Programming 狀態,從新激活忙指示。
·使用 CMD0 或 CMD15 重置卡將停止全部掛起和活動的編程(programming)操做。這可能會破壞卡上的數據內容,須要主機保證避免這樣的操做。CMD34-37 CMD50,CMD57保留。
看起來是挺暈的對吧,確實挺暈的,最好的辦法就是結合代碼去分析讀寫過程了,這個嘛,後面有機會再詳細分析。