国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32——SDIO的學習(驅(qū)動SD卡)(理論篇)

這篇具有很好參考價值的文章主要介紹了STM32——SDIO的學習(驅(qū)動SD卡)(理論篇)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一、SD卡簡介

1.1歷史

1.2 tf卡和SD卡的區(qū)別

1.3 mmc,emmc,nand,flash的關系

1.4 SD卡的規(guī)格等級

1.4.1按容量分

1.4.2 class等級

1.4.3 UHS總線模式

1.4.4 UHS速度等級

1.4.5 VSC視頻速度等級

二、SD卡的內(nèi)部結(jié)構(gòu)

三、SDIO的學習

3.1 SDIO的主要功能

3.2 SDIO總線拓撲

?3.3 SDIO功能描述?

3.3.1 SDIO適配器

3.3.2 SDIO AHB接口

3.4卡功能描述

3.4.1卡識別模式

3.4.2 卡復位

3.4.3 操作電壓范圍確認

3.4.4 卡識別過程

3.4.5 寫數(shù)據(jù)塊

3.4.6 讀數(shù)據(jù)塊

3.4.7 數(shù)據(jù)流操作,數(shù)據(jù)流寫入和數(shù)據(jù)流讀出(只適用于多媒體卡)

3.4.8?擦除:成組擦除和扇區(qū)擦除

3.4.9 寬總線選擇和解除選擇

3.4.10 保護管理

3.4.10 卡狀態(tài)寄存器

3.4.12 SD狀態(tài)寄存器

3.4 13 SD的I/O模式

3.4.14 命令與響應

3.5 響應格式

3.5.1 R1(普通響應命令)

3.5.2 R1b

3.5.3 R2(CID、 CSD寄存器)

3.5.4 R3(OCR寄存器)

3.5.5 R4(快速I/O)

3.5.6 R4b

3.5.7?R5(中斷請求)

3.5.8 R6(中斷請求)

3.6 SDIO I/O卡特定的操作

3.6.1 使用SDIO_D2 信號線的SDIO I/O讀等待操作

3.6.2 使用停止SDIO_CK的SDIO讀等待操作

3.6.3 SDIO暫停/恢復操作

3.6.4 SDIO中斷

3.7 CE-ATA特定操作

3.7.1 命令完成指示關閉

3.7.2 命令完成指示使能

3.7.3 CE-ATA中斷

3.7.4 中止CMD61

3.8 硬件流控制


參考:

SD卡_百度百科

eMMC_百度百科

MMC(影院)_百度百科

MMC是什么-太平洋IT百科

Nand flash_百度百科

SD卡規(guī)格等級區(qū)別總結(jié) - 知乎

《STM32中文參考手冊》

《ARM?cortex-M3權(quán)威指南》

《SD Card Specification(V1.0)》

一、SD卡簡介

1.1歷史

????????MMC(Multi-Media Card,多媒體卡)由西門子公司Siemens和SanDisk于1997年推出。由于它的封裝技術較為先進,7針引腳,體積小、重量輕、非常符合移動存儲的需要。MMC支持1bit模式,20MHz時鐘,采用總線結(jié)構(gòu)。?

????????MMC卡在SM卡基礎上誕生替代了東芝開發(fā)的SM卡。不久的幾年后,在MMC卡基礎上研發(fā)的SD卡又替代了MMC卡,成為了幾乎一切便攜式數(shù)碼產(chǎn)品的存儲卡格式。?

sdio,STM32,嵌入式,單片機,stm32,SDIO

SD卡結(jié)構(gòu)

????????SD卡是由松下電器、東芝和SanDisk聯(lián)合推出,1999年8月發(fā)布。SD卡的數(shù)據(jù)傳送和物理規(guī)范由MMC發(fā)展而來,大小和MMC卡差不多,尺寸為32mmx24mmx2.1mm。長寬和MMC卡一樣,只是比MMC卡厚了0.7mm,以容納更大容量的存貯單元。與MMC卡保持著向上的兼容,MMC卡可以被新的SD設備存取,兼容性則取決于應用軟件,但SD卡卻不可以被MMC設備存取。(SD卡外型采用了與MMC卡厚度一樣的導軌式設計,以使SD設備可以適合MMC卡)。

?????????SD卡是東芝在MMC卡技術中加入加密技術硬件而成,由于MMC卡可能會較易讓使用者復制數(shù)碼音樂,東芝便加入這些技術希望令音樂業(yè)界安心。類似的技術包括索尼的MagicGate,理論上加密技術可引入一些數(shù)碼版權(quán)管理措施,但這功能甚少被應用。

????????SD系列記憶卡都是SanDisk完成測試后送交SD卡協(xié)會認證規(guī)格,因此幾乎所有專利權(quán)都掌控在SanDisk手上。不過在2007年,因為NAND市場的動蕩SanDisk變賣了家當,給外界一種即將消失錯覺。失去了很多自己的核心技術和專利,最重要的NAND工廠都賣給了美光。沒多久,重新吸引外資換了臉面的SanDisk,無心再研發(fā)Flash技術和建立新廠。而是注資東芝與東芝合作,使用東芝的制造工藝和技術生產(chǎn)芯片。之后東芝試產(chǎn)的新產(chǎn)品都會有兩個品牌的LOGO。SD卡也不例外,兩個品牌的產(chǎn)品擁有著很多相似之處,這兩個牌子也是SD卡市場的主要供貨來源。

????????希望未來可以有國產(chǎn)的規(guī)則,而不用在去遵守他們的規(guī)則。

1.2 tf卡和SD卡的區(qū)別

sdio,STM32,嵌入式,單片機,stm32,SDIO

?

????????1、定義不同。SD卡是一個完全開放的標準(系統(tǒng)),多用于MP3、數(shù)碼攝像機、數(shù)碼相機、電子圖書、AV器材等等TF卡又稱microSD,是一種極細小的快閃存儲器卡,由著名的存儲廠商閃迪(SanDisk)公司發(fā)明創(chuàng)立。
????????2、外觀大小不同。TF卡又稱T-Flash卡,全名: TransFLash,又名:MicroSD,由摩托羅拉與SANDISK共同研發(fā),是目前一種超小型微型卡,其大小僅為11x15x1MM,約為SD卡的1/4。
????????3、產(chǎn)品不同。目前基本所有的手機都使用的是TF卡,這主要是由于TF卡體積更小,更利于節(jié)省空間,而一般傳統(tǒng)的SD卡則主要用于用于MP3、數(shù)碼攝像機、數(shù)碼相機、電子圖書、AV器材等,不過TF卡也可以安裝卡套充當SD卡來使用,SD卡由于體積較大,不能使用TF卡插槽。
????????4、適用范圍不同。TF卡是功能機必搭儲存卡,且體積極小,所以主要應用于手機。隨著TF卡存儲容量的提升,它也量慢開始在GPS設備、便攜式音樂播放器和一些閃存盤中得到使用。SD卡不僅體積小,而且數(shù)據(jù)傳輸速度快、可熱插拔,所以在便攜式裝置領域的應用比較廣泛。
????????5、安全性能不同。一般來說,市面上的SD卡在卡的側(cè)面會設置一個安全鎖定的讀寫保護開關,可以有效地保護SD卡中的各類數(shù)據(jù)和信息,防止誤刪,安全性好。而TF卡由于體積比較小,就不具備這個功能,相對來說安全性不如SD卡。
????????6、原理不同。TF卡全稱為Trans-flashCard,又稱MicroSD卡,是一種極細小的快閃存儲器卡,俗稱小卡。簡單來說可以看作是一種記憶卡,使用了相對來說比較新的NANDMLC技術。SD卡全稱為SecureDigitalMemoryCard,是一種基于半導體快閃記憶器的記憶設備,被發(fā)明出來的時間比較早,俗稱大卡,是一種發(fā)展時間比較久的內(nèi)存卡。

現(xiàn)在使用他們其實方法都是一樣的,只是他們的引腳數(shù)量和體積有所不同加上,大卡的安全性高點。

1.3 mmc,emmc,nand,flash的關系

????????核心都是flash,nand是一種flash,但是它的接口很惡心,所以在上面封裝了一下,出現(xiàn)了emmc接口標準,但是emmc不是單純的flash,他是有一塊關系閃存的IC在里面的,這倆加一起構(gòu)成了我們現(xiàn)在啟動單片機所選擇模式中的emmc模式。

? ? ? ? mmc和他們不同,是一種對卡形狀的規(guī)范。它規(guī)定了卡的形狀,尺寸和通信協(xié)議。

1.4 SD卡的規(guī)格等級

????????存儲卡有很多種類,CF卡、記憶棒、SD卡、XD卡、MMC卡、MS卡、TF卡、MicroSD卡等。平時最常見的有SD卡和MicroSD卡兩種, SD卡和MicroSD只是兩張卡的大小不同,規(guī)格版本是完全相同的,均由SD卡協(xié)會推出。

????????SD卡有不少規(guī)范,常用包含存儲空間和存儲速度兩種,廠商會把滿足的規(guī)范的圖標印在卡面上,所以通過卡上有的規(guī)格,就能很快判斷出這張卡的容量、類型和最低速度,甚至適用場景。這樣,在購買存儲卡時便能夠自己判斷出是否為自己需要的卡。MicroSD卡的規(guī)范和SD卡相同。

1.4.1按容量分

這幾種類別表示卡的容量大?。?/p>

sdio,STM32,嵌入式,單片機,stm32,SDIO

SD:早期版本現(xiàn)在已經(jīng)基本停用,最高容量2GB,分區(qū)格式為FAT12(FAT)或FAT16。

sdio,STM32,嵌入式,單片機,stm32,SDIO

SDHC:技術很成熟的種類,容量為4GB-32GB,分區(qū)格式為FAT32。

sdio,STM32,嵌入式,單片機,stm32,SDIO

SDXC:目前市場存儲卡的主流,容量為64GB-2TB,分區(qū)格式為exFAT。

sdio,STM32,嵌入式,單片機,stm32,SDIO

SDUC:新推出的版本,容量為2TB-128TB,分區(qū)格式為exFAT。

這些類別都是向下兼容的,例如使用SDXC的設備,一般也能使用SDHC。分類主要是因為使用的文件系統(tǒng)有區(qū)別。

1.4.2 class等級

存儲卡的Class等級主要是標識存儲卡的最低寫入速度,Class后面的數(shù)字就代表了存儲卡最低寫入速度:

sdio,STM32,嵌入式,單片機,stm32,SDIO

Class 2 2MB/s

sdio,STM32,嵌入式,單片機,stm32,SDIO

Class 4 4MB/s

sdio,STM32,嵌入式,單片機,stm32,SDIO

Class 6 6MB/s

sdio,STM32,嵌入式,單片機,stm32,SDIO

Class 10 10MB/s

存儲卡的“最低寫入速度”一般是最重要的,表示存儲卡穩(wěn)定使用的速度。Class等級越高傳輸速度越快,現(xiàn)在比較常見的都是速度最快的Class 10級別,簡稱C10。速度更低的C6、C4、C2的存儲卡早已退出市場。

1.4.3 UHS總線模式

UHS(Ultra High Speed)超高速等級為全新的總線模式,目前有UHS-I、UHS-II、UHS-III三個等級劃分,I的個數(shù)越多,接口支持的速度越高,目前UHS-III的存儲卡市場上很少見。

sdio,STM32,嵌入式,單片機,stm32,SDIO

支持UHS-I的SD卡最大讀取速度可達104MB/s

sdio,STM32,嵌入式,單片機,stm32,SDIO

