四.SDIO功能框圖(重點)
SDIO包含2個部分:
● SDIO適配器模塊:實現所有MMC/SD/SD I/O卡的相關功能,如時鐘的產生、命令和數據的傳送。
● AHB總線接口:操作SDIO適配器模塊中的寄存器(由STM32控制SDIO外設),并產生中斷和DMA請求信號

復位后默認情況下SDIO_D0用于數據傳輸,初始化后主機可以改變數據總線的寬度(SD卡1根或4根數據線)。
如果一個SD卡接到了總線上,可以通過主機配置數據傳輸使用SDIO_D0或SDIO_D[3:0] (使用一根或四根數據線)。所有的數據線都工作在復用推挽模式。
命令線也都工作在復用推挽模式
時鐘
SDIO使用兩個時鐘信號:
● SDIO適配器時鐘(SDIOCLK=HCLK)
● AHB總線時鐘(HCLK/2)經過了分頻
SDIO_CK是卡的時鐘線:每個時鐘周期上升沿在命令和數據線上傳輸1位命令或數據。對于SD卡,時鐘頻率可以在0MHz至25MHz間變化。

引腳定義

接下來就是將SDIO框圖拆分研究各個模塊:
1.SDIO適配器
● SDIO適配器模塊:實現所有SD卡的相關功能,如時鐘的產生、命令和數據的傳送,而STM32可以通過AHB接口讀寫適配器寄存器從而控制SDIO外設讀寫SD卡(發送命令,接收響應,數據傳輸)。

適配器寄存器和FIFO使用AHB總線一側的時鐘(HCLK/2),控制單元、命令通道和數據通道使用SDIO適配器一側的時鐘(SDIOCLK)
SDIO適配器包含以下5個部分
● 適配器寄存器模塊
● 控制單元
● 命令通道
● 數據通道
● 數據FIFO
1.適配器寄存器模塊
適配器寄存器模塊包含所有系統寄存器。
2.控制單元
控制單元包含電源管理功能和為存儲器卡提供的時鐘分頻

時鐘管理子單元產生和控制SDIO_CK信號。SDIO_CK輸出可以使用時鐘分頻或時鐘旁路模式。
在電源關閉和電源啟動階段,電源管理子單元會關閉卡總線上的輸出信號則下述情況下沒有時鐘輸出:
● 復位后
● 在電源關閉和電源啟動階段
● 當啟動了省電模式并且卡總線處于空閑狀態(命令通道和數據通道子單元進入空閑階段后的8個時鐘周期)
3.命令通道(重點)
命令通道單元向SD卡發送命令,并接收SD卡的響應,命令與響應都使用SDIO_CMD(命令線)進行傳輸。

1.主機(STM32SDIO外設)發送命令給SD卡
1)命令參數寄存器

2)命令寄存器(命令索引(6位),命令使能位ENCMDcompl)

SD 命令格式固定為 48bit,都是通過 CMD 線連續傳輸的(數據線不參與)。

命令的主體包括:命令號,命令參數/地址信息,其他的(起始位,傳輸標志,CRC校驗,終止位)不管,后面再講。

如果命令不帶參數,那SDIO參數寄存器默認為全1就好了

2.主機(STM32SDIO外設)接收SD卡的響應
1)命令響應寄存器

2)SDIO相應寄存器1~4

SDIO 總共有 7 個響應類型(代號:R1~R7),其中 SD 卡沒有 R4、R5 類型響應,SD 卡的響應也是通過 CMD 線連續傳輸的。根據響應內容大小可以分為短響應和長響應。短響應是 48bit 長度,只有 R2 類型是長響應,其長度為 136bit。(關于響應與命令后面馬上講)

現在只需要知道,響應由SD卡也是通過CMD(命令線)傳輸到SDIO(響應中的命令號存放在SDIO的命令響應寄存器中(如果響應不帶命令號則不用管就好了),SD卡的狀態則存放在SDIO 響應寄存器1~4)
主機接收SD卡響應的流程:

3.命令通道狀態機(CPSM)
當寫入命令寄存器并設置了使能位,開始發送命令。命令發送完成時,命令通道狀態機(CPSM)設置狀態標志并在不需要響應時進入空閑狀態(見下圖)。

