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