支持UHS-II的SD卡最大讀取速度可達312MB/s

sdio,STM32,嵌入式,單片機,stm32,SDIO

支持UHS-III的SD卡最大讀取速度可達624MB/s

sdio,STM32,嵌入式,單片機,stm32,SDIO

SD Express I,最大讀取速度可達985MB/s

實現(xiàn)UHS標準傳輸速度需要設備支持,高版本向下兼容低版本,不支持該標準可以兼容降速為普通存儲卡使用。

1.4.4 UHS速度等級

UHS速度等級也是標識存儲卡的最低寫入速度,日常使用U1(最低寫入速度10M/S)和U3(最低寫入速度30M/S)的等級標識最低寫入速度。

sdio,STM32,嵌入式,單片機,stm32,SDIO

U1 10MB/s

sdio,STM32,嵌入式,單片機,stm32,SDIO

U3 30MB/s

UHS速度等級在存儲卡上的標志為字母U,中間包含等級的數(shù)字。此處的數(shù)字和UHS總線模式無關,即UHS-I的存儲卡,也能達到U3的速度等級。

1.4.5 VSC視頻速度等級

VSC(Video Speed Class)視頻速度等級,是SD協(xié)會針對視頻拍攝應用制定的視頻速度等級,以識別字母V加上最低寫入速度值的數(shù)字構(gòu)成標識。V后面的數(shù)字為幾,就代表最低寫入速度為多少,即:V10最低寫入速度10M/S;V30最低寫入速度30M/S。VSC視頻速度等級有如下幾種:

sdio,STM32,嵌入式,單片機,stm32,SDIO

V6 6MB/s

sdio,STM32,嵌入式,單片機,stm32,SDIO

V10 10MB/s

sdio,STM32,嵌入式,單片機,stm32,SDIO

V30 30MB/s

sdio,STM32,嵌入式,單片機,stm32,SDIO

V60 60MB/s

sdio,STM32,嵌入式,單片機,stm32,SDIO

V90 90MB/s

如果想支持拍攝4K高清視頻,一般需要V30或者V60等級的存儲卡。

二、SD卡的內(nèi)部結(jié)構(gòu)

sdio,STM32,嵌入式,單片機,stm32,SDIO

sdio,STM32,嵌入式,單片機,stm32,SDIOsdio,STM32,嵌入式,單片機,stm32,SDIO

上面兩圖描述了SDIO模式下的兩種存儲卡的接線

注意上下的圖片中的箭頭方向。

下面再看看SPI方式

sdio,STM32,嵌入式,單片機,stm32,SDIOsdio,STM32,嵌入式,單片機,stm32,SDIO

sdio,STM32,嵌入式,單片機,stm32,SDIO

sdio,STM32,嵌入式,單片機,stm32,SDIO?

后續(xù)我會錄制一個講解視頻的。

到時候放到評論區(qū)

三、SDIO的學習

3.1 SDIO的主要功能

????????SD/SDIO MMC卡主機模塊(SDIO)在AHB外設總線和多媒體卡(MMC)、SD存儲卡、SDIO卡和 CE-ATA設備間提供了操作接口。

???????? 多媒體卡系統(tǒng)規(guī)格書由MMCA技術委員會發(fā)布,可以在多媒體卡協(xié)會的網(wǎng)站上(www.mmca.org) 獲得。

????????CE-ATA系統(tǒng)規(guī)格書可以在CE-ATA工作組的網(wǎng)站上(www.ce-ata.org)獲得。

????????SDIO的主要功能如下:

● 與多媒體卡系統(tǒng)規(guī)格書版本4.2全兼容。支持三種不同的數(shù)據(jù)總線模式:1位(默認)、4位和8 位。

● 與較早的多媒體卡系統(tǒng)規(guī)格版本全兼容(向前兼容)。

● 與SD存儲卡規(guī)格版本2.0全兼容。

● 與SD I/O卡規(guī)格版本2.0全兼容:支持良種不同的數(shù)據(jù)總線模式:1位(默認)和4位。

● 完全支持CE-ATA功能(與CE-ATA數(shù)字協(xié)議版本1.1全兼容)。

● 8位總線模式下數(shù)據(jù)傳輸速率可達48MHz。

● 數(shù)據(jù)和命令輸出使能信號,用于控制外部雙向驅(qū)動器。

注:

1.SDIO沒有SPI兼容的通信模式

2.在多媒體卡系統(tǒng)規(guī)格書版本2.11中,定義SD存儲卡協(xié)議是多媒體卡協(xié)議的超集。只支持I/O 模式的SD卡或復合卡中的I/O部分不能支持SD存儲設備中很多需要的命令,這里有些命令在SD I/O設備中不起作用,如擦除命令,因此SDIO不支持這些命令。另外,SD存儲卡和SD I/O卡中 有些命令是不同的,SDIO也不支持這些命令。細節(jié)可以參考SD I/O卡規(guī)格書版本1.0。使用現(xiàn)有 的MMC命令機制,在MMC接口上可以實現(xiàn)CE-ATA的支持 。SDIO接口的電氣和信號定義詳見 MMC參考資料。 多媒體卡/SD總線將所有卡與控制器相連。 當前版本的SDIO在同一時間里只能支持一個SD/SDIO/MMC 4.2卡,但可以支持多個MMC版本 4.1或以前版本的卡。

3.2 SDIO總線拓撲

總線上的通信是通過傳送命令和數(shù)據(jù)實現(xiàn)。
在多媒體卡/SD/SD I/O總線上的基本操作是命令/響應結(jié)構(gòu),這樣的總線操作在命令或總線機制
下實現(xiàn)信息交換;另外,某些操作還具有數(shù)據(jù)令牌。
在SD/SDIO存儲器卡上傳送的數(shù)據(jù)是以數(shù)據(jù)塊的形式傳輸;在MMC上傳送的數(shù)據(jù)是以數(shù)據(jù)塊或
數(shù)據(jù)流的形式傳輸;在CE-ATA設備上傳送的數(shù)據(jù)也是以數(shù)據(jù)塊的形式傳輸。

sdio,STM32,嵌入式,單片機,stm32,SDIO

sdio,STM32,嵌入式,單片機,stm32,SDIOsdio,STM32,嵌入式,單片機,stm32,SDIO?注: 當有Busy(繁忙)信號時, SDIO(SDIO_D0被拉低)將不會發(fā)送任何數(shù)據(jù)

?sdio,STM32,嵌入式,單片機,stm32,SDIO

3.3 SDIO功能描述?

SDIO包含2個部分:
● SDIO適配器模塊:實現(xiàn)所有MMC/SD/SD I/O卡的相關功能,如時鐘的產(chǎn)生、命令和數(shù)據(jù)的
傳送。
● AHB總線接口:操作SDIO適配器模塊中的寄存器,并產(chǎn)生中斷和DMA請求信號。
?

?sdio,STM32,嵌入式,單片機,stm32,SDIO

復位后默認情況下SDIO_D0用于數(shù)據(jù)傳輸。初始化后主機可以改變數(shù)據(jù)總線的寬度。
如果一個多媒體卡接到了總線上,則SDIO_D0、 SDIO_D[3:0]或SDIO_D[7:0]可以用于數(shù)據(jù)傳
輸。 MMC版本V3.31和之前版本的協(xié)議只支持1位數(shù)據(jù)線,所以只能用SDIO_D0。
如 果 一 個 SD 或 SD I/O 卡 接 到 了 總 線 上 , 可 以 通 過 主 機 配 置 數(shù) 據(jù) 傳 輸 使 用 SDIO_D0 或
SDIO_D[3:0]。所有的數(shù)據(jù)線都工作在推挽模式。
SDIO_CMD有兩種操作模式:
● 用于初始化時的開路模式(僅用于MMC版本V3.31或之前版本)
● 用于命令傳輸?shù)耐仆炷J?SD/SD I/O卡和MMC V4.2在初始化時也使用推挽驅(qū)動)
SDIO_CK是卡的時鐘:每個時鐘周期在命令和數(shù)據(jù)線上傳輸1位命令或數(shù)據(jù)。對于多媒體卡
V3.31協(xié)議,時鐘頻率可以在0MHz至20MHz間變化;對于多媒體卡V4.0/4.2協(xié)議,時鐘頻率可
以在0MHz至48MHz間變化;對于SD或SD I/O卡,時鐘頻率可以在0MHz至25MHz間變化。
SDIO使用兩個時鐘信號:
● SDIO適配器時鐘(SDIOCLK=HCLK)
● AHB總線時鐘(HCLK/2)
下表適用于多媒體卡/SD/SD I/O卡總線:
sdio,STM32,嵌入式,單片機,stm32,SDIO?

3.3.1 SDIO適配器

sdio,STM32,嵌入式,單片機,stm32,SDIO?

SDIO適配器是多媒體/加密數(shù)字存儲卡總線的主設備(主機),用于連接一組多媒體卡或加密數(shù)字
存儲卡,它包含以下5個部分:
● 適配器寄存器模塊
● 控制單元
● 命令通道
● 數(shù)據(jù)通道
● 數(shù)據(jù)FIFO


注: 適配器寄存器和FIFO使用AHB總線一側(cè)的時鐘(HCLK/2),控制單元、命令通道和數(shù)據(jù)通道使用。


SDIO適配器一側(cè)的時鐘(SDIOCLK)。
適配器寄存器模塊
適配器寄存器模塊包含所有系統(tǒng)寄存器。該模塊還產(chǎn)生清除多媒體卡中靜態(tài)標記的信號,當在
SDIO清除寄存器中的相應位寫’1’時會產(chǎn)生清除信號。
控制單元
控制單元包含電源管理功能和為存儲器卡提供的時鐘分頻。
共有三種電源階段:
● 電源關閉
● 電源啟動
● 電源開
sdio,STM32,嵌入式,單片機,stm32,SDIO?上圖為控制單元的框圖,有電源管理和時鐘管理子單元。
在電源關閉和電源啟動階段,電源管理子單元會關閉卡總線上的輸出信號。
時鐘管理子單元產(chǎn)生和控制SDIO_CK信號。 SDIO_CK輸出可以使用時鐘分頻或時鐘旁路模式。
下述情況下沒有時鐘輸出:
● 復位后
● 在電源關閉和電源啟動階段
● 當啟動了省電模式并且卡總線處于空閑狀態(tài)(命令通道和數(shù)據(jù)通道子單元進入空閑階段后的8
個時鐘周期)
命令通道
命令通道單元向卡發(fā)送命令并從卡接收響應。

sdio,STM32,嵌入式,單片機,stm32,SDIO

● 命令通道狀態(tài)機(CPSM)
─ 當寫入命令寄存器并設置了使能位,開始發(fā)送命令。命令發(fā)送完成時,命令通道狀態(tài)機
(CPSM)設置狀態(tài)標志并在不需要響應時進入空閑狀態(tài)(見下圖)。當收到響應后,接收到
的CRC碼將會與內(nèi)部產(chǎn)生的CRC碼比較,然后設置相應的狀態(tài)標志。
sdio,STM32,嵌入式,單片機,stm32,SDIO?