一般發送命令接收響應過程

如果命令寄存器中設置掛起位,CPSM進入掛起(Pend)狀態并等待數據通道子單元發出的CmdPend信號,在檢測到CmdPend信號時,CPSM進入發送(Send)狀態,這將觸發數據計數器發送停止命令的功能


當進入等待(Wait)狀態時,命令定時器開始運行,當CPSM進入接收(Receive)狀態之前,產生了超時,則設置超時標志并進入空閑(Idle)狀態。
注: 命令超時固定為64個SDIO_CK時鐘周期。



然后那些狀態機CPSM被關閉,CRC校驗失敗等都會回到空閑狀態
最后這個發送命令等待響應的過程,有很多狀態感覺會很復雜,其實我們只有啟用了CPSM狀態機可以不用管這些狀態轉化,我們只管發送命令,CPSM狀態機會幫我們處理好這些狀態。

4.命令通道狀態標志


5.CRC校驗
CRC發生器計算CRC碼之前所有位的CRC校驗和,包括開始位、發送位、命令索引和命令參數或卡狀態)。對于長響應格式,CRC校驗和計算的是CID或CSD的前120位;注意,長響應格式中的開始位、傳輸位和6個保留位不參與CRC計算。
CRC反正不用管,硬件會幫我們自動校驗
4.數據通道

在時鐘控制寄存器中可以配置卡的數據總線寬度。如果選擇了4位總線模式,則每個時鐘周期四條數據信號線(SDIO_D[3:0])上將傳輸4位數據;如果沒有選擇寬總線模式,則每個時鐘周期只在SDIO_D0上傳輸1位數據。(數據傳輸可以選擇1根或4根數據線關于SD卡)
1.數據FIFO

數據FIFO(先進先出)子單元是一個具有發送和接收單元的數據緩沖區。
FIFO包含一個每字32位寬、共32個字的數據緩沖區,和發送與接收電路。因為數據FIFO工作在AHB時鐘區域(HCLK/2),所有與SDIO時鐘區域(SDIOCLK)連接的信號都進行了重新同步。依據TXACT和RXACT標志,可以關閉FIFO、使能發送或使能接收。TXACT和RXACT由數據通道子單元設置而且是互斥的:
─ 當TXACT有效時,發送FIFO代表發送電路和數據緩沖區
─ 當RXACT有效時,接收FIFO代表接收電路和數據緩沖區

發送FIFO:當使能了SDIO的發送功能,數據可以通過AHB接口寫入發送FIFO。
發送FIFO有32個連續的地址。發送FIFO中有一個數據輸出寄存器,包含讀指針指向的數據字。當數據通道子單元裝填了移位寄存器后,它移動讀指針至下個數據并傳輸出數據。如果未使能發送FIFO,所有的狀態標志均處于無效狀態。當發送數據時,數據通道子單元設置TXACT為有效。

接收FIFO:當數據通道子單元接收到一個數據字,它會把數據寫入FIFO。
寫操作結束后,寫指針自動加一;在另一端,有一個讀指針始終指向FIFO中的當前數據。如果關閉了接收FIFO,所有的狀態標志會被清除,讀寫指針也被復位。在接收到數據時數據通道子單元設置RXACT。
下表列出了接收FIFO的狀態標志。通過32個連續的地址可以訪問接收FIFO。

2.數據通道狀態機(DPSM)
根據傳輸的方向(發送或接收),使能時數據通道狀態機(DPSM)將進入Wait_S或Wait_R狀態:
● 發送:DPSM進入Wait_S狀態。如果發送FIFO中有數據,則DPSM進入發送狀態,同時數據通道子單元開始向卡發送數據。

接收:DPSM進入Wait_R狀態并等待開始位;當收到開始位時,DPSM進入接收狀態,同時數據通道子單元開始從卡接收數據

DPSM工作在SDIO_CK頻率,卡總線信號與SDIO_CK的上升沿同步。DPSM有6個狀態(這下有的看了),如下圖所示:

數據控制寄存器

● 空閑(Idle):數據通道不工作,SDIO_D[7:0]輸出處于高阻狀態。當寫入數據控制寄存器并設置使能位時,DPSM為數據計數器加載新的數值,并依據數據方向位進入Wait_S或Wait_R狀態。

● Wait_R:如果數據計數器等于0,當接收FIFO為空時DPSM進入到空閑(Idle)狀態。如果數據計數器不等于0,DPSM等待SDIO_D上的開始位。如果DPSM在超時之前接收到一個開始位,它會進入接收(Receive)狀態并加載數據塊計數器。如果DPSM在檢測到一個開始位前出現超時,或發生開始位錯誤,DPSM將進入空閑狀態并設置超時狀態標志。

下面數據長度寄存器與數據計數寄存器詳情看圖就不在贅述了,關于這些寄存器會在最后的結構章節詳細講解。

● 接收(Receive):接收到的串行數據被組合為字節并寫入數FIFO。根據數據控制寄存器中傳輸模式位的設置,數據傳輸模式可以是塊傳輸或流傳輸:
─ 在數據塊傳輸模式下,當數據塊計數器達到0時,DPSM等待接收CRC碼,如果接收到的代碼與內部產生的CRC碼匹配,則DPSM進入Wait_R狀態,否則設置CRC失敗狀態標志同時DPSM進入到空閑狀態。


● Wait_S:如果數據計數器為0,DPSM進入空閑狀態;否則DPSM等待數據FIFO空標志消失后,進入發送狀態
● 發送(Send):DPSM開始發送數據到卡設備。根據數據控制寄存器中傳輸模式位的設置,數據傳輸模式可以是塊傳輸或流傳輸:
─ 在塊模式下,當數據塊計數器達到0時,DPSM發送內部產生的CRC碼,然后是結束位,并進入繁忙狀態

● 繁忙(Busy):DPSM等待CRC狀態標志:
─ 如果沒有接收到正確的CRC狀態,則DPSM進入空閑狀態并設置CRC失敗狀態標志。
─ 如果接收到正確的CRC狀態,則當SDIO_D0不為低時(SD卡不繁忙)DPSM進入Wait_S狀態。(一般情況)

當DPSM處于繁忙狀態時發生了超時,DPSM則設置數據超時標志并進入空閑狀態。
當DPSM處于Wait_R或繁忙狀態時,數據定時器被使能,并能夠產生數據超時錯誤:
─ 發送數據時,如果DPSM處于繁忙狀態超過程序設置的超時間隔,則產生超時。
─ 接收數據時,如果未收完所有數據,并且DPSM處于Wait_R狀態超過程序設置的超時間隔,則產生超時

數據可以從主機傳送到卡,也可以反向傳輸。數據在數據線上傳輸。數據存儲在一個32字的FIFO中,每個字為32位寬,SD卡可以拉低SDIO_D0數據線表示卡正在忙碌.
最后反正數據傳輸中的狀態怎么復雜,其實數據通道狀態機(DPSM)會幫我們處理好這些狀態的轉換,我們只需要準備好發送和接收數據就好了
實在理不清清楚就了解一下,大概知道用那些寄存器位控制。
五.命令與響應
SD 命令由主機發出,以廣播命令和尋址命令為例,廣播命令是針對與 SD 主機總線連接的所有從設備(SD卡)發送的,尋址命令是指定某個地址設備進行命令傳輸。
1.命令格式
SD 命令格式固定為 48bit,都是通過 CMD 線連續傳輸的(數據線不參與)

1.起始位和終止位:命令的主體包含在起始位與終止位之間,它們都只包含一個數據位,起始位為 0,終止位為 1。
2.傳輸標志:用于區分傳輸方向,該位為 1 時表示命令,方向為主機傳輸到 SD 卡,該位為 0 時表示響應,方向為 SD 卡傳輸到主機。
3.命令主體內容包括命令、地址信息/參數和 CRC 校驗三個部分。
命令號:它固定占用 6bit,所以總共有 64 個命令(代號:CMD0~CMD63),每個命令都有特定的用途,部分命令不適用于 SD 卡操作,只是專門用于 MMC 卡或者SD I/O 卡。(有些命令具有參數有些命令沒有參數)
地址/參數:每個命令有 32bit 地址信息/參數用于命令附加內容,例如,廣播命令沒有地址信息,這 32bit 用于指定參數,而尋址命令這 32bit 用于指定目標 SD 卡的地址。
CRC7 校驗:長度為 7bit 的校驗位用于驗證命令傳輸內容正確性,如果發生外部干擾導致傳輸數據個別位狀態改變將導致校準失敗,也意味著命令傳輸失敗,SD卡不執行命令。
2.命令類型
SD 命令有 4 種類型:
1.廣播命令(bc),無響應 — 廣播命令只有當所有的 CMD 線都一起連到主機上時才會用。如果是分開的,那么每張卡單獨處理命令。
2.廣播命令,帶響應(bcr) — 所有卡同時響應,既然 SD 卡沒有開漏模式,這種命令應該是所有的命令線都是分開的,命令也會每張卡分開接收和響應。
3.尋址命令(ac,點對點) — 沒有數據在 DAT 線上
4.尋址數據傳輸命令(adtc) — 有數據在 DAT 線上
所有命令和響應都是通過 SD 卡的 CMD 線發送的。命令的發送總是從最左邊的那一位開始
另外,SD 卡主機模塊系統旨在為各種應用程序類型提供一個標準接口。在此環境中,需要有特定的客戶/應用程序功能。為實現這些功能,在標準中定義了兩種類型的通用命令:
特定應用命令(ACMD)和常規命令(GEN_CMD)。要使用 SD 卡制造商特定的 ACMD 命令如ACMD6,需要在發送該命令之前無發送 CMD55 命令,告知 SD 卡接下來的命令為特定應用命令(因為特定應用命令ACMD6與CMD6都表示為 000110 所以要區別的話發送特定命令之前先發送CMD55表示后面的 000110 表示ACMD6 )。
CMD55 命令只對緊接的第一個命令有效,SD 卡如果檢測到 CMD55 之后的第一條命令為 ACMD 則執行其特定應用功能,如果檢測發現不是 ACMD 命令,則執行標準命令。
3.命令描述
反正下面的命名基本上用的到,這里記也記不住,先熟悉一下,后面講SD卡識別模式,SD傳輸模式,以及后面寫代碼的時候,用到的命令在提及。

4.響應類型
命令寄存器包含命令索引(發至卡的6位)和命令類型;命令本身決定了是否需要響應和響應的類型、48位還是136位。

應由 SD 卡向主機發出,部分命令要求 SD 卡作出響應,這些響應多用于反饋 SD 卡的狀態。SDIO 總共有 7 個響應類型(代號:R1~R7),其中 SD 卡沒有 R4、R5 類型響應。特定的命令對應有特定的響應類型,比如當主機發送 CMD3 命令時,可以得到響應 R6。與命令一樣,SD 卡的響應也是通過 CMD 線連續傳輸的。根據響應內容大小可以分為短響應和長響應。短響應是 48bit 長度,只有 R2 類型是長響應,其長度為 136bit。
R1(正常命令響應)
長度 48bit。bit [45:40]代表響應的命令號(什么命令造成的響應)。卡的狀態存儲在 bit [39:8]。很多命令基本是R1類型的響應。

R1b響應:
R1b 就是 R1 響應命令,同時數據線上有busy信號(SDIO_D0被拉低)。卡在收到這些命令后可能會變為busy。主機應該在響應中檢查 busy。
R2(CID,CSD 寄存器)長響應

長度為 136bit。CID 寄存器的內容作為 CMD2 和 CMD10 的響應發送。CSD 寄存器的內容作為 CMD9 的響應發送。只傳輸 CID 和 CSD 寄存器的[127:1]位,這些寄存器的第[0]位被響應的結束位替代了

R3(OCR 寄存器
長度 48bit,OCR 寄存器的值作為 ACMD41 的響應發送


5 R6(發布的 RCA 寄存器響應)
長度 48bit。[45:40]是響應的命令號,這里就是‘000011’,即 CMD3。參數中的 16 位MSB 用于產生 RCA 號


R7(卡接口條件)
長度 48bit。卡支持的電壓信息通過 CMD8 的響應發送。Bit[19:16]表明卡支持的電壓范圍。卡接受提供的電壓范圍就返回 R7 響應。卡會在響應的參數中返回電壓范圍和檢查模式。

總結:
1.命令本身決定了是否需要響應和響應的類型
2.響應中除了 R3 類型之外,其他響應都使用 CRC7 校驗來校驗,對于 R2 類型是使用 CID 和CSD 寄存器內部 CRC7(如果響應不包含CRC(如CMD1的響應),設備驅動應該忽略CRC失敗狀態)。
3.有些響應不一定返回命令號
六.SD卡/SD NAND功能描述(重重點)
SD 卡系統定義了兩種操作模式:
● 卡識別模式
在復位后,查找總線上的新卡的時候,主機會處于“卡識別模式”。卡在復位后會處于識別模式,直到收到 SEND_RCA(CMD3)命令.
● 數據傳輸模式
當 RCA (相當于SD卡的ID號)第一次發布后,卡會處于“數據傳輸模式”。主機會在總線上所有的卡都被識別后進入這個模式

上面看不懂不要緊,接著往下看
1.操作條件確認
在主機和卡交互之初,主機可能不知道卡支持的電壓,卡也可能不知道是否支持當前的電壓。主機會先假設 SD 卡支持某個電壓,并以這個電壓發送一個復位命令 CMD0。為了驗證電壓,“Physical Layer Specification V2.0”又定義了一個新的命令 CMD8。

CMD8(發送接口條件命令)是用來依照 SD2.0 標準初始化 SD 卡的。CMD8 要在 SD 卡處于“idle”狀態下使用。
此命令有兩個功能:
1.電壓檢測:
檢測卡是否能在主機提供的電壓下工作。
2.使能已存在命令的擴展和響應:
恢復 CMD8 就能夠通過從定義之前預留的 bit,為一些已存在的命令擴展新的功能。

當卡在“idle”狀態時,主機應該先發送 CMD8,再發送 ACMD41。參數中“電壓支持”bit 被設置為主機支持的電壓,而“檢測模式”bit 被設置為任意的 8bit 模式(推薦使用‘10101010b) b代表位的意思。

①:這里是卡實際返回的內容(響應傳輸中不包含錯誤)
②:匹配意思是同時滿足下面的 a)和 b)。不匹配是其他情況。
a) VHS(支持的電壓)中只有 1 個 bit 被設置了
b)卡支持主機提供的電壓
CMD8用于驗證 SD 卡接口操作條件。SD卡會通過分析 CMD8 的參數來檢測操作條件的正確性,而主機會通過分析 CMD8 的響應來檢查正確性,支持的電壓是由參數里的 VHS 區指定的。SD卡會假設 VHS 里面指定的電壓是當前支持的電壓。每一次命令VHS 里面只有 1 位能被設置為 1。主機會通過 CRC 和檢查模式來確認通信的有效性。
如果卡能夠在支持電壓下操作,響應會傳回命令參數里設置的支持的電壓和檢測模式。
如果卡不能在支持電壓下操作,就不會發送響應,并保持在“空閑(idle)”狀態。
強制要求:
在發送第一個 ACMD41 之前要先發送 CMD8,以便初始化高容量 SD 卡。SD 卡如果收到 CMD8,就會知道主機支持 V2.0,就可以使能新的功能。
總結一句話:CMD8用來識別不同版本的卡和檢測卡是否能在主機提供的電壓下工作。
如果發送CMD8無響應:
1.電壓不匹配的 2.0 以上 SD 卡
2.1.0 的 SD 卡
3.不是 SD 卡
如果發送CMD8有響應:
電壓匹配的 2.0 以上 SD 卡(就是我們即將要使用的SD卡)
ACMD41是用來提供給主機一種機制來識別和拒絕那些不匹配它期望的 VDD 范圍的卡,主機通過發送需求的 VDD 電壓范圍來完成這個命令,這個范圍作為命令的參數。不能支持指定電壓范圍的卡應該自動放棄后續的總線操作,并且進入無效狀態。OCR 寄存器里面的標準應該響應的定義。
注意:ACMD41 是應用特定命令,在發送 ACMD41 之前需要發送CMD55。


2.卡識別模式
在卡識別模式,主機復位所有的卡、檢測操作電壓范圍、識別卡并為總線上每個卡設置相對地址(RCA(Relative Card Address):靠這個地址確認與主機與哪個SD卡通信)。在卡識別模式下,所有數據通信只使用命令信號線(CMD)。

在卡識別過程中,卡應該在識別時鐘頻率 FOD (400KHZ)下的 SD 時鐘頻率中工作,在數據傳輸模式時鐘頻率為Fpp(最大25MHZ),所以在卡識別模式完成之后進入數據傳輸模式需要轉換頻率。
在卡識別模式期間,主機應該保持在 Fod 頻率,因為某些卡可能在卡識別模式中有頻率限制。在數據傳輸模式,主機可以在 Fpp 頻率范圍操作卡
卡會檢查自己能不能在主機提供的電壓下工作。如果能夠,就會返回 R7 響應。響應參數中卡反饋了電壓范圍和檢測模式設置。

SD_SEND_OP_COND(ACMD41)作為開始,通過設置操作條件和 OCR 的 HCS 位來進行。
HCS(HighCapacity Support)位為 1,表示主機支持高容量 SD 卡。
HCS(HighCapacity Support)位為 0,表示主機不支持高容量 SD 卡。

HCS 會被不回應 CMD8 的卡忽視掉。然而,如果卡不回應 CMD8,主機應該設置 HCS 為 0。標準容量卡會忽略 HCS。如果 HCS 設置為 0,那么高容量 SD 卡永遠都不會返回 ready 狀態(保持 busy 位為 0)。
卡通過 OCR 的 busy 位來通知主機 ACMD41 的初始化完成了。
設置 busy 位為 0 表示卡仍然在初始化。
設置 busy 位為 1,表示已經完成初始化。主機會重復發送 ACMD41,直到 busy 為被設置
R3作為ACMD41命令的響應返回,OCR寄存器的值

OCR 寄存器
32 位的操作條件寄存器(OCR)存儲了卡的 VDD 電壓描述。另外,還包括了狀態信息位。如果卡的上電程序完成,一個狀態位會被設置。寄存器還包括另一個狀態位,在設置上電狀態位后,用來表明卡的容量狀態。
Bit31(busy位) – 卡上電狀態位,這個狀態位在卡的上電流程完成后設置。
Bit30(CCS位) – 卡容量狀態位,如果是高容量卡,設置為 1,如果是標準卡,設置為 0。
卡容量狀態位只有在上電流程完成,且 Bit31 設置為 1 之后才有效。
主機可以讀取這個狀態位來判斷卡的種類。

如果卡響應了 CMD8,那么 ACMD41 的響應就包括了 CCS 字段信息。當卡返回“ready”的時候,CCS 是有效的(busy 位設置為 1)。
CCS=1 表示卡是高容量 SD 卡;CCS=0 表示卡是普通 SD 卡
總結:ACMD41命令,是用來SD卡的工作電壓是否匹配,確定SD的容量(是標準卡還是高容量的卡)。
在系統中,主機遵照相同的初始化順序來初始化所有的新卡。不兼容的卡會進入“Inactive(無效)”狀態。
主機接著就會發送命令 CMD2給每一個卡,來得到他們的 CID 號,未識別的卡(處于 Ready 狀態的)發送自己的 CID 作為響應。當卡發送了 CID 之后,它就進入“Identification(識別狀態)”狀態。

之后主機發送CMD3命令,通知卡發布一個新的相對地址(RCA),這個地址比 CID 短,用于作為將來數據傳輸模式的地址。一旦收到 RCA,卡就會變為“Stand-by(待機狀態)”狀態。
這時,如果主機想要分配另一個 RCA 號,它可以再發送一個 CMD3,通知卡重新發布一個 RCA 號。最后一個產生的 RCA 才是有效的。

卡識別模式流程圖(重點重點)

一定一定要結合圖去理解上面的文字敘述,卡的識別過程就豁然開朗了
3.數據傳輸模式


在卡識別模式期間,主機應該保持在 Fod (400KHZ)頻率,因為某些卡可能在卡識別模式中有頻率限制。在數據傳輸模式,主機可以在 Fpp (最高25MHZ)頻率范圍操作卡

主機發送命令CMD9來獲得“SD卡具體數據(Card Specific Data)”,比如“塊長度”,“存儲容量”數據傳輸模式所有狀態等(這些數據會用于后面對SD卡的讀寫操作)。
廣播命令 CMD4會配置所有已識別卡的驅動范圍(電壓)。它會根據應用總線布局(長度)、總線上卡的數量以及數據傳輸頻率來配置它們的 DSR 寄存器。
CMD7 的作用是選擇一張SD卡,然后把它從卡識別模式切換到數據傳輸模式,每次只能有一張卡處于傳輸模式,如果一張處于傳輸模式的SD卡同主機的連接被釋放,那么它會回到“Stand-by(待機)”狀態。當 CMD7 帶著參數RCA=0x0000 發送的時候,所有的卡都會回到“Stand-by(待機)狀態。


主機讀數據(SD卡處于發送數據狀態)
所有數據讀命令可以在任何情況下通過停止命令(CMD12)來中止。數據傳輸會中止,卡會回到傳輸狀態。讀命令有:塊讀(CMD17),多塊讀(CMD18),發送寫保護(CMD30),發送SCR(ACMD51)以及讀模式的通用命令(CMD56)
一般就用CMD17塊讀,多塊讀(CMD18)


主機寫數據(SD卡處于接收數據狀態)
所有數據寫命令同樣也可以通過 CMD12 來中止。在發送 CMD7 取消選定卡之前,應該先停止寫命令。寫命令有:塊寫(CMD24,CMD25),編程 CSD(CMD27),鎖定/解鎖命令(CMD42)。
CMD24:
1.對于標準卡寫入寫入 SEL_BLOCK_LEN長度字節的塊。
2.對于 SDHC卡(高容量SD卡>2GB),寫入512 字節的塊。
CMD25:
連續寫入數據,直到被CMD12命令打斷。


● 一旦數據傳輸完成,卡會退出寫狀態,并且進入編程狀態(傳輸成功)或者傳輸狀態(傳輸失敗)

卡可能會提供緩存給“塊寫”:這就意味著當前一個塊正在處理的時候,就可以發送后一個塊了。如果緩存都慢了,那么卡就會處于編程狀態則SDIO_D0會被拉低(表示busy)
擦除SD卡數據
擦除命令有三條:
CMD32:設置擦除的起始地址
CMD33:設置擦除的結束地址
CMD38:開始擦除

擦除數據,相當于將要擦除的區域的位都設置為1,擦除過程中,SD卡也將處于編程狀態:SDIO_D0會被拉低(表示busy)
● 將另一張卡從 Stand-by (待機)模式轉換到 Transfer (傳輸)模式(CMD7)不會終止擦除和編程操作。正在操作的SD卡會切換到 Disconnect 狀態并且釋放 SDIO_D0線。
● 處于 Disconnect 狀態的卡可以通過 CMD7 的命令重新被選定。這時,卡會進入Programming 模式,并且重新使能 busy 。

復位卡(CMD0 或者 CMD15)會中止任何等候或者執行的編程操作。這可能會損壞卡的內容(但是盡量不要怎么做)。

總結
至此整個數據傳輸流程就全部講完,到這里肯定要心中有點數了,其實后面的代碼:卡的識別模式與數據傳輸模式 代碼實現完完全全是按照上述流程來編寫的。
【本文轉載自CSDN,作者:rivencode】
-
芯片
+關注
關注
458文章
51391瀏覽量
428443 -
SD卡
+關注
關注
2文章
568瀏覽量
64199 -
存儲芯片
+關注
關注
11文章
906瀏覽量
43337 -
TF卡
+關注
關注
2文章
81瀏覽量
12272
發布評論請先 登錄
相關推薦
雷龍 SD NAND 簡單使用
SD NAND、SPI NAND 和 Raw NAND 的定義與比較

SD NAND、SPI NAND 和 Raw NAND 的定義與比較
STM32F407 MCU使用SD NAND?不斷電初始化失效解決方案

評論