四.SDIO功能框圖(重點)
SDIO包含2個部分:
● SDIO適配器模塊:實現(xiàn)所有MMC/SD/SD I/O卡的相關(guān)功能,如時鐘的產(chǎn)生、命令和數(shù)據(jù)的傳送。
● AHB總線接口:操作SDIO適配器模塊中的寄存器(由STM32控制SDIO外設(shè)),并產(chǎn)生中斷和DMA請求信號
復(fù)位后默認情況下SDIO_D0用于數(shù)據(jù)傳輸,初始化后主機可以改變數(shù)據(jù)總線的寬度(SD卡1根或4根數(shù)據(jù)線)。
如果一個SD卡接到了總線上,可以通過主機配置數(shù)據(jù)傳輸使用SDIO_D0或SDIO_D[3:0] (使用一根或四根數(shù)據(jù)線)。所有的數(shù)據(jù)線都工作在復(fù)用推挽模式。
命令線也都工作在復(fù)用推挽模式
時鐘
SDIO使用兩個時鐘信號:
● SDIO適配器時鐘(SDIOCLK=HCLK)
● AHB總線時鐘(HCLK/2)經(jīng)過了分頻
SDIO_CK是卡的時鐘線:每個時鐘周期上升沿在命令和數(shù)據(jù)線上傳輸1位命令或數(shù)據(jù)。對于SD卡,時鐘頻率可以在0MHz至25MHz間變化。
引腳定義
接下來就是將SDIO框圖拆分研究各個模塊:
1.SDIO適配器
● SDIO適配器模塊:實現(xiàn)所有SD卡的相關(guān)功能,如時鐘的產(chǎn)生、命令和數(shù)據(jù)的傳送,而STM32可以通過AHB接口讀寫適配器寄存器從而控制SDIO外設(shè)讀寫SD卡(發(fā)送命令,接收響應(yīng),數(shù)據(jù)傳輸)。
適配器寄存器和FIFO使用AHB總線一側(cè)的時鐘(HCLK/2),控制單元、命令通道和數(shù)據(jù)通道使用SDIO適配器一側(cè)的時鐘(SDIOCLK)
SDIO適配器包含以下5個部分
● 適配器寄存器模塊
● 控制單元
● 命令通道
● 數(shù)據(jù)通道
● 數(shù)據(jù)FIFO
1.適配器寄存器模塊
適配器寄存器模塊包含所有系統(tǒng)寄存器。
2.控制單元
控制單元包含電源管理功能和為存儲器卡提供的時鐘分頻
時鐘管理子單元產(chǎn)生和控制SDIO_CK信號。SDIO_CK輸出可以使用時鐘分頻或時鐘旁路模式。
在電源關(guān)閉和電源啟動階段,電源管理子單元會關(guān)閉卡總線上的輸出信號則下述情況下沒有時鐘輸出:
● 復(fù)位后
● 在電源關(guān)閉和電源啟動階段
● 當啟動了省電模式并且卡總線處于空閑狀態(tài)(命令通道和數(shù)據(jù)通道子單元進入空閑階段后的8個時鐘周期)
3.命令通道(重點)
命令通道單元向SD卡發(fā)送命令,并接收SD卡的響應(yīng),命令與響應(yīng)都使用SDIO_CMD(命令線)進行傳輸。
1.主機(STM32SDIO外設(shè))發(fā)送命令給SD卡
1)命令參數(shù)寄存器
2)命令寄存器(命令索引(6位),命令使能位ENCMDcompl)
SD 命令格式固定為 48bit,都是通過 CMD 線連續(xù)傳輸?shù)模〝?shù)據(jù)線不參與)。
命令的主體包括:命令號,命令參數(shù)/地址信息,其他的(起始位,傳輸標志,CRC校驗,終止位)不管,后面再講。
如果命令不帶參數(shù),那SDIO參數(shù)寄存器默認為全1就好了
2.主機(STM32SDIO外設(shè))接收SD卡的響應(yīng)
1)命令響應(yīng)寄存器
2)SDIO相應(yīng)寄存器1~4
SDIO 總共有 7 個響應(yīng)類型(代號:R1~R7),其中 SD 卡沒有 R4、R5 類型響應(yīng),SD 卡的響應(yīng)也是通過 CMD 線連續(xù)傳輸?shù)摹8鶕?jù)響應(yīng)內(nèi)容大小可以分為短響應(yīng)和長響應(yīng)。短響應(yīng)是 48bit 長度,只有 R2 類型是長響應(yīng),其長度為 136bit。(關(guān)于響應(yīng)與命令后面馬上講)
現(xiàn)在只需要知道,響應(yīng)由SD卡也是通過CMD(命令線)傳輸?shù)絊DIO(響應(yīng)中的命令號存放在SDIO的命令響應(yīng)寄存器中(如果響應(yīng)不帶命令號則不用管就好了),SD卡的狀態(tài)則存放在SDIO 響應(yīng)寄存器1~4)
主機接收SD卡響應(yīng)的流程:
3.命令通道狀態(tài)機(CPSM)
當寫入命令寄存器并設(shè)置了使能位,開始發(fā)送命令。命令發(fā)送完成時,命令通道狀態(tài)機(CPSM)設(shè)置狀態(tài)標志并在不需要響應(yīng)時進入空閑狀態(tài)(見下圖)。
一般發(fā)送命令接收響應(yīng)過程
如果命令寄存器中設(shè)置掛起位,CPSM進入掛起(Pend)狀態(tài)并等待數(shù)據(jù)通道子單元發(fā)出的CmdPend信號,在檢測到CmdPend信號時,CPSM進入發(fā)送(Send)狀態(tài),這將觸發(fā)數(shù)據(jù)計數(shù)器發(fā)送停止命令的功能
當進入等待(Wait)狀態(tài)時,命令定時器開始運行,當CPSM進入接收(Receive)狀態(tài)之前,產(chǎn)生了超時,則設(shè)置超時標志并進入空閑(Idle)狀態(tài)。
注: 命令超時固定為64個SDIO_CK時鐘周期。
然后那些狀態(tài)機CPSM被關(guān)閉,CRC校驗失敗等都會回到空閑狀態(tài)
最后這個發(fā)送命令等待響應(yīng)的過程,有很多狀態(tài)感覺會很復(fù)雜,其實我們只有啟用了CPSM狀態(tài)機可以不用管這些狀態(tài)轉(zhuǎn)化,我們只管發(fā)送命令,CPSM狀態(tài)機會幫我們處理好這些狀態(tài)。
4.命令通道狀態(tài)標志
5.CRC校驗
CRC發(fā)生器計算CRC碼之前所有位的CRC校驗和,包括開始位、發(fā)送位、命令索引和命令參數(shù)或卡狀態(tài))。對于長響應(yīng)格式,CRC校驗和計算的是CID或CSD的前120位;注意,長響應(yīng)格式中的開始位、傳輸位和6個保留位不參與CRC計算。
CRC反正不用管,硬件會幫我們自動校驗
4.數(shù)據(jù)通道
在時鐘控制寄存器中可以配置卡的數(shù)據(jù)總線寬度。如果選擇了4位總線模式,則每個時鐘周期四條數(shù)據(jù)信號線(SDIO_D[3:0])上將傳輸4位數(shù)據(jù);如果沒有選擇寬總線模式,則每個時鐘周期只在SDIO_D0上傳輸1位數(shù)據(jù)。(數(shù)據(jù)傳輸可以選擇1根或4根數(shù)據(jù)線關(guān)于SD卡)
1.數(shù)據(jù)FIFO
數(shù)據(jù)FIFO(先進先出)子單元是一個具有發(fā)送和接收單元的數(shù)據(jù)緩沖區(qū)。
FIFO包含一個每字32位寬、共32個字的數(shù)據(jù)緩沖區(qū),和發(fā)送與接收電路。因為數(shù)據(jù)FIFO工作在AHB時鐘區(qū)域(HCLK/2),所有與SDIO時鐘區(qū)域(SDIOCLK)連接的信號都進行了重新同步。依據(jù)TXACT和RXACT標志,可以關(guān)閉FIFO、使能發(fā)送或使能接收。TXACT和RXACT由數(shù)據(jù)通道子單元設(shè)置而且是互斥的:
─ 當TXACT有效時,發(fā)送FIFO代表發(fā)送電路和數(shù)據(jù)緩沖區(qū)
─ 當RXACT有效時,接收FIFO代表接收電路和數(shù)據(jù)緩沖區(qū)
發(fā)送FIFO:當使能了SDIO的發(fā)送功能,數(shù)據(jù)可以通過AHB接口寫入發(fā)送FIFO。
發(fā)送FIFO有32個連續(xù)的地址。發(fā)送FIFO中有一個數(shù)據(jù)輸出寄存器,包含讀指針指向的數(shù)據(jù)字。當數(shù)據(jù)通道子單元裝填了移位寄存器后,它移動讀指針至下個數(shù)據(jù)并傳輸出數(shù)據(jù)。如果未使能發(fā)送FIFO,所有的狀態(tài)標志均處于無效狀態(tài)。當發(fā)送數(shù)據(jù)時,數(shù)據(jù)通道子單元設(shè)置TXACT為有效。
接收FIFO:當數(shù)據(jù)通道子單元接收到一個數(shù)據(jù)字,它會把數(shù)據(jù)寫入FIFO。
寫操作結(jié)束后,寫指針自動加一;在另一端,有一個讀指針始終指向FIFO中的當前數(shù)據(jù)。如果關(guān)閉了接收FIFO,所有的狀態(tài)標志會被清除,讀寫指針也被復(fù)位。在接收到數(shù)據(jù)時數(shù)據(jù)通道子單元設(shè)置RXACT。
下表列出了接收FIFO的狀態(tài)標志。通過32個連續(xù)的地址可以訪問接收FIFO。
2.數(shù)據(jù)通道狀態(tài)機(DPSM)
根據(jù)傳輸?shù)姆较?發(fā)送或接收),使能時數(shù)據(jù)通道狀態(tài)機(DPSM)將進入Wait_S或Wait_R狀態(tài):
● 發(fā)送:DPSM進入Wait_S狀態(tài)。如果發(fā)送FIFO中有數(shù)據(jù),則DPSM進入發(fā)送狀態(tài),同時數(shù)據(jù)通道子單元開始向卡發(fā)送數(shù)據(jù)。
接收:DPSM進入Wait_R狀態(tài)并等待開始位;當收到開始位時,DPSM進入接收狀態(tài),同時數(shù)據(jù)通道子單元開始從卡接收數(shù)據(jù)
DPSM工作在SDIO_CK頻率,卡總線信號與SDIO_CK的上升沿同步。DPSM有6個狀態(tài)(這下有的看了),如下圖所示:
數(shù)據(jù)控制寄存器
● 空閑(Idle):數(shù)據(jù)通道不工作,SDIO_D[7:0]輸出處于高阻狀態(tài)。當寫入數(shù)據(jù)控制寄存器并設(shè)置使能位時,DPSM為數(shù)據(jù)計數(shù)器加載新的數(shù)值,并依據(jù)數(shù)據(jù)方向位進入Wait_S或Wait_R狀態(tài)。
● Wait_R:如果數(shù)據(jù)計數(shù)器等于0,當接收FIFO為空時DPSM進入到空閑(Idle)狀態(tài)。如果數(shù)據(jù)計數(shù)器不等于0,DPSM等待SDIO_D上的開始位。如果DPSM在超時之前接收到一個開始位,它會進入接收(Receive)狀態(tài)并加載數(shù)據(jù)塊計數(shù)器。如果DPSM在檢測到一個開始位前出現(xiàn)超時,或發(fā)生開始位錯誤,DPSM將進入空閑狀態(tài)并設(shè)置超時狀態(tài)標志。
下面數(shù)據(jù)長度寄存器與數(shù)據(jù)計數(shù)寄存器詳情看圖就不在贅述了,關(guān)于這些寄存器會在最后的結(jié)構(gòu)章節(jié)詳細講解。
● 接收(Receive):接收到的串行數(shù)據(jù)被組合為字節(jié)并寫入數(shù)FIFO。根據(jù)數(shù)據(jù)控制寄存器中傳輸模式位的設(shè)置,數(shù)據(jù)傳輸模式可以是塊傳輸或流傳輸:
─ 在數(shù)據(jù)塊傳輸模式下,當數(shù)據(jù)塊計數(shù)器達到0時,DPSM等待接收CRC碼,如果接收到的代碼與內(nèi)部產(chǎn)生的CRC碼匹配,則DPSM進入Wait_R狀態(tài),否則設(shè)置CRC失敗狀態(tài)標志同時DPSM進入到空閑狀態(tài)。
● Wait_S:如果數(shù)據(jù)計數(shù)器為0,DPSM進入空閑狀態(tài);否則DPSM等待數(shù)據(jù)FIFO空標志消失后,進入發(fā)送狀態(tài)
● 發(fā)送(Send):DPSM開始發(fā)送數(shù)據(jù)到卡設(shè)備。根據(jù)數(shù)據(jù)控制寄存器中傳輸模式位的設(shè)置,數(shù)據(jù)傳輸模式可以是塊傳輸或流傳輸:
─ 在塊模式下,當數(shù)據(jù)塊計數(shù)器達到0時,DPSM發(fā)送內(nèi)部產(chǎn)生的CRC碼,然后是結(jié)束位,并進入繁忙狀態(tài)
● 繁忙(Busy):DPSM等待CRC狀態(tài)標志:
─ 如果沒有接收到正確的CRC狀態(tài),則DPSM進入空閑狀態(tài)并設(shè)置CRC失敗狀態(tài)標志。
─ 如果接收到正確的CRC狀態(tài),則當SDIO_D0不為低時(SD卡不繁忙)DPSM進入Wait_S狀態(tài)。(一般情況)
當DPSM處于繁忙狀態(tài)時發(fā)生了超時,DPSM則設(shè)置數(shù)據(jù)超時標志并進入空閑狀態(tài)。
當DPSM處于Wait_R或繁忙狀態(tài)時,數(shù)據(jù)定時器被使能,并能夠產(chǎn)生數(shù)據(jù)超時錯誤:
─ 發(fā)送數(shù)據(jù)時,如果DPSM處于繁忙狀態(tài)超過程序設(shè)置的超時間隔,則產(chǎn)生超時。
─ 接收數(shù)據(jù)時,如果未收完所有數(shù)據(jù),并且DPSM處于Wait_R狀態(tài)超過程序設(shè)置的超時間隔,則產(chǎn)生超時
數(shù)據(jù)可以從主機傳送到卡,也可以反向傳輸。數(shù)據(jù)在數(shù)據(jù)線上傳輸。數(shù)據(jù)存儲在一個32字的FIFO中,每個字為32位寬,SD卡可以拉低SDIO_D0數(shù)據(jù)線表示卡正在忙碌.
最后反正數(shù)據(jù)傳輸中的狀態(tài)怎么復(fù)雜,其實數(shù)據(jù)通道狀態(tài)機(DPSM)會幫我們處理好這些狀態(tài)的轉(zhuǎn)換,我們只需要準備好發(fā)送和接收數(shù)據(jù)就好了
實在理不清清楚就了解一下,大概知道用那些寄存器位控制。
五.命令與響應(yīng)
SD 命令由主機發(fā)出,以廣播命令和尋址命令為例,廣播命令是針對與 SD 主機總線連接的所有從設(shè)備(SD卡)發(fā)送的,尋址命令是指定某個地址設(shè)備進行命令傳輸。
1.命令格式
SD 命令格式固定為 48bit,都是通過 CMD 線連續(xù)傳輸?shù)模〝?shù)據(jù)線不參與)
1.起始位和終止位:命令的主體包含在起始位與終止位之間,它們都只包含一個數(shù)據(jù)位,起始位為 0,終止位為 1。
2.傳輸標志:用于區(qū)分傳輸方向,該位為 1 時表示命令,方向為主機傳輸?shù)?SD 卡,該位為 0 時表示響應(yīng),方向為 SD 卡傳輸?shù)街鳈C。
3.命令主體內(nèi)容包括命令、地址信息/參數(shù)和 CRC 校驗三個部分。
命令號:它固定占用 6bit,所以總共有 64 個命令(代號:CMD0~CMD63),每個命令都有特定的用途,部分命令不適用于 SD 卡操作,只是專門用于 MMC 卡或者SD I/O 卡。(有些命令具有參數(shù)有些命令沒有參數(shù))
地址/參數(shù):每個命令有 32bit 地址信息/參數(shù)用于命令附加內(nèi)容,例如,廣播命令沒有地址信息,這 32bit 用于指定參數(shù),而尋址命令這 32bit 用于指定目標 SD 卡的地址。
CRC7 校驗:長度為 7bit 的校驗位用于驗證命令傳輸內(nèi)容正確性,如果發(fā)生外部干擾導(dǎo)致傳輸數(shù)據(jù)個別位狀態(tài)改變將導(dǎo)致校準失敗,也意味著命令傳輸失敗,SD卡不執(zhí)行命令。
2.命令類型
SD 命令有 4 種類型:
1.廣播命令(bc),無響應(yīng) — 廣播命令只有當所有的 CMD 線都一起連到主機上時才會用。如果是分開的,那么每張卡單獨處理命令。
2.廣播命令,帶響應(yīng)(bcr) — 所有卡同時響應(yīng),既然 SD 卡沒有開漏模式,這種命令應(yīng)該是所有的命令線都是分開的,命令也會每張卡分開接收和響應(yīng)。
3.尋址命令(ac,點對點) — 沒有數(shù)據(jù)在 DAT 線上
4.尋址數(shù)據(jù)傳輸命令(adtc) — 有數(shù)據(jù)在 DAT 線上
所有命令和響應(yīng)都是通過 SD 卡的 CMD 線發(fā)送的。命令的發(fā)送總是從最左邊的那一位開始
另外,SD 卡主機模塊系統(tǒng)旨在為各種應(yīng)用程序類型提供一個標準接口。在此環(huán)境中,需要有特定的客戶/應(yīng)用程序功能。為實現(xiàn)這些功能,在標準中定義了兩種類型的通用命令:
特定應(yīng)用命令(ACMD)和常規(guī)命令(GEN_CMD)。要使用 SD 卡制造商特定的 ACMD 命令如ACMD6,需要在發(fā)送該命令之前無發(fā)送 CMD55 命令,告知 SD 卡接下來的命令為特定應(yīng)用命令(因為特定應(yīng)用命令A(yù)CMD6與CMD6都表示為 000110 所以要區(qū)別的話發(fā)送特定命令之前先發(fā)送CMD55表示后面的 000110 表示ACMD6 )。
CMD55 命令只對緊接的第一個命令有效,SD 卡如果檢測到 CMD55 之后的第一條命令為 ACMD 則執(zhí)行其特定應(yīng)用功能,如果檢測發(fā)現(xiàn)不是 ACMD 命令,則執(zhí)行標準命令。
3.命令描述
反正下面的命名基本上用的到,這里記也記不住,先熟悉一下,后面講SD卡識別模式,SD傳輸模式,以及后面寫代碼的時候,用到的命令在提及。
4.響應(yīng)類型
命令寄存器包含命令索引(發(fā)至卡的6位)和命令類型;命令本身決定了是否需要響應(yīng)和響應(yīng)的類型、48位還是136位。
應(yīng)由 SD 卡向主機發(fā)出,部分命令要求 SD 卡作出響應(yīng),這些響應(yīng)多用于反饋 SD 卡的狀態(tài)。SDIO 總共有 7 個響應(yīng)類型(代號:R1~R7),其中 SD 卡沒有 R4、R5 類型響應(yīng)。特定的命令對應(yīng)有特定的響應(yīng)類型,比如當主機發(fā)送 CMD3 命令時,可以得到響應(yīng) R6。與命令一樣,SD 卡的響應(yīng)也是通過 CMD 線連續(xù)傳輸?shù)?。根?jù)響應(yīng)內(nèi)容大小可以分為短響應(yīng)和長響應(yīng)。短響應(yīng)是 48bit 長度,只有 R2 類型是長響應(yīng),其長度為 136bit。
R1(正常命令響應(yīng))
長度 48bit。bit [45:40]代表響應(yīng)的命令號(什么命令造成的響應(yīng))??ǖ臓顟B(tài)存儲在 bit [39:8]。很多命令基本是R1類型的響應(yīng)。
R1b響應(yīng):
R1b 就是 R1 響應(yīng)命令,同時數(shù)據(jù)線上有busy信號(SDIO_D0被拉低)。卡在收到這些命令后可能會變?yōu)閎usy。主機應(yīng)該在響應(yīng)中檢查 busy。
R2(CID,CSD 寄存器)長響應(yīng)
長度為 136bit。CID 寄存器的內(nèi)容作為 CMD2 和 CMD10 的響應(yīng)發(fā)送。CSD 寄存器的內(nèi)容作為 CMD9 的響應(yīng)發(fā)送。只傳輸 CID 和 CSD 寄存器的[127:1]位,這些寄存器的第[0]位被響應(yīng)的結(jié)束位替代了
R3(OCR 寄存器
長度 48bit,OCR 寄存器的值作為 ACMD41 的響應(yīng)發(fā)送
5 R6(發(fā)布的 RCA 寄存器響應(yīng))
長度 48bit。[45:40]是響應(yīng)的命令號,這里就是‘000011’,即 CMD3。參數(shù)中的 16 位MSB 用于產(chǎn)生 RCA 號
R7(卡接口條件)
長度 48bit??ㄖС值碾妷盒畔⑼ㄟ^ CMD8 的響應(yīng)發(fā)送。Bit[19:16]表明卡支持的電壓范圍。卡接受提供的電壓范圍就返回 R7 響應(yīng)??〞陧憫?yīng)的參數(shù)中返回電壓范圍和檢查模式。
總結(jié):
1.命令本身決定了是否需要響應(yīng)和響應(yīng)的類型
2.響應(yīng)中除了 R3 類型之外,其他響應(yīng)都使用 CRC7 校驗來校驗,對于 R2 類型是使用 CID 和CSD 寄存器內(nèi)部 CRC7(如果響應(yīng)不包含CRC(如CMD1的響應(yīng)),設(shè)備驅(qū)動應(yīng)該忽略CRC失敗狀態(tài))。
3.有些響應(yīng)不一定返回命令號
六.SD卡/SD NAND功能描述(重重點)
SD 卡系統(tǒng)定義了兩種操作模式:
● 卡識別模式
在復(fù)位后,查找總線上的新卡的時候,主機會處于“卡識別模式”。卡在復(fù)位后會處于識別模式,直到收到 SEND_RCA(CMD3)命令.
● 數(shù)據(jù)傳輸模式
當 RCA (相當于SD卡的ID號)第一次發(fā)布后,卡會處于“數(shù)據(jù)傳輸模式”。主機會在總線上所有的卡都被識別后進入這個模式
上面看不懂不要緊,接著往下看
1.操作條件確認
在主機和卡交互之初,主機可能不知道卡支持的電壓,卡也可能不知道是否支持當前的電壓。主機會先假設(shè) SD 卡支持某個電壓,并以這個電壓發(fā)送一個復(fù)位命令 CMD0。為了驗證電壓,“Physical Layer Specification V2.0”又定義了一個新的命令 CMD8。
CMD8(發(fā)送接口條件命令)是用來依照 SD2.0 標準初始化 SD 卡的。CMD8 要在 SD 卡處于“idle”狀態(tài)下使用。
此命令有兩個功能:
1.電壓檢測:
檢測卡是否能在主機提供的電壓下工作。
2.使能已存在命令的擴展和響應(yīng):
恢復(fù) CMD8 就能夠通過從定義之前預(yù)留的 bit,為一些已存在的命令擴展新的功能。
當卡在“idle”狀態(tài)時,主機應(yīng)該先發(fā)送 CMD8,再發(fā)送 ACMD41。參數(shù)中“電壓支持”bit 被設(shè)置為主機支持的電壓,而“檢測模式”bit 被設(shè)置為任意的 8bit 模式(推薦使用‘10101010b) b代表位的意思。
①:這里是卡實際返回的內(nèi)容(響應(yīng)傳輸中不包含錯誤)
②:匹配意思是同時滿足下面的 a)和 b)。不匹配是其他情況。
a) VHS(支持的電壓)中只有 1 個 bit 被設(shè)置了
b)卡支持主機提供的電壓
CMD8用于驗證 SD 卡接口操作條件。SD卡會通過分析 CMD8 的參數(shù)來檢測操作條件的正確性,而主機會通過分析 CMD8 的響應(yīng)來檢查正確性,支持的電壓是由參數(shù)里的 VHS 區(qū)指定的。SD卡會假設(shè) VHS 里面指定的電壓是當前支持的電壓。每一次命令VHS 里面只有 1 位能被設(shè)置為 1。主機會通過 CRC 和檢查模式來確認通信的有效性。
如果卡能夠在支持電壓下操作,響應(yīng)會傳回命令參數(shù)里設(shè)置的支持的電壓和檢測模式。
如果卡不能在支持電壓下操作,就不會發(fā)送響應(yīng),并保持在“空閑(idle)”狀態(tài)。
強制要求:
在發(fā)送第一個 ACMD41 之前要先發(fā)送 CMD8,以便初始化高容量 SD 卡。SD 卡如果收到 CMD8,就會知道主機支持 V2.0,就可以使能新的功能。
總結(jié)一句話:CMD8用來識別不同版本的卡和檢測卡是否能在主機提供的電壓下工作。
如果發(fā)送CMD8無響應(yīng):
1.電壓不匹配的 2.0 以上 SD 卡
2.1.0 的 SD 卡
3.不是 SD 卡
如果發(fā)送CMD8有響應(yīng):
電壓匹配的 2.0 以上 SD 卡(就是我們即將要使用的SD卡)
ACMD41是用來提供給主機一種機制來識別和拒絕那些不匹配它期望的 VDD 范圍的卡,主機通過發(fā)送需求的 VDD 電壓范圍來完成這個命令,這個范圍作為命令的參數(shù)。不能支持指定電壓范圍的卡應(yīng)該自動放棄后續(xù)的總線操作,并且進入無效狀態(tài)。OCR 寄存器里面的標準應(yīng)該響應(yīng)的定義。
注意:ACMD41 是應(yīng)用特定命令,在發(fā)送 ACMD41 之前需要發(fā)送CMD55。
2.卡識別模式
在卡識別模式,主機復(fù)位所有的卡、檢測操作電壓范圍、識別卡并為總線上每個卡設(shè)置相對地址(RCA(Relative Card Address):靠這個地址確認與主機與哪個SD卡通信)。在卡識別模式下,所有數(shù)據(jù)通信只使用命令信號線(CMD)。
在卡識別過程中,卡應(yīng)該在識別時鐘頻率 FOD (400KHZ)下的 SD 時鐘頻率中工作,在數(shù)據(jù)傳輸模式時鐘頻率為Fpp(最大25MHZ),所以在卡識別模式完成之后進入數(shù)據(jù)傳輸模式需要轉(zhuǎn)換頻率。
在卡識別模式期間,主機應(yīng)該保持在 Fod 頻率,因為某些卡可能在卡識別模式中有頻率限制。在數(shù)據(jù)傳輸模式,主機可以在 Fpp 頻率范圍操作卡
卡會檢查自己能不能在主機提供的電壓下工作。如果能夠,就會返回 R7 響應(yīng)。響應(yīng)參數(shù)中卡反饋了電壓范圍和檢測模式設(shè)置。
SD_SEND_OP_COND(ACMD41)作為開始,通過設(shè)置操作條件和 OCR 的 HCS 位來進行。
HCS(HighCapacity Support)位為 1,表示主機支持高容量 SD 卡。
HCS(HighCapacity Support)位為 0,表示主機不支持高容量 SD 卡。
HCS 會被不回應(yīng) CMD8 的卡忽視掉。然而,如果卡不回應(yīng) CMD8,主機應(yīng)該設(shè)置 HCS 為 0。標準容量卡會忽略 HCS。如果 HCS 設(shè)置為 0,那么高容量 SD 卡永遠都不會返回 ready 狀態(tài)(保持 busy 位為 0)。
卡通過 OCR 的 busy 位來通知主機 ACMD41 的初始化完成了。
設(shè)置 busy 位為 0 表示卡仍然在初始化。
設(shè)置 busy 位為 1,表示已經(jīng)完成初始化。主機會重復(fù)發(fā)送 ACMD41,直到 busy 為被設(shè)置
R3作為ACMD41命令的響應(yīng)返回,OCR寄存器的值
OCR 寄存器
32 位的操作條件寄存器(OCR)存儲了卡的 VDD 電壓描述。另外,還包括了狀態(tài)信息位。如果卡的上電程序完成,一個狀態(tài)位會被設(shè)置。寄存器還包括另一個狀態(tài)位,在設(shè)置上電狀態(tài)位后,用來表明卡的容量狀態(tài)。
Bit31(busy位) – 卡上電狀態(tài)位,這個狀態(tài)位在卡的上電流程完成后設(shè)置。
Bit30(CCS位) – 卡容量狀態(tài)位,如果是高容量卡,設(shè)置為 1,如果是標準卡,設(shè)置為 0。
卡容量狀態(tài)位只有在上電流程完成,且 Bit31 設(shè)置為 1 之后才有效。
主機可以讀取這個狀態(tài)位來判斷卡的種類。
如果卡響應(yīng)了 CMD8,那么 ACMD41 的響應(yīng)就包括了 CCS 字段信息。當卡返回“ready”的時候,CCS 是有效的(busy 位設(shè)置為 1)。
CCS=1 表示卡是高容量 SD 卡;CCS=0 表示卡是普通 SD 卡
總結(jié):ACMD41命令,是用來SD卡的工作電壓是否匹配,確定SD的容量(是標準卡還是高容量的卡)。
在系統(tǒng)中,主機遵照相同的初始化順序來初始化所有的新卡。不兼容的卡會進入“Inactive(無效)”狀態(tài)。
主機接著就會發(fā)送命令 CMD2給每一個卡,來得到他們的 CID 號,未識別的卡(處于 Ready 狀態(tài)的)發(fā)送自己的 CID 作為響應(yīng)。當卡發(fā)送了 CID 之后,它就進入“Identification(識別狀態(tài))”狀態(tài)。
之后主機發(fā)送CMD3命令,通知卡發(fā)布一個新的相對地址(RCA),這個地址比 CID 短,用于作為將來數(shù)據(jù)傳輸模式的地址。一旦收到 RCA,卡就會變?yōu)椤癝tand-by(待機狀態(tài))”狀態(tài)。
這時,如果主機想要分配另一個 RCA 號,它可以再發(fā)送一個 CMD3,通知卡重新發(fā)布一個 RCA 號。最后一個產(chǎn)生的 RCA 才是有效的。
卡識別模式流程圖(重點重點)
一定一定要結(jié)合圖去理解上面的文字敘述,卡的識別過程就豁然開朗了
3.數(shù)據(jù)傳輸模式
在卡識別模式期間,主機應(yīng)該保持在 Fod (400KHZ)頻率,因為某些卡可能在卡識別模式中有頻率限制。在數(shù)據(jù)傳輸模式,主機可以在 Fpp (最高25MHZ)頻率范圍操作卡
主機發(fā)送命令CMD9來獲得“SD卡具體數(shù)據(jù)(Card Specific Data)”,比如“塊長度”,“存儲容量”數(shù)據(jù)傳輸模式所有狀態(tài)等(這些數(shù)據(jù)會用于后面對SD卡的讀寫操作)。
廣播命令 CMD4會配置所有已識別卡的驅(qū)動范圍(電壓)。它會根據(jù)應(yīng)用總線布局(長度)、總線上卡的數(shù)量以及數(shù)據(jù)傳輸頻率來配置它們的 DSR 寄存器。
CMD7 的作用是選擇一張SD卡,然后把它從卡識別模式切換到數(shù)據(jù)傳輸模式,每次只能有一張卡處于傳輸模式,如果一張?zhí)幱趥鬏斈J降腟D卡同主機的連接被釋放,那么它會回到“Stand-by(待機)”狀態(tài)。當 CMD7 帶著參數(shù)RCA=0x0000 發(fā)送的時候,所有的卡都會回到“Stand-by(待機)狀態(tài)。
主機讀數(shù)據(jù)(SD卡處于發(fā)送數(shù)據(jù)狀態(tài))
所有數(shù)據(jù)讀命令可以在任何情況下通過停止命令(CMD12)來中止。數(shù)據(jù)傳輸會中止,卡會回到傳輸狀態(tài)。讀命令有:塊讀(CMD17),多塊讀(CMD18),發(fā)送寫保護(CMD30),發(fā)送SCR(ACMD51)以及讀模式的通用命令(CMD56)
一般就用CMD17塊讀,多塊讀(CMD18)
主機寫數(shù)據(jù)(SD卡處于接收數(shù)據(jù)狀態(tài))
所有數(shù)據(jù)寫命令同樣也可以通過 CMD12 來中止。在發(fā)送 CMD7 取消選定卡之前,應(yīng)該先停止寫命令。寫命令有:塊寫(CMD24,CMD25),編程 CSD(CMD27),鎖定/解鎖命令(CMD42)。
CMD24:
1.對于標準卡寫入寫入 SEL_BLOCK_LEN長度字節(jié)的塊。
2.對于 SDHC卡(高容量SD卡>2GB),寫入512 字節(jié)的塊。
CMD25:
連續(xù)寫入數(shù)據(jù),直到被CMD12命令打斷。
● 一旦數(shù)據(jù)傳輸完成,卡會退出寫狀態(tài),并且進入編程狀態(tài)(傳輸成功)或者傳輸狀態(tài)(傳輸失敗)
卡可能會提供緩存給“塊寫”:這就意味著當前一個塊正在處理的時候,就可以發(fā)送后一個塊了。如果緩存都慢了,那么卡就會處于編程狀態(tài)則SDIO_D0會被拉低(表示busy)
擦除SD卡數(shù)據(jù)
擦除命令有三條:
CMD32:設(shè)置擦除的起始地址
CMD33:設(shè)置擦除的結(jié)束地址
CMD38:開始擦除
擦除數(shù)據(jù),相當于將要擦除的區(qū)域的位都設(shè)置為1,擦除過程中,SD卡也將處于編程狀態(tài):SDIO_D0會被拉低(表示busy)
● 將另一張卡從 Stand-by (待機)模式轉(zhuǎn)換到 Transfer (傳輸)模式(CMD7)不會終止擦除和編程操作。正在操作的SD卡會切換到 Disconnect 狀態(tài)并且釋放 SDIO_D0線。
● 處于 Disconnect 狀態(tài)的卡可以通過 CMD7 的命令重新被選定。這時,卡會進入Programming 模式,并且重新使能 busy 。
復(fù)位卡(CMD0 或者 CMD15)會中止任何等候或者執(zhí)行的編程操作。這可能會損壞卡的內(nèi)容(但是盡量不要怎么做)。
總結(jié)
至此整個數(shù)據(jù)傳輸流程就全部講完,到這里肯定要心中有點數(shù)了,其實后面的代碼:卡的識別模式與數(shù)據(jù)傳輸模式 代碼實現(xiàn)完完全全是按照上述流程來編寫的。
【本文轉(zhuǎn)載自CSDN,作者:rivencode】
-
芯片
+關(guān)注
關(guān)注
456文章
51154瀏覽量
426212 -
SD卡
+關(guān)注
關(guān)注
2文章
566瀏覽量
64045 -
存儲芯片
+關(guān)注
關(guān)注
11文章
901瀏覽量
43231 -
TF卡
+關(guān)注
關(guān)注
2文章
81瀏覽量
12200
發(fā)布評論請先 登錄
相關(guān)推薦
評論