????????當進入等待(Wait)狀態(tài)時,命令定時器開始運行;當CPSM進入接收(Receive)狀態(tài)之前,產(chǎn)生了超時,則設置超時標志并進入空閑(Idle)狀態(tài)。
: 命令超時固定為64個SDIO_CK時鐘周期。
????????如果在命令寄存器設置了中斷位,則關閉定時器, CPSM等待某一個卡發(fā)出的中斷請求。如果命令寄存器中設置掛起位, CPSM進入掛起(Pend)狀態(tài)并等待數(shù)據(jù)通道子單元發(fā)出的CmdPend
信號,在檢測到CmdPend信號時, CPSM進入發(fā)送(Send)狀態(tài),這將觸發(fā)數(shù)據(jù)計數(shù)器發(fā)送停止
命令的功能。
注: CPSM保持在空閑狀態(tài)至少8個SDIO_CK周期,以滿足NCC和NRC時序限制。 NCC是兩個主機命令間的最小間隔; NRC是主機命令與卡響應之間的最小間隔。

sdio,STM32,嵌入式,單片機,stm32,SDIO
?

● 命令格式

─ 命令:命令是用于開始一項操作。主機向一個指定的卡或所有的卡發(fā)出帶地址的命令或廣
播命令(廣播命令只適合于MMC V3.31或之前的版本)。命令在CMD線上串行傳送。所有
命令的長度固定為48位,下表給出了多媒體卡、 SD存儲卡和SDIO卡上一般的命令格式。
?

CE-ATA命令是MMC V4.2命令的擴充,所以具有相同的格式。

命令通道操作于半雙工模式,這樣命令和響應可以分別發(fā)送和接收。如果CPSM不處在發(fā)
送狀態(tài), SDIO_CMD輸出處于高阻狀態(tài),如圖189所示。 SDIO_CMD上的數(shù)據(jù)與
SDIO_CK的上升沿同步。

sdio,STM32,嵌入式,單片機,stm32,SDIO

響應:響應是由一個被指定地址的卡發(fā)送到主機,對于MMC V3.31或以前版本所有的卡
同時發(fā)送響應;響應是對先前接收到命令的一個應答。響應在CMD線上串行傳送。
SDIO支持2種響應類型, 2種類型都有CRC錯誤檢測:
● 48位短響應
● 136位長響應
注: 如果響應不包含CRC(如CMD1的響應),設備驅(qū)動應該忽略CRC失敗狀態(tài)

sdio,STM32,嵌入式,單片機,stm32,SDIO

命令寄存器包含命令索引(發(fā)至卡的6位)和命令類型;命令本身決定了是否需要響應和響應的類
型、 48位還是136位(見20.9.4節(jié))。命令通道中的狀態(tài)標志示于下表:
sdio,STM32,嵌入式,單片機,stm32,SDIO?CRC發(fā)生器計算CRC碼之前所有位的CRC校驗和,包括開始位、發(fā)送位、命令索引和命令參數(shù)
(或卡狀態(tài))。對于長響應格式, CRC校驗和計算的是CID或CSD的前120位;注意,長響應格式
中的開始位、傳輸位和6個保留位不參與CRC計算。
CRC校驗和是一個7位的數(shù)值:
CRC[6:0] = 余數(shù)[(M(x) * x7) / G(x)]
G(x) = x7 + x3 + 1
M(x) = (開始位) * x39 + … + (CRC前的最后一位) * x0, 或
M(x) = (開始位) * x119 + … + (CRC前的最后一位) * x0, 或
數(shù)據(jù)通道
數(shù)據(jù)通道子單元在主機與卡之間傳輸數(shù)據(jù)。下圖是數(shù)據(jù)通道的框圖

sdio,STM32,嵌入式,單片機,stm32,SDIO

在時鐘控制寄存器中可以配置卡的數(shù)據(jù)總線寬度。如果選擇了4位總線模式,則每個時鐘周期四
條數(shù)據(jù)信號線(SDIO_D[3:0])上將傳輸4位數(shù)據(jù);如果選擇了8位總線模式,則每個時鐘周期八條
數(shù)據(jù)信號線(SDIO_D[7:0])上將傳輸8位數(shù)據(jù);如果沒有選擇寬總線模式,則每個時鐘周期只在
SDIO_D0上傳輸1位數(shù)據(jù)。
根據(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ù)。
數(shù)據(jù)通道狀態(tài)機(DPSM)
DPSM工作在SDIO_CK頻率,卡總線信號與SDIO_CK的上升沿同步。 DPSM有6個狀態(tài),如下
圖所示
?sdio,STM32,嵌入式,單片機,stm32,SDIO

● 空閑(Idle):數(shù)據(jù)通道不工作, SDIO_D[7:0]輸出處于高阻狀態(tài)。當寫入數(shù)據(jù)控制寄存器并設
置使能位時, 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)并設置超時狀態(tài)標志。
● 接收(Receive):接收到的串行數(shù)據(jù)被組合為字節(jié)并寫入數(shù)據(jù)FIFO。根據(jù)數(shù)據(jù)控制寄存器中
傳輸模式位的設置,數(shù)據(jù)傳輸模式可以是塊傳輸或流傳輸:
─ 在塊模式下,當數(shù)據(jù)塊計數(shù)器達到0時, DPSM等待接收CRC碼,如果接收到的代碼與內(nèi)
部產(chǎn)生的CRC碼匹配,則DPSM進入Wait_R狀態(tài),否則設置CRC失敗狀態(tài)標志同時
DPSM進入到空閑狀態(tài)。
─ 在流模式下,當數(shù)據(jù)計數(shù)器不為0時, DPSM接收數(shù)據(jù);當計數(shù)器為0時,將移位寄存器中
的剩余數(shù)據(jù)寫入數(shù)據(jù)FIFO,同時DPSM進入Wait_R狀態(tài)。
如果產(chǎn)生了FIFO上溢錯誤, DPSM設置FIFO的錯誤標志并進入空閑狀態(tài)。
● Wait_S:如果數(shù)據(jù)計數(shù)器為0, DPSM進入空閑狀態(tài);否則DPSM等待數(shù)據(jù)FIFO空標志消失
后,進入發(fā)送狀態(tài)。
注: DPSM會在Wait_S狀態(tài)保持至少2個時鐘周期,以滿足NWR的時序要求, NWR是接收到卡的響應
至主機開始數(shù)據(jù)傳輸?shù)拈g隔。
● 發(fā)送(Send): DPSM開始發(fā)送數(shù)據(jù)到卡設備。根據(jù)數(shù)據(jù)控制寄存器中傳輸模式位的設置,數(shù)
據(jù)傳輸模式可以是塊傳輸或流傳輸:

在塊模式下,當數(shù)據(jù)塊計數(shù)器達到0時, DPSM發(fā)送內(nèi)部產(chǎn)生的CRC碼,然后是結(jié)束位,
并進入繁忙狀態(tài)。
在流模式下,當使能位為高同時數(shù)據(jù)計數(shù)器不為0時, DPSM向卡設備發(fā)送數(shù)據(jù),然后進
入空閑狀態(tài)。

如果產(chǎn)生了FIFO下溢錯誤, DPSM設置FIFO的錯誤標志并進入空閑狀態(tài)。
● 繁忙(Busy): DPSM等待CRC狀態(tài)標志:


如果沒有接收到正確的CRC狀態(tài),則DPSM進入空閑狀態(tài)并設置CRC失敗狀態(tài)標志。
如果接收到正確的CRC狀態(tài),則當SDIO_D0不為低時(卡不繁忙)DPSM進入Wait_S狀
態(tài)。

當DPSM處于繁忙狀態(tài)時發(fā)生了超時, DPSM則設置數(shù)據(jù)超時標志并進入空閑狀態(tài)。
當DPSM處于Wait_R或繁忙狀態(tài)時,數(shù)據(jù)定時器被使能,并能夠產(chǎn)生數(shù)據(jù)超時錯誤:
─ 發(fā)送數(shù)據(jù)時,如果DPSM處于繁忙狀態(tài)超過程序設置的超時間隔,則產(chǎn)生超時。

接收數(shù)據(jù)時,如果未收完所有數(shù)據(jù),并且DPSM處于Wait_R狀態(tài)超過程序設置的超時間
隔,則產(chǎn)生超時。

● 數(shù)據(jù):數(shù)據(jù)可以從主機傳送到卡,也可以反向傳輸。數(shù)據(jù)在數(shù)據(jù)線上傳輸。數(shù)據(jù)存儲在一
個32字的FIFO中,每個字為32位寬。

sdio,STM32,嵌入式,單片機,stm32,SDIO

數(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標志,可以關閉FIFO、使能發(fā)送或使能接收。 TXACT和RXACT由數(shù)據(jù)通
道子單元設置而且是互斥的:
─ 當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ù)通道子單元
設置TXACT為有效。
?sdio,STM32,嵌入式,單片機,stm32,SDIO

● 接收FIFO:當數(shù)據(jù)通道子單元接收到一個數(shù)據(jù)字,它會把數(shù)據(jù)寫入FIFO,寫操作結(jié)束后,
寫指針自動加一;在另一端,有一個讀指針始終指向FIFO中的當前數(shù)據(jù)。如果關閉了接收
FIFO,所有的狀態(tài)標志會被清除,讀寫指針也被復位。在接收到數(shù)據(jù)時數(shù)據(jù)通道子單元設
置RXACT。下表列出了接收FIFO的狀態(tài)標志。通過32個連續(xù)的地址可以訪問接收FIFO。
sdio,STM32,嵌入式,單片機,stm32,SDIO?sdio,STM32,嵌入式,單片機,stm32,SDIO

3.3.2 SDIO AHB接口

?AHB接口產(chǎn)生中斷和DMA請求,并訪問SDIO接口寄存器和數(shù)據(jù)FIFO。它包含一個數(shù)據(jù)通道、
寄存器譯碼器和中斷/DMA控制邏輯。
SDIO中斷
當至少有一個選中的狀態(tài)標志為高時,中斷控制邏輯產(chǎn)生中斷請求。有一個屏蔽寄存器用于選
擇可以產(chǎn)生中斷的條件,如果設置了相應的屏蔽標志,則對應的狀態(tài)標志可以產(chǎn)生中斷。
SDIO/DMA接口:在SDIO和存儲器之間數(shù)據(jù)傳輸?shù)倪^程
在下面的例子中,主機控制器使用CMD24(WRITE_BLOCK)從主機傳送512字節(jié)到MMC卡,
DMA控制器用于從存儲器向SDIO的FIFO填充數(shù)據(jù)。
1. 執(zhí)行卡識別過程
2. 提高SDIO_CK頻率
3. 發(fā)送CMD7命令選擇卡
4. 按下述步驟配置DMA2:
????????a) 使能DMA2控制器并清除所有的中斷標志位
????????b) 設置DMA2通道4的源地址寄存器為存儲器緩沖區(qū)的基地址, DMA2通道4的目標地址寄
????????存器為SDIO_FIFO寄存器的地址
????????c) 設置DMA2通道4控制寄存器(存儲器遞增,非外設遞增,外設和源的數(shù)據(jù)寬度為字寬度)
????????d) 使能DMA2通道4
5. 發(fā)送CMD24(WRITE_BLOCK),操作如下:
????????a) 設置SDIO數(shù)據(jù)長度寄存器(SDIO數(shù)據(jù)時鐘寄存器應該在執(zhí)行卡識別過程之前設置好)
????????b) 設置SDIO參數(shù)寄存器為卡中需要傳送數(shù)據(jù)的地址
????????c) 設置SDIO命令寄存器: CmdIndex置為24(WRITE_BLOCK); WaitRest置為1(SDIO卡
????????主機等待響應); CPSMEN置為1(使能SDIO卡主機發(fā)送命令),保持其它域為他們的復
????????位值。
????????d) 等待SDIO_STA[6]=CMDREND中斷,然后設置SDIO數(shù)據(jù)寄存器: DTEN置為1(使能
????????SDIO卡主機發(fā)送數(shù)據(jù)); DTDIR置為0(控制器至卡方向); DTMODE置為0(塊數(shù)據(jù)傳
????????送); DMAEN置為1(使能DMA); DBLOCKSIZE置為9(512字節(jié));其它域不用設置。
????????e) 等待SDIO_STA[10]=DBCKEND

6. 查詢DMA通道的使能狀態(tài)寄存器,確認沒有通道仍處于使能狀態(tài)

3.4卡功能描述

3.4.1卡識別模式

????????在卡識別模式,主機復位所有的卡、檢測操作電壓范圍、識別卡并為總線上每個卡設置相對地址(RCA)。在卡識別模式下,所有數(shù)據(jù)通信只使用命令信號線(CMD)。

3.4.2 卡復位

????????GO_IDLE_STATE命令(CMD0)是一個軟件復位命令,它把多媒體卡和SD存儲器置于空閑狀
態(tài)。 IO_RW_DIRECT命令(CMD52)復位SD I/O卡。上電后或執(zhí)行CMD0后,所有卡的輸出端都
處于高阻狀態(tài),同時所有卡都被初始化至一個默認的相對卡地址(RCA=0x0001)和默認的驅(qū)動器
寄存器設置(最低的速度,最大的電流驅(qū)動能力)。

?

3.4.3 操作電壓范圍確認

????????所有的卡都可以使用任何規(guī)定范圍內(nèi)的電壓與SDIO卡主機通信,可支持的最小和最大電壓VDD數(shù)值由卡上的操作條件寄存器(OCR)定義。
????????內(nèi)部存儲器存儲了卡識別號(CID)和卡特定數(shù)據(jù)(CSD)的卡,僅能在數(shù)據(jù)傳輸VDD條件下傳送這些信息。當SDIO卡主機模塊與卡的VDD范圍不一致時,卡將不能完成識別周期,也不能發(fā)送CSD數(shù)據(jù);因此,在VDD范圍不匹配時, SDIO卡主機可以用下面幾個特殊命令去識別和拒絕卡:
SEND_OP_COND(CMD1) 、 SD_APP_OP_COND(SD 存 儲 卡 的 ACMD41) 和
IO_SEND_OP_COND(SD I/O卡的CMD5)。 SDIO卡主機在執(zhí)行這幾個命令時會產(chǎn)生需要的VDD
電壓。不能在指定的電壓范圍進行數(shù)據(jù)傳輸?shù)目?,將從總線斷開并進入非激活狀態(tài)。
????????使用這些不包含電壓范圍作為操作數(shù)的命令, SDIO卡主機能夠查詢每個卡并在確定公共的電壓范圍前,把不在此范圍內(nèi)的卡置于非激活狀態(tài)。當SDIO卡主機能夠選擇公共的電壓范圍或用戶
需要知道卡是否能用時, SDIO卡主機可以進行這樣的查詢。

3.4.4 卡識別過程

????????多媒體卡和SD卡的卡識別過程是有區(qū)別的;對于多媒體卡,卡識別過程以時鐘頻率Fod開始,所有SDIO_CMD輸出為開路驅(qū)動,允許在這個過程中的卡的并行連接,識別過程如下:
1. 總線被激活
2. SDIO卡主機廣播發(fā)送SEND_OP_COND(CMD1)命令,并接收操作條件
3. 得到的響應是所有卡的操作條件寄存器內(nèi)容的“線與”
4. 不兼容的卡會被置于非激活狀態(tài)
5. SDIO卡主機廣播發(fā)送ALL_SEND_CID(CMD2)至所有激活的卡
6. 所有激活的卡同時串行地發(fā)送他們的CID號,那些檢測到輸出的CID位與命令線上的數(shù)據(jù)
不相符的卡必須停止發(fā)送,并等待下一個識別周期。最終只有一個卡能夠成功地傳送完整
的CID至SDIO卡主機并進入識別狀態(tài)。
7. SDIO卡主機發(fā)送SET_RELATIVE_ADDR(CMD3)命令至這個卡,這個新的地址被稱為相
對卡地址(RCA),它比CID短,用于對卡尋址。至此,這個卡轉(zhuǎn)入待機狀態(tài),并不再響應
新的識別過程,同時它的輸出驅(qū)動從開路轉(zhuǎn)變?yōu)橥仆炷J健?br> 8. SDIO卡主機重復上述步驟5至7,直到收到超時條件。


????????對于SD卡而言,卡識別過程以時鐘頻率Fod開始,所有SDIO_CMD輸出為推挽驅(qū)動而不是開路驅(qū)動,識別過程如下:
1. 總線被激活
2. SDIO卡主機廣播發(fā)送SEND_APP_OP_COND(ACMD41)命令
3. 得到的響應是所有卡的操作條件寄存器的內(nèi)容
4. 不兼容的卡會被置于非激活狀態(tài)
5. SDIO卡主機廣播發(fā)送ALL_SEND_CID(CMD2)至所有激活的卡
6. 所有激活的卡發(fā)送回他們唯一卡識別號(CID)并進入識別狀態(tài)。
7. SDIO卡主機發(fā)送SET_RELATIVE_ADDR(CMD3)命令和一個地址到一個激活的卡,這個
新的地址被稱為相對卡地址(RCA),它比CID短,用于對卡尋址。至此,這個卡轉(zhuǎn)入待機
狀態(tài)。 SDIO卡主機可以再次發(fā)送該命令更改RCA,卡的RCA將是最后一次的賦值。
8. SDIO卡主機對所有激活的卡重復上述步驟5至7。


????????對于SD I/O卡而言,卡識別過程如下:
1. 總線被激活
2. SDIO卡主機發(fā)送IO_SEND_OP_COND(CMD5)命令
3. 得到的響應是卡的操作條件寄存器的內(nèi)容
4. 不兼容的卡會被置于非激活狀態(tài)

5. SDIO卡主機發(fā)送SET_RELATIVE_ADDR(CMD3)命令和一個地址到一個激活的卡,這個
新的地址被稱為相對卡地址(RCA),它比CID短,用于對卡尋址。至此,這個卡轉(zhuǎn)入待機
狀態(tài)。 SDIO卡主機可以再次發(fā)送該命令更改RCA,卡的RCA將是最后一次的賦值
?

3.4.5 寫數(shù)據(jù)塊

????????執(zhí)行寫數(shù)據(jù)塊命令(CMD24-27)時,主機把一個或多個數(shù)據(jù)塊從主機傳送到卡中,同時在每個數(shù)據(jù)塊的末尾傳送一個CRC碼。一個支持寫數(shù)據(jù)塊命令的卡應該始終能夠接收由WRITE_BL_LEN
定義的數(shù)據(jù)塊。如果CRC校驗錯誤,卡通過SDIO_D信號線指示錯誤,傳送的數(shù)據(jù)被丟棄而不
被寫入,所有后續(xù)(在多塊寫模式下)傳送的數(shù)據(jù)塊將被忽略。
????????如果主機傳送部分數(shù)據(jù),而累計的數(shù)據(jù)長度未與數(shù)據(jù)塊對齊,當不允許塊錯位(未設置CSD的參數(shù)WRITE_BLK_MISALIGN),卡將在第一個錯位的塊之前檢測到塊錯位錯誤(設置狀態(tài)寄存器中
的ADDRESS_ERROR錯誤位)。當主機試圖寫一個寫保護區(qū)域時,寫操作也會被中止,此時卡
會設置WP_VIOLATION位。
????????設置CID和CSD寄存器不需要事先設置塊長度,傳送的數(shù)據(jù)也是通過CRC保護的。如果CSD或CID寄存器的部分是存儲在ROM中,則這個不能更改的部分必須與接收緩沖區(qū)的對應部分相一
致,如果有不一致之處,卡將報告一個錯誤同時不修改任何寄存器的內(nèi)容。有些卡需要長的甚
至不可預計的時間完成寫一個數(shù)據(jù)塊,在接收一個數(shù)據(jù)塊并完成CRC檢驗后,卡開始寫操作,
如果它的寫緩沖區(qū)已經(jīng)滿并且不能再從新的WRITE_BLOCK命令接受新的數(shù)據(jù)時,它會把
SDIO_D信號線拉低。主機可以在任何時候使用SEND_STATUS(CMD13)查詢卡的狀態(tài),卡將
返回當前狀態(tài)。 READY_FOR_DATA狀態(tài)位指示卡是否可以接受新的數(shù)據(jù)或?qū)懖僮魇欠襁€在進
行。主機可以使用CMD7(選擇另一個卡)不選中某個卡,而把這個卡置于斷開狀態(tài),這樣可以釋
放SDIO_D信號線而不中斷未完成的寫操作;當重新選擇了一個卡,如果寫操作仍然在進行并且
寫緩沖區(qū)仍不能使用,它會重新通過拉低SDIO_D信號線指示忙的狀態(tài)。

3.4.6 讀數(shù)據(jù)塊

????????在讀數(shù)據(jù)塊模式下,數(shù)據(jù)傳輸?shù)幕締卧菙?shù)據(jù)塊,它的大小在CSD中(READ_BL_LEN)定義。如果設置了READ_BL_PARTIAL,同樣可以傳送較小的數(shù)據(jù)塊,較小數(shù)據(jù)塊是指開始和結(jié)束地址完全包含在一個物理塊中, READ_BL_LEN定義了物理塊的大小。為保證數(shù)據(jù)傳輸?shù)恼_,
每個數(shù)據(jù)塊后都有一個CRC校驗碼。 CMD17(READ_SINGLE_BLOCK)啟動一次讀數(shù)據(jù)塊操
作,在傳輸結(jié)束后卡返回到發(fā)送狀態(tài)。
????????CMD18(READ_MULTIPLE_BLOCK)啟動一次連續(xù)多個數(shù)據(jù)塊的讀操作。
????????主機可以在多數(shù)據(jù)塊讀操作的任何時候中止操作,而不管操作的類型。發(fā)送停止傳輸命令即可中止操作。
????????如果在多數(shù)據(jù)塊讀操作中(任一種類型)卡檢測到錯誤(例如:越界、地址錯位或內(nèi)部錯誤),它將停止數(shù)據(jù)傳輸并仍處于數(shù)據(jù)狀態(tài);此時主機必須發(fā)送停止傳輸命令中止操作。在停止傳輸命令
的響應中報告讀錯誤。
????????如果主機發(fā)送停止傳輸命令時,卡已經(jīng)傳輸完一個確定數(shù)目的多個數(shù)據(jù)塊操作中的最后一個數(shù)據(jù)塊,因為此時卡已經(jīng)不在數(shù)據(jù)狀態(tài),主機會得到一個非法命令的響應。如果主機傳輸部分數(shù)
據(jù)塊,而累計的數(shù)據(jù)長度不能與物理塊對齊同時不允許塊錯位,卡會在出現(xiàn)第一個未對齊的塊
時檢測出一個塊對齊錯誤,并在狀態(tài)寄存器中設置ADDRESS_ERROR錯誤標志。

3.4.7 數(shù)據(jù)流操作,數(shù)據(jù)流寫入和數(shù)據(jù)流讀出(只適用于多媒體卡)
?

在數(shù)據(jù)流模式,數(shù)據(jù)按字節(jié)傳輸,同時每個數(shù)據(jù)塊后沒有CRC。
數(shù)據(jù)流寫(只適用于多媒體卡)
WRITE_DAT_UNTIL_STOP(CMD20)開始從SDIO卡主機至卡的數(shù)據(jù)傳輸,從指定的地址開始
連續(xù)傳輸直到SDIO卡主機發(fā)出一個停止命令。如果允許部分數(shù)據(jù)塊傳輸(設置了CSD參數(shù)
WRITE_BL_PARTIAL),則數(shù)據(jù)流可以在卡的地址空間中的任意地址開始和停止,否則數(shù)據(jù)流
只能在數(shù)據(jù)塊的邊界開始和停止。因為傳輸?shù)臄?shù)據(jù)數(shù)目沒有事先設定,不能使用CRC校驗。如
果發(fā)送數(shù)據(jù)時達到了存儲器的最大地址,即使SDIO卡主機沒有發(fā)送停止命令,隨后傳輸?shù)臄?shù)據(jù)
也會被丟棄。
數(shù)據(jù)流寫操作的最大時鐘頻率可以通過下式計算
(8 x 2writebllen)(-NSAC)
Maximumspeed = Min(TRANSPEED, )
TAAC x R2WFACTOR
● Maximumspeed = 最大寫頻率
● TRANSPEED = 最大數(shù)據(jù)傳輸率
● writebllen = 最大寫數(shù)據(jù)塊長度
● NSAC = 以CLK周期計算的數(shù)據(jù)讀操作時間2
● TAAC = 數(shù)據(jù)讀操作時間1
● R2WFACTOR = 寫速度因子
如果主機試圖使用更高的頻率,卡可能不能處理數(shù)據(jù)并停止編程,同時在狀態(tài)寄存器中設置
OVERRUN錯誤位,丟棄所有隨后傳輸?shù)臄?shù)據(jù)并(在接收數(shù)據(jù)狀態(tài))等待停止命令。如果主機試圖
寫入一個寫保護區(qū)域,寫操作將被中止,同時卡將設置WP_VIOLATION位。
數(shù)據(jù)流讀(只適用于多媒體卡)
READ_DAT_UNTIL_STOP(CMD11)控制數(shù)據(jù)流數(shù)據(jù)傳輸。
這 個 命 令 要 求 卡 從 指 定 的 地 址 讀 出 數(shù) 據(jù) , 直 到SDIO卡 主 機 發(fā) 送STOP_TRANSMISSION
(CMD12)。因為串行命令傳輸?shù)难舆t,停止命令的執(zhí)行會有延遲,數(shù)據(jù)傳送會在停止命令的結(jié)
束位后停止。如果發(fā)送數(shù)據(jù)時達到了存儲器的最大地址, SDIO卡主機沒有發(fā)送停止命令,隨后
傳輸?shù)臄?shù)據(jù)將是無效數(shù)據(jù)。
數(shù)據(jù)流讀操作的最大時鐘頻率可以通過下式計算
(8 x 2readbllen)(-NSAC)
Maximumspeed = Min(TRANSPEED, )
TAAC x R2WFACTOR
● Maximumspeed = 最大寫頻率
● TRANSPEED = 最大數(shù)據(jù)傳輸率
● readbllen = 最大讀數(shù)據(jù)塊長度
● NSAC = 以CLK周期計算的數(shù)據(jù)讀操作時間2
● TAAC = 數(shù)據(jù)讀操作時間1
● R2WFACTOR = 寫速度因子
如 果 主 機 試 圖 使 用 更 高 的 頻 率 , 卡 將 不 能 處 理 數(shù) 據(jù) 傳 輸 , 此 時 卡 在 狀 態(tài) 寄 存 器 中 設 置UNDERRUN錯誤位,中止數(shù)據(jù)傳輸并在數(shù)據(jù)狀態(tài)等待停止命令。
?

3.4.8?擦除:成組擦除和扇區(qū)擦除

????????多媒體卡的擦除單位是擦除組,擦除組是以寫數(shù)據(jù)塊計算,寫數(shù)據(jù)塊是卡的基本寫入單位。擦除組的大小是卡的特定參數(shù),在CSD中定義。
????????主機可以擦除一個連續(xù)范圍的擦除組,開始擦除操作有三個步驟。
????????首先,主機使用ERASE_GROUP_START(CMD35)命令定義連續(xù)范圍的開始地址,然后使用
ERASE_GROUP_END(CMD36) 命 令 定 義 連 續(xù) 范 圍 的 結(jié) 束 地 址 , 最 后 發(fā) 送 擦 除 命 令
ERASE(CMD38)開始擦除操作。擦除命令的地址域是以字節(jié)為單位的擦除組地址。卡會舍棄未
與擦除組大小對齊的部分,把地址邊界對齊到擦除組的邊界。
????????如果未按照上述步驟收到了擦除命令,卡在狀態(tài)寄存器中設置ERASE_SEQ_ERROR位,并重新等待第一個步驟。如 果 收 到 了 除 SEND_STATUS 和 擦 除 命 令 之 外 的 其 它 命 令 , 卡 在 狀 態(tài) 寄 存 器 中 設 置ERASE_RESET位,解除擦除序列并執(zhí)行新的命令。

????????如果擦除范圍包含了寫保護數(shù)據(jù)塊,這些塊不被擦除,只有未保護的塊被擦除,同時卡在狀態(tài)寄存器中設置WP_ERASE_SKIP狀態(tài)位。
????????在擦除過程中,卡拉低SDIO_D信號。實際的擦除時間可能很長,主機可以使用CMD7解除卡的選擇.

3.4.9 寬總線選擇和解除選擇


????????可以通過SET_BUS_WIDTH(ACMD6)命令選擇或不選擇寬總線(4位總線寬度)操作模式,上電后或GO_IDLE_STATE(CMD0)命令后默認的總線寬度為1位。 SET_BUS_WIDTH(ACMD6)命令僅
在傳輸狀態(tài)時有效,即只有在使用SELECT/DESELECT_CARD(CMD7)命令選擇了卡后才能改
變總線寬度。

3.4.10 保護管理

SDIO卡主機模塊支持三種保護方式:
1. 內(nèi)部卡保護(卡內(nèi)管理)
2. 機械寫保護開關(僅由SDIO卡主機模塊管理)
3. 密碼管理的卡鎖操作
內(nèi)部卡的寫保護
????????卡的數(shù)據(jù)可以被保護不被覆蓋或擦除。在CSD中永久地或臨時地設置寫保護位,生產(chǎn)廠商或內(nèi)容提供商可以永久地對整個卡施行寫保護。對于支持在CSD中設置WP_GRP_ENABLE位從而
提供一組扇區(qū)寫保護的卡,部分數(shù)據(jù)可以被保護,寫保護可以通過程序改變。寫保護的基本單
位是CSD參數(shù)WP_GRP_SIZE個扇區(qū)。 SET_WRITE_PROT和CLR_WRITE_PROT命令控制指
定組的保護, SEND_WRITE_PROT命令與單數(shù)據(jù)塊讀命令類似,卡送出一個包含32個寫保護
位(代表從指定地址開始的32個寫保護組)的數(shù)據(jù)塊,跟著一個16位的CRC碼。寫保護命令的地
址域是一個以字節(jié)為單位的組地址。
卡將截斷所有組大小以下的地址。
機械寫保護開關
????????在卡的側(cè)面有一個機械的滑動開關,允許用戶設置或清除卡的寫保護。當滑動開關置于小窗口打開的位置時,卡處于寫保護狀態(tài),當滑動開關置于小窗口關閉的位置時,可以更改卡中內(nèi)
容。在卡的插槽上的對應部位也有一個開關指示SDIO卡主機模塊,卡是否處于寫保護狀態(tài)。卡
的內(nèi)部電路不知道寫保護開關的位置。
密碼保護
????????密碼保護功能允許SDIO卡主機模塊使用密碼對卡實行上鎖或解鎖。密碼存儲在128位的PWD寄存器中,它的長度設置在8位的PWD_LEN寄存器中。這些寄存器是不可揮發(fā)的,即掉電后它們
的內(nèi)容不丟失。已上鎖的卡能夠響應和執(zhí)行相應的命令,即允許SDIO卡主機模塊執(zhí)行復位、初
始化和查詢狀態(tài)等操作,但不允許操作卡中的數(shù)據(jù)。當設置了密碼后(即PWD_LEN的數(shù)值不為
0),上電后卡自動處于上鎖狀態(tài)。正如CSD和CID寄存器寫命令,上鎖/解鎖命令僅在傳輸狀態(tài)
下有效,在這個狀態(tài)下,命令中沒有地址參數(shù),但卡已經(jīng)被選中??ǖ纳湘i/解鎖命令具有單數(shù)
據(jù)塊寫命令的結(jié)構(gòu)和總線操作類型,傳輸?shù)臄?shù)據(jù)塊包含所有命令所需要的信息(密碼設置模式、
PWD內(nèi)容和上鎖/解鎖指示)。在發(fā)送卡的上鎖/解鎖命令之前,命令數(shù)據(jù)塊的長度由SDIO卡主機
模塊定義,,命令結(jié)構(gòu)示于表142。
位的設置如下:
● ERASE:設置該位將執(zhí)行強制擦除,所有其它位必須為0,只發(fā)送命令字節(jié)。
● LOCK_UNLOCK:設置該位鎖住卡, LOCK_UNLOCK與SET_PWD可以同時設置,但不能
與CLR_PWD同時設置。
● CLR_PWD:設置該位清除密碼數(shù)據(jù)。
● SET_PWD:設置該位將密碼數(shù)據(jù)保存至存儲器。
● PWD_LEN:以字節(jié)為單位定義密碼的長度。

● PWD:密碼(依不同的命令,新的密碼或正在使用的密碼)

以下幾節(jié)列出了設置/清除密碼、上鎖/解鎖和強制擦除的命令序列。
設置密碼
1. 選擇一個卡(SELECT/DESELECT_CARD, CMD7)。
2. 定義要在8位的卡上鎖/解鎖模式下發(fā)送的數(shù)據(jù)塊長度(SET_BLOCKLEN, CMD16), 8位
的PWD_LEN,新密碼的字節(jié)數(shù)目。當更換了密碼后,發(fā)送命令的數(shù)據(jù)塊長度必須同時考
慮新舊密碼的長度。
3. 以合適的數(shù)據(jù)塊長度在數(shù)據(jù)線上發(fā)送LOCK/UNLOCK(CMD42)命令,并包含16位的CRC
碼。數(shù)據(jù)塊包含了操作模式(SET_PWD=1)、長度(PWD_LEN)和密碼(PWD)。當更換了密
碼后,長度數(shù)值(PWD_LEN)包含了新舊兩個密碼的長度, PWD域包含了舊的密碼(正在
使用的)和新的密碼。
4. 當舊的密碼匹配后,新的密碼和它的長度被分別存儲在PWD和PWD_LEN域。如果送出
的舊密碼與期望的密碼(長度或內(nèi)容)不吻合,則設置狀態(tài)寄存器中的
LOCK_UNLOCK_FAILED錯誤位,同時密碼不變。
密碼長度域(PWD_LEN)指示當前是否設置了密碼,如果該域為非零,則表示使用了密碼,卡在
上電時自動上鎖。在不斷電的情況下,如果設置了密碼,可以通過設置LOCK_UNLOCK位或發(fā)
送一個額外的上鎖命令,立即鎖住卡。
清除密碼
1. 選擇一個卡(SELECT/DESELECT_CARD, CMD7)。
2. 定義要在8位的卡上鎖/解鎖模式下發(fā)送的數(shù)據(jù)塊長度(SET_BLOCKLEN, CMD16), 8位
的PWD_LEN,當前使用密碼的字節(jié)數(shù)目。
3. 當密碼匹配后, PWD域被清除同時PWD_LEN被設為0。如果送出的密碼與期望的密碼(長
度或內(nèi)容)不吻合,則設置狀態(tài)寄存器中的LOCK_UNLOCK_FAILED錯誤位,同時密碼不
變。
卡上鎖
1. 選擇一個卡(SELECT/DESELECT_CARD, CMD7)
2. 定義要在8位的卡上鎖/解鎖模式(見表142的字節(jié)0)下發(fā)送的數(shù)據(jù)塊長度
(SET_BLOCKLEN, CMD16), 8位的PWD_LEN,和當前密碼的字節(jié)數(shù)目。
3. 以合適的數(shù)據(jù)塊長度在數(shù)據(jù)線上發(fā)送LOCK/UNLOCK(CMD42)命令,并包含16位的CRC
碼。數(shù)據(jù)塊包含了操作模式(LOCK_UNLOCK=1)、長度(PWD_LEN)和密碼(PWD)。
4. 當密碼匹配后,卡被上鎖并則設置狀態(tài)寄存器中的CARD_IS_LOCKED狀態(tài)位。如果送出
的密碼與期望的密碼(長度或內(nèi)容)不吻合,則設置狀態(tài)寄存器中的
LOCK_UNLOCK_FAILED錯誤位,同時上鎖操作失敗。
設置密碼和為卡上鎖可以在同一個操作序列中進行,此時SDIO卡主機模塊按照前述的步驟設置
密碼,但在發(fā)送新密碼命令的第3步需要設置LOCK_UNLOCK位。
如果曾經(jīng)設置過密碼(PWD_LEN不為0),卡會在上電復位時自動地上鎖。對已經(jīng)上鎖的卡執(zhí)行
上 鎖 操 作 或 對 沒 有 密 碼 的 卡 執(zhí) 行 上 鎖 操 作 會 導 致 失 敗 , 并 設 置 狀 態(tài) 寄 存 器 中 的
LOCK_UNLOCK_FAILED錯誤位。
卡解鎖
1. 選擇一個卡(SELECT/DESELECT_CARD, CMD7)
2. 定義要在8位的卡上鎖/解鎖模式(見表142的字節(jié)0)下發(fā)送的數(shù)據(jù)塊長度
(SET_BLOCKLEN, CMD16), 8位的PWD_LEN,和當前密碼的字節(jié)數(shù)目。
3. 以合適的數(shù)據(jù)塊長度在數(shù)據(jù)線上發(fā)送LOCK/UNLOCK(CMD42)命令,并包含16位的CRC
碼。數(shù)據(jù)塊包含了操作模式(LOCK_UNLOCK=0)、長度(PWD_LEN)和密碼(PWD)。
4. 當密碼匹配后,卡鎖被解除,同時狀態(tài)寄存器中的CARD_IS_LOCKED位被清除。如果送
出的密碼與期望的密碼(長度或內(nèi)容)不吻合,則設置狀態(tài)寄存器中的
LOCK_UNLOCK_FAILED錯誤位,同時卡仍保持上鎖狀態(tài)。
解鎖狀態(tài)只在當前的供電過程中有效,只要不清除PWD域,下次上電后卡會被自動上鎖。
試 圖 對 已 經(jīng) 解 了 鎖 的 卡 執(zhí) 行 解 鎖 操 作 會 導 致 操 作 失 敗 , 并 設 置 狀 態(tài) 寄 存 器 中 的
LOCK_UNLOCK_FAILED錯誤位。
強制擦除
如果用戶忘記了密碼(PWD的內(nèi)容),可以在清除卡中的所有內(nèi)容后使用卡。強制擦除操作擦除
所有卡中的數(shù)據(jù)和密碼。
1. 選擇一個卡(SELECT/DESELECT_CARD, CMD7)
2. 設置發(fā)送的數(shù)據(jù)塊長度(SET_BLOCKLEN, CMD16)為1,僅發(fā)送8位的卡上鎖/解鎖字節(jié)
(見表142的字節(jié)0)。
3. 以合適的數(shù)據(jù)塊長度在數(shù)據(jù)線上發(fā)送LOCK/UNLOCK(CMD42)命令,并包含16位的CRC
碼。數(shù)據(jù)塊包含了操作模式(ERASE=1)所有其它位為0。
4. 當ERASE位是數(shù)據(jù)域中僅有的位時,卡中的所有內(nèi)容將被擦除,包括PWD和PWD_LEN
域,同時卡不再被上鎖。如果有任何其它位不為0,則設置狀態(tài)寄存器中的
LOCK_UNLOCK_FAILED錯誤位,卡中的數(shù)據(jù)保持不變,同時卡仍保持上鎖狀態(tài)。
試 圖 對 已 經(jīng) 解 了 鎖 的 卡 執(zhí) 行 擦 除 操 作 會 導 致 操 作 失 敗 , 并 設 置 狀 態(tài) 寄 存 器 中 的LOCK_UNLOCK_FAILED錯誤位。
?

3.4.10 卡狀態(tài)寄存器


????????響應格式R1包含了一個32位的卡狀態(tài)域,這個域是用于向卡主機發(fā)送卡的狀態(tài)信息(這些信息有可能存在本地的狀態(tài)寄存器中)。除非特別說明,卡返回的狀態(tài)始終是與之前的命令相關的。
表129定義了不同的狀態(tài)信息。表中有關類型和清除條件域的縮寫定義如下:
類型:
● E: 錯誤位
● S: 狀態(tài)位
● R: 檢測位,并依據(jù)實際的命令響應而設置
● X: 檢測位,在命令的執(zhí)行中設置。 SDIO卡主機通過發(fā)送狀態(tài)命令讀出這些位而查詢卡的狀
態(tài)。
清除條件:
● A: 依據(jù)卡的當前狀態(tài)
● B: 始終與之前的命令相關。接收到正確的命令即可清除(具有一個命令的延遲)。
● C: 讀即可清除

sdio,STM32,嵌入式,單片機,stm32,SDIO

sdio,STM32,嵌入式,單片機,stm32,SDIO?

sdio,STM32,嵌入式,單片機,stm32,SDIO?

3.4.12 SD狀態(tài)寄存器


????????SD狀態(tài)包含與SD存儲器卡特定功能相關的狀態(tài)位和一些與未來應用相關的狀態(tài)位, SD狀態(tài)的長度是一個512位的數(shù)據(jù)塊。收到ACMD13命令(CMD55,然后是CMD13)后,這個寄存器的內(nèi)
容被傳送到SDIO卡主機。只有卡處于傳輸狀態(tài)時(卡已被選擇)才能發(fā)送ACMD13命令。
表130定義了不同的SD狀態(tài)寄存器信息。表中有關類型和清除條件域的縮寫定義如下:
類型:
● E: 錯誤位
● S: 狀態(tài)位
● R: 檢測位,并依據(jù)實際的命令響應而設置
● X: 檢測位,在命令的執(zhí)行中設置。 SDIO卡主機通過發(fā)送狀態(tài)命令讀出這些位而查詢卡的狀
態(tài)。
清除條件:
● A: 依據(jù)卡的當前狀態(tài)
● B: 始終與之前的命令相關。接收到正確的命令即可清除(具有一個命令的延遲)。
● C: 讀即可清除
sdio,STM32,嵌入式,單片機,stm32,SDIO?sdio,STM32,嵌入式,單片機,stm32,SDIO

SIZE_OF_PROTECTED_AREA
標準容量卡和高容量卡設置該位的方式不同。對于標準容量卡,受保護區(qū)域的容量由下式計
算:
受保護區(qū)域 = SIZE_OF_PROTECTED_AREA * MULT * BLOCK_LEN
SIZE_OF_PROTECTED_AREA的單位是MULT * BLOCK_LEN。
對于高容量卡,受保護區(qū)域的容量由下式計算:
受保護區(qū)域 = SIZE_OF_PROTECTED_AREA
SIZE_OF_PROTECTED_AREA的單位是字節(jié)。
SPEED_CLASS
這8位指示速度的類型和可以通過計算PW/2的數(shù)值(PW是寫的性能)。
sdio,STM32,嵌入式,單片機,stm32,SDIO?

PERFORMANCE_MOVE
這8位以1MB/秒為單位指示移動性能(Pm)。如果卡不用RU(紀錄單位)移動數(shù)據(jù),應該認為Pm是
無窮大。設置這個域為FFh表示無窮大。
?sdio,STM32,嵌入式,單片機,stm32,SDIO

AU_SIZE
這4位指示AU的長度,數(shù)值是16K字節(jié)為單位2的冪次的倍數(shù)。
?sdio,STM32,嵌入式,單片機,stm32,SDIO

sdio,STM32,嵌入式,單片機,stm32,SDIO?

依據(jù)卡的容量,最大的AU長度由下表定義??梢栽赗U長度和最大的AU長度之間設置任意的
AU長度。
sdio,STM32,嵌入式,單片機,stm32,SDIO?

ERASE_SIZE
這個16位域給出了NERASE,當NERASE個AU被擦除時, ERASE_TIMEOUT定義了超時時間。主
機應該確定適當?shù)囊淮尾僮髦胁脸腁U數(shù)目,這樣主機可以顯示擦除操作的進度。如果該域為
0,則不支持擦除的超時計算。
?

?sdio,STM32,嵌入式,單片機,stm32,SDIO

ERASE_TIMEOUT
這6位給出了TERASE,當ERASE_SIZE指示的多個AU被擦除時,這個數(shù)值給出了從偏移量算起
的擦除超時。 ERASE_TIMEOUT的范圍可以定義到最多63秒,卡的生產(chǎn)商可以根據(jù)具體實現(xiàn)選
擇 合 適 的 ERASE_SIZE 與 ERASE_TIMEOUT 的 組 合 , 先 確 定 ERASE_TIMEOUT 再 確 定
ERASE_SIZE。
?sdio,STM32,嵌入式,單片機,stm32,SDIO

ERASE_OFFSET
這2位給出了TOFFSET,當ERASE_SIZE和ERASE_TIMEOUT同為0時這個數(shù)值沒有意義
?sdio,STM32,嵌入式,單片機,stm32,SDIO

3.4 13 SD的I/O模式


SD的I/O中斷
????????為了讓SD I/O卡能夠中斷多媒體卡/SD模塊,在SD接口上有一個具有中斷功能的引腳——第8
腳,在4位SD模式下這個腳是SDIO_D1,卡用它向多媒體卡/SD模塊提出中斷申請。對于每一
個卡或卡內(nèi)的功能,中斷功能是可選的。 SD I/O的中斷是電平有效,即在被識別并得到多媒體
卡/SD模塊的響應之前,中斷信號線必須保持有效電平(低),在中斷過程結(jié)束后保持無效電平
(高)。在多媒體卡/SD模塊服務了中斷請求后,通過一個I/O寫操作,寫入適當?shù)奈坏絊D I/O卡的
內(nèi)部寄存器,即可清除中斷狀態(tài)位。所有SD I/O卡的中斷輸出是低電平有效,多媒體卡/SD模塊
在 所 有 數(shù) 據(jù) 線 (SDIO/D[3:0]) 上 提 供 上 拉 電 阻 。 多 媒 體 卡 /SD 模 塊 在 中 斷 階 段 對 第 8 腳(SDIO_D/IRQ)采樣并進行中斷檢測,其它時間該信號線上的數(shù)值將被忽略。
存儲器操作和I/O操作都具有中斷階段,單個數(shù)據(jù)塊操作的中斷階段定義與多個數(shù)據(jù)塊傳輸操作
的中斷階段定義不同。
SD的I/O暫停和恢復
在一個多功能的SD I/O卡或同時具有I/O和存儲器功能的卡中,多個設備(I/O和存儲器)共用
MMC/SD總線。為了使MMC/SD模塊中的多個設備能夠共用總線, SD I/O卡和復合卡可以有選
擇地實現(xiàn)暫停/恢復的概念;如果一個卡支持暫停/恢復, MMC/SD模塊能夠暫時地停止一個功能
或存儲器的數(shù)據(jù)傳輸操作(暫停),借此讓出總線給具有更高優(yōu)先級的其它功能或存儲器,在這個
具有更高優(yōu)先級的傳輸完成后,再恢復原先暫停的傳輸。支持暫停/恢復的操作是可選的。在
MMC/SD總線上執(zhí)行暫停/恢復操作有下述步驟:
1. 確定SDIO_D[3:0]信號線的當前功能
2. 請求低優(yōu)先級或慢的操作暫停
3. 等待暫停操作完成,確認設備已暫停
4. 開始高優(yōu)先級的傳輸
5. 等待高優(yōu)先級的傳輸結(jié)束
6. 恢復暫停的操作
SD I/O讀等待(ReadWait)
????????可選的讀等待(RW)操作只適用于SD卡的1位或4位模式。讀等待操作允許MMC/SD模塊在一個
卡正在讀多個寄存器(IO_RW_EXTENDED, CMD53)時,要求它暫時停止數(shù)據(jù)傳輸,同時允許
MMC/SD模塊發(fā)送命令到SD I/O設備中的其他功能。判斷一個卡是否支持讀等待協(xié)議,
MMC/SD模塊應該檢測卡的內(nèi)部寄存器。讀等待的時間與中斷階段相關。
?

3.4.14 命令與響應


應用相關命令和通用命令
????????SD卡主機模塊系統(tǒng)是用于提供一個適用于多種應用類型的標準接口,但同時又要兼顧特定用戶和 應 用 的 功 能 , 因 此 標 準 中 定 義 了 兩 類 通 用 命 令 : 應 用 相 關 命 令 (ACMD) 和 通 用 命 令(GEN_CMD)。
????????當卡收到APP_CMD(CMD55)命令時,卡期待下一個命令是應用相關命令。應用相關命令
(ACMD)具有普通多媒體卡相同的格式結(jié)構(gòu),并可以使用相同的CMD號碼,因為它是出現(xiàn)在
APP_CMD(CMD55)后面,所以卡把它識別為ACMD命令。如果跟隨APP_CMD(CMD55)之后不
是一個已經(jīng)定義的應用相關命令,則認為它是一個標準命令;例如:有一個SD_STATUS
(ACMD13)應用相關命令,如果在緊隨APP_CMD(CMD55)之后收到CMD13,它將被解釋為
SD_STATUS(ACMD13);但是如果卡在緊隨APP_CMD(CMD55)之后收到CMD7,而這個卡沒
有定義ACMD7,則它將被解釋為一個標準的CMD7(SELECT/DESELECT_CARD)命令。
如果要使用生產(chǎn)廠商自定義的ACMD, SD卡主機需要做以下操作:
1. 發(fā)送APP_CMD(CMD55)命令
卡送回響應給多媒體/SD卡模塊,指示設置了APP_CMD位并等待ACMD命令。

2. 發(fā)送指定的ACMD

卡送回響應給多媒體/SD卡模塊,指示設置了APP_CMD位,收到的命令已經(jīng)正確地按照
ACMD命令解析;如果發(fā)送了一個非ACMD命令,卡將按照普通的多媒體卡命令處理同時
清除卡中狀態(tài)寄存器的APP_CMD位。
如果發(fā)送了一個非法的命令(不管是ACMD還是CMD),將被按照標準的非法多媒體卡命令進行
錯誤處理。
GEN_CMD 命 令 的 總 線 操 作 過 程 , 與 單 數(shù) 據(jù) 塊 讀 寫 命 令 (WRITE_BLOCK , CMD24 或
READ_SINGLE_BLOCK, CMD17)相同;這時命令的參數(shù)表示數(shù)據(jù)傳輸?shù)姆较蚨皇堑刂?,?shù)
據(jù)塊具有用戶自定義的格式和意義。
發(fā)送GEN_CMD(CMD56)命令之前,卡必須被選中(狀態(tài)機處于傳輸狀態(tài)),數(shù)據(jù)塊的長度由
SET_BLOCKLEN(CMD16)定義。 GEN_CMD(CMD56)命令的響應是R1b格式。
命令類型
應用相關命令和通用命令有四種不同的類型:
1. 廣播命令(BC):發(fā)送到所有卡,沒有響應返回。
2. 帶響應的廣播命令(BCR):發(fā)送到所有卡,同時收到從所有卡返回的響應。
3. 帶尋址(點對點)的命令(AC):發(fā)送到選中的卡,在SDIO_D信號線上不包括數(shù)據(jù)傳輸。
4. 帶尋址(點對點)的數(shù)據(jù)傳輸命令(AC):發(fā)送到選中的卡,在SDIO_D信號線上包含數(shù)據(jù)傳
輸。
命令格式
命令格式參見表122。
多媒體卡/SD卡模塊的命令

sdio,STM32,嵌入式,單片機,stm32,SDIO

sdio,STM32,嵌入式,單片機,stm32,SDIO?

sdio,STM32,嵌入式,單片機,stm32,SDIO?

sdio,STM32,嵌入式,單片機,stm32,SDIO?

sdio,STM32,嵌入式,單片機,stm32,SDIO?sdio,STM32,嵌入式,單片機,stm32,SDIO

3.5 響應格式

所有的響應是通過MCCMD命令在SDIO_CMD信號線上傳輸。響應的傳輸總是從對應響應字的
位串的最左面開始,響應字的長度與響應的類型相關。
一個響應總是有一個起始位(始終為0),跟隨著傳輸?shù)姆较蛭?卡=0)。下表中標示為x的數(shù)值表示
一個可變的部分。除了R3響應類型,所有的響應都有CRC保護。每一個命令碼字都有一個結(jié)束
位(始終為1)。
共有5種響應類型,它們的格式定義如下:
?

3.5.1 R1(普通響應命令)


代碼長度=48位。位45:40指示要響應的命令索引,它的數(shù)值介于0至63之間??ǖ臓顟B(tài)由32位
進行編碼
sdio,STM32,嵌入式,單片機,stm32,SDIO

3.5.2 R1b


與R1格式相同,但可以選擇在數(shù)據(jù)線上發(fā)送一個繁忙信號。收到這些命令后,依據(jù)收到命令之
前的狀態(tài),卡可能變?yōu)榉泵Α?/p>

3.5.3 R2(CID、 CSD寄存器)


代碼長度=136位。 CID寄存器的內(nèi)容將作為CMD2和CMD10的響應發(fā)出。 CSD寄存器的內(nèi)容將
作為CMD9的響應發(fā)出??ㄖ凰统鯟ID和CSD的位[127…1],在接收端這些寄存器的位0被響應
的結(jié)束位所取代??ㄍㄟ^拉低MCDAT指示它正在進行擦除操作;實際擦除操作的時間可能非常
長,主機可以發(fā)送CMD7命令不選中這個卡。
?

?sdio,STM32,嵌入式,單片機,stm32,SDIO

3.5.4 R3(OCR寄存器)


代碼長度=48位。 OCR寄存器的內(nèi)容將作為CMD1的響應發(fā)出。電平代碼的定義是:限制的電壓
窗口 = 低,卡繁忙 = 低。
?sdio,STM32,嵌入式,單片機,stm32,SDIO

3.5.5 R4(快速I/O)


代碼長度=48位。參數(shù)域包含指定卡的RCA、需要讀出或?qū)懭爰拇嫫鞯牡刂?、和它的?nèi)容。
表147 R4響應
?sdio,STM32,嵌入式,單片機,stm32,SDIO

3.5.6 R4b


僅適合SD I/O卡:一個SDIO卡收到CMD5后將返回一個唯一的SDIO響應R4。
表148 R4b響應

sdio,STM32,嵌入式,單片機,stm32,SDIO

當一個SD I/O卡收到命令CMD5,卡的I/O部分被使能并能夠正常地響應所有后續(xù)的命令。 I/O卡
的使能狀態(tài)將保持到下一次復位、斷電或收到I/O復位的CMD52命令。注意,一個只包含存儲器
功能的SD卡可以響應CMD5命令,它的正確響應可以是:當前存儲器=1, I/O功能數(shù)目=0。按照
SD存儲器卡規(guī)范版本1.0設計的只包含存儲器功能的SD卡,可以檢測到CMD5命令為一個非法
命令并不響應它??梢蕴幚鞩/O卡的主機將發(fā)送CMD5命令,如果卡返回響應R4,則主機會依據(jù)
R4響應中的數(shù)據(jù)確定卡的配置。

3.5.7?R5(中斷請求)


僅適用于多媒體卡。代碼長度=48位。如果這個響應由主機產(chǎn)生,則參數(shù)中的RCA域為0x0。
?sdio,STM32,嵌入式,單片機,stm32,SDIO

3.5.8 R6(中斷請求)


僅適用于SD I/O卡。這是一個存儲器設備對CMD3命令的正常響應。
?sdio,STM32,嵌入式,單片機,stm32,SDIO

當發(fā)送CMD3命令到只有I/O功能的卡時,卡的狀態(tài)位[23:8]會改變;此時,響應中的16位將是只
有I/O功能的SD卡中的數(shù)值:
● 位15 = COM_CRC_ERROR
● 位14 = ILLEGAL_COMMAND
● 位13 = ERROR
● 位[12:0] = 保留

3.6 SDIO I/O卡特定的操作


下述功能是SD I/O卡特定的操作:
● 由SDIO_D2信號線實現(xiàn)的SDIO讀等待操作。
● 通過停止時鐘實現(xiàn)的SDIO讀等待操作。
● SDIO暫停/恢復操作(寫和讀暫停)
● SDIO中斷
只有設置了SDIO_DCTRL[11]位時, SDIO才支持這些操作;但讀暫停除外,因為它不需要特殊
的硬件操作
?

3.6.1 使用SDIO_D2 信號線的SDIO I/O讀等待操作


????????在收到第一個數(shù)據(jù)塊之前即可以開始讀等待過程,使能數(shù)據(jù)通道(設置SDIO_DCTRL[0]位)、使能 SDIO 特 定 操 作 ( 設 置 SDIO_DCTRL[11] 位 ) 、 開 始 讀 等 待 (SDIO_DCTRL[10]=0 并 且
SDIO_DCTRL[8]=1),同時數(shù)據(jù)傳輸方向是從卡至SDIO主機(SDIO_DCTRL[1]=1), DPSM將直
接從空閑進入讀等待狀態(tài)。在讀等待狀態(tài)時, 2個SDIO_CK時鐘周期后, DPSM驅(qū)動SDIO_D2
為’0’,在此狀態(tài),如果設置RWSTOP位(SDIO_DCTRL[9]),則DPSM會在等待狀態(tài)多停留2個
SDIO_CK時鐘周期, (根據(jù)SDIO規(guī)范)并在一個時鐘周期中驅(qū)動SDIO_D2為’1’。然后DPSM開始
等待從卡里接收數(shù)據(jù)。在接收數(shù)據(jù)塊時,即使設置了開始讀等待, DPSM也不會進入讀等待,
讀等待過程將在收到CRC后開始。必須清除RWSTOP才能開始新的讀等待操作。在讀等待期
間, SDIO主機可以在SDIO_D1上監(jiān)測SDIO中斷。

3.6.2 使用停止SDIO_CK的SDIO讀等待操作


????????如果SDIO卡不能支持前述的讀等待操作, SDIO可以停止SDIO_CK進入讀等待(按照20.6.1節(jié)介紹的方式設置SDIO_DCTRL,但置SDIO_DCTRL[10]=1),在接收當前數(shù)據(jù)塊結(jié)束位之后的2個
SDIO_CK周期后, DSPM停止時鐘,在設置了讀等待開始位后恢復時鐘。
????????因為SDIO_CK停止了,可以向卡發(fā)送任何命令。在讀等待期間, SDIO主機可以在SDIO_D1上監(jiān)測SDIO中斷。

3.6.3 SDIO暫停/恢復操作


????????在向卡發(fā)送數(shù)據(jù)時, SDIO可以暫停寫操作。設置SDIO_CMD[11]位,這指示CPSM當前的命令是一個暫停命令。 CPSM分析響應,在從卡收到ACK時(暫停被接受),它確認在收到當前數(shù)據(jù)塊
的CRC后進入空閑狀態(tài)。
硬件不會保存結(jié)束暫停操作之后,剩余的發(fā)送數(shù)據(jù)塊數(shù)目。
可以通過軟件暫停寫操作:在收到卡對暫停命令的ACK時,停止DPSM(SDIO_DCTRL[0]=0),
DPSM即可進入空閑狀態(tài)。
暫停讀操作: DPSM在Wait_r狀態(tài)等待,在停止數(shù)據(jù)傳輸進入暫停之前,已經(jīng)發(fā)送完成完整的數(shù)
據(jù)包。隨后應用程序繼續(xù)讀出RxFIFO直到FIFO變空,最后DPSM自動地進入空閑狀態(tài)。


3.6.4 SDIO中斷


當設置了SDIO_DCTRL[11]位, SDIO主機在SDIO_D1信號線上監(jiān)測SDIO中斷。

3.7 CE-ATA特定操作


下面是CE-ATA的特定操作:
● 送出命令完成信號能夠關閉CE-ATA設備
● 從CE-ATA設備接收命令完成信號
● 使用狀態(tài)位和/或中斷,向CPU發(fā)送CE-ATA命令完成信號
僅當設置了SDIO_CMD[14]位時,即SDIO主機只對CE-ATA的CMD61命令支持這些操作。


3.7.1 命令完成指示關閉


????????如果未設置SDIO_CMD[12]中的“允許CMD結(jié)束位”并且設置了SDIO_CMD[13]中的“非中斷
使能位”,則在收到一個短響應后的8個位周期之后,發(fā)出命令完成關閉信號。
在命令移位寄存器中寫入關閉序列“00001”并且在命令計數(shù)器中寫入43,則CPSM進入暫停狀
態(tài)。 8個周期后,一個觸發(fā)將CPSM移至發(fā)送狀態(tài)。當命令計數(shù)器達到48時,因為沒有要等待的
響應, CPSM變?yōu)榭臻e狀態(tài)。


3.7.2 命令完成指示使能


????????如果設置SDIO_CMD[12]中的“允許CMD結(jié)束位”并且設置了SDIO_CMD[13]中的“非中斷使
能位”, CPSM在Waitcpl狀態(tài)下等待命令完成信號。
當在CMD信號上收到’0’, CPSM進入空閑狀態(tài)。在個7位周期之內(nèi)不能發(fā)送新命令。然后,在最
后5個周期(上述7個周期之外),在推挽模式下CMD信號變?yōu)椤?’。

3.7.3 CE-ATA中斷


????????命令完成是由狀態(tài)位SDIO_STA[23]通知CPU,使用清除位SDIO_ICR[23]可以清除該位。
根據(jù)屏蔽位SDIO_MASKx[23]的設置, SDIO_STA[23]狀態(tài)位可以在每一個中斷線上產(chǎn)生中斷。


3.7.4 中止CMD61


????????如果還未發(fā)送”命令完成指示關閉”信號,但需要中止CMD61命令,命令狀態(tài)機必須被關閉。然后它變成空閑,并且可以發(fā)送CMD12命令。在此操作期間,不傳送”命令完成指示關閉”信號。

3.8 硬件流控制


????????使用硬件流控制功能可以避免FIFO下溢(發(fā)送模式)和上溢(接收模式)錯誤。
操作過程是停止SDIO_CK并凍結(jié)SDIO狀態(tài)機,在FIFO不能進行發(fā)送和接收數(shù)據(jù)時,數(shù)據(jù)傳輸
暫停。只有由SDIOCLK驅(qū)動的狀態(tài)機被凍結(jié), AHB接口還在工作。即使在流控制起作用時,仍
然可以讀出或?qū)懭隖IFO。
必須設置SDIO_CLKCR[14]位為’1’,才能使能硬件流控制。復位后,硬件流控制功能關閉。文章來源地址http://www.zghlxwxcb.cn/news/detail-559428.html

到了這里,關于STM32——SDIO的學習(驅(qū)動SD卡)(理論篇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • stm32在SDIO模式下SD寫入錯誤的問題

    stm32在SDIO模式下SD寫入錯誤的問題

    1、問題描述 使用FAT32 f_write 多次執(zhí)行寫操作時,會報FR_DISK_ERR錯誤,而且是剛開始寫不報錯,寫幾次后會一直報錯。 設斷點跟蹤到HAL_SD_WriteBlocks中,在調(diào)用SDMMC_CmdWriteMultiBlock時,會報SDMMC_ERROR_TX_UNDERRUN,意思 是Transmit FIFO underrun 2、原因分析 如下圖所示,SDMMC開始寫操作時,首

    2023年04月24日
    瀏覽(31)
  • STM32CubeMX系列09——SDIO(SD卡讀寫、SD卡移植FATFS文件系統(tǒng))

    STM32CubeMX系列09——SDIO(SD卡讀寫、SD卡移植FATFS文件系統(tǒng))

    ==== 文章匯總(有代碼匯總) ==== 準備看看這方面的知識,一時間還沒不清有什么區(qū)別,先補補課,不需要的跳過。 參考文章(內(nèi)容來源):http://www.360doc.com/content/21/1125/22/59057945_1005908465.shtml 主要寫這兩個:SD卡、TF卡 共同點:SD、TF、MMC都是在MMC基礎上演化發(fā)展不同的規(guī)范,

    2024年02月09日
    瀏覽(25)
  • STM32對SD卡的讀、寫、擦除操作(SDIO模式)(DMA)

    STM32對SD卡的讀、寫、擦除操作(SDIO模式)(DMA)

    對于STM32操作SD卡來說,最重要的就算 初始化 、 寫操作 、 讀操作 、 擦除 這幾個操作了。 對于初始化部分上一篇文章已經(jīng)分析,本篇就主要分析寫、讀、擦除操作。 本篇函數(shù)來自于 STM32提供的例程 。參考野火的程序進行了解釋,與野火函數(shù)有些不同。 這幾種函數(shù)完成之后

    2023年04月08日
    瀏覽(20)
  • STM32CubeMX教程28 SDIO - 使用FatFs文件系統(tǒng)讀寫SD卡

    正點原子stm32f407探索者開發(fā)板V2.4 STM32CubeMX軟件(Version 6.10.0) keil μVision5 IDE(MDK-Arm) ST-LINK/V2驅(qū)動 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX軟件配置STM32F407開發(fā)板 SDIO使用FatFs中間件讀寫4線SD卡,并實現(xiàn)以輪詢方式讀寫SD卡或以DMA方式讀取SD卡 FatFs文件系統(tǒng)相關知識請讀者

    2024年02月19日
    瀏覽(30)
  • STM32F4X SDIO(七) 例程講解-SD_InitializeCards & SD_GetCardInfo

    STM32F4X SDIO(七) 例程講解-SD_InitializeCards & SD_GetCardInfo

    本節(jié)例程基于 野火電子的STM32F407的SD卡讀寫例程 進行講解。上一節(jié)中講解了SD卡上電過程,這節(jié)將會講解一下SD卡的初始化過程,包括 獲取SD卡的CID、CSD和SD卡RCA地址 。 CMD2的作用是 通知所有卡通過CMD線返回CID值 ,CID值包括 SD卡的識別號、制造商ID、OEMID、產(chǎn)品名稱、版本號、

    2024年02月05日
    瀏覽(18)
  • 嵌入式Linux&Android開發(fā)-WiFi&BT SDIO調(diào)試

    嵌入式Linux&Android開發(fā)-WiFi&BT SDIO調(diào)試

    目錄 ? 一、基本概念 WiFi STA 模式 和 AP 模式 SDIO(Secure Digital I/O) SDIO-WiFi 模塊 二、項目中WiFi說明 三、rockchip WiFi啟動流程簡介 WiFi應用部分 wpa_supplicant 四、RK WiFi驅(qū)動移植流程 4.1 BSP已支持WiFi 4.2 BSP未支持WiFi 五、排查流程 5.1 檢查DTS 5.2 排查DTS對應的GPIO設置 5.3檢查電壓電平

    2023年04月08日
    瀏覽(47)
  • STM32F4X SDIO(四) SDIO控制器

    STM32F4X SDIO(四) SDIO控制器

    STM32F4X內(nèi)部有一個SDIO控制器,開發(fā)者可以使用這個控制器跟SD卡進行通信,下面就來簡單了解一下STM32F4X的SDIO控制器的使用。 下圖為STM32F4X的SDIO控制器框圖,框圖可以分為以下5部分, 適配器寄存器 、 FIFO 、 控制單元 、 命令路徑 、 數(shù)據(jù)路徑 。 SDIO控制器時鐘 STM32F4X的所有

    2024年02月07日
    瀏覽(39)
  • stm32中的SDIO

    stm32中的SDIO

    存儲單元是存儲數(shù)據(jù)部件,存儲單元通過存儲單元接口與卡控制單元進行數(shù)據(jù)傳輸; 電源檢測單元保證SD卡工作在合適的電壓下,如出現(xiàn)掉電或上狀態(tài)時,它會使控制單元和存儲單元接口復位; 卡及接口控制單元控制SD卡的運行狀態(tài),它包括有8個寄存器; 接口驅(qū)動器控制S

    2024年02月19日
    瀏覽(20)
  • STM32嵌入式系統(tǒng):將數(shù)據(jù)保存到SD卡的操作

    STM32嵌入式系統(tǒng):將數(shù)據(jù)保存到SD卡的操作 嵌入式系統(tǒng)在現(xiàn)代科技中扮演著重要角色,而STM32單片機是一種常用的嵌入式系統(tǒng)解決方案。本文將介紹如何使用STM32單片機將采集到的數(shù)據(jù)以TXT文件的格式保存到SD卡中,并且能夠方便地讀取這些本地數(shù)據(jù)。 硬件準備 為了實現(xiàn)數(shù)據(jù)保

    2024年02月01日
    瀏覽(46)
  • SDIO讀寫SD卡速度有多快?

    SDIO讀寫SD卡速度有多快?

    前兩天測試了SPI方式讀寫SD卡的速度《SPI方式讀寫SD卡速度測試》,今天來測試一下SDIO方式的讀寫速度。 測試條件: 單片機:STM32F407VET6 編譯環(huán)境:MDK 5.30+HAL庫 SD卡:閃迪32GB/64GB TF卡 文件系統(tǒng):FatFS R0.12c 之前測試中說過了,非DMA方式速度和資源利用率都不如DMA方式,所以今

    2024年02月02日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包