如何使用MMC / SDC
該安全數字存儲卡(以下SDC)是一個用于移動裝置的事實上的标準存儲卡。SDC被開發為與多媒體卡(下面的MMC)的上部相容。在大多數情況下,SDC完井裝置也可以使用MMC。還有縮小尺寸的版本,例如RS-MMC,miniSD和microSD,具有相同的功能。MMC / SDC中有一個微控制器。閃存控制(塊大小轉換,糾錯和磨損級别 - 稱為FTL)在存儲卡内部完成。資料以512位元組為機關作為資料塊在存儲卡和主機控制器之間傳輸,是以從上層層的視點可以看作是像通用硬碟驅動器那樣的塊裝置。
本頁介紹了使用MMC / SDC和小型嵌入式系統時所了解的基本知識和其他内容。我相信這些資訊對于将要在電子手工項目中使用MMC / SDC的人來說必須是一個有用的入門說明。
- 引腳
- SPI模式
- SPI模式的初始化過程
- 資料傳輸
- 對公共汽車浮動和熱插入的考慮
- 對多從配置的考慮
- 最大SPI時鐘頻率
- 檔案系統
- 寫性能的優化
- 執照
- 連結
引腳
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicWZwpmL0NWY052bj9VbtR2cvwVYtl2LcNWbt9CXzN2bk9CXnJ3bu4WYoNWLtxWZvw1LcpDc0RHaiojIsJye.jpeg)
miniSD | 的microSD
右圖顯示了SDC / MMC的接觸面。MMC有七個接觸墊。SDC有九個接觸墊,與MMC有兩個額外的接觸點。三個觸點被配置設定用于供電,是以有效信号的數量是四個(MMC)和六個(SDC)。是以,主機和卡之間的資料傳輸是通過同步串行接口完成的。
工作電源電壓範圍由操作條件寄存器(OCR)訓示,應在讀卡時确認卡初始化時的工作電壓範圍。但是,電源電壓也可以固定在3.0到3.3伏之間,而不需要任何确認,因為所有MMC / SDC的工作電壓至少為2.7到3.6伏。請勿向卡提供5.0伏電壓,否則卡會立即損壞。寫入操作的電流消耗可達到大約10毫安,是以主機系統應考慮向該卡提供100毫安。
SPI模式
SPI模式的最小設定
本文檔介紹了用于控制MMC / SDC的SPI模式。SPI模式是一種替代操作模式,定義為在沒有本機主機接口的情況下使用MMC / SDC。與其本機操作模式相比,SPI模式的通信協定有點簡單。MMC / SDC可通過通用SPI接口或某些GPIO端口連接配接到大多數微控制器。是以,SPI模式适用于低成本嵌入式應用,無需本機主機接口。有四種不同的SPI模式,0到3,取決于時鐘相位和極性。SPI模式0是為SDC定義的。對于MMC,它不是SPI規範,鎖存和移位操作都是在SCLK的上升沿定義的,但它似乎在SPI模式下工作在模式0。是以SPI模式為0(CPHA = 0,CPOL = 0)是控制MMC / SDC的正确設定,但模式3(CPHA = 1,CPOL = 1)在大多數情況下也能正常工作。DO上的上拉不能被省略,或者某些卡将無法初始化過程。
指令和響應
在SPI模式下,信号線上的資料方向是固定的,資料以位元組為機關的串行通信傳輸。從主機到卡的指令幀是固定長度的資料包,如下所示。當卡驅動DO為高時,該卡已準備好接收指令幀。在向卡發送指令幀之後,從卡發回對指令(R1,R2,R3或R7)的響應。由于資料傳輸由主機控制器生成的串行時鐘驅動,是以主機控制器必須繼續讀取資料,發送0xFF并擷取接收位元組,直到檢測到有效響應。在讀傳輸期間,DI信号必須保持高電平(發送0xFF并擷取接收的資料)。響應在指令響應時間内發回(N CR),SDC為0到8個位元組,MMC為1到8個位元組。在發送指令幀之前必須将CS信号從高電平變為低電平,并在事務期間将其保持為低電平(指令,響應和資料傳輸,如果存在)。在SPI模式下,CRC功能是可選的。卡不會檢查指令幀中的CRC字段。
SPI指令集
每個指令都以縮寫形式表示,如GO_IDLE_STATE或CMD <n>,<n>是指令索引的編号,值可以是0到63.下表僅描述了通常用于通用讀/寫和卡的指令初始化。有關所有指令的詳細資訊,請參閱MMCA和SDA的規格表。
指揮 指數 | 争論 | 響應 | 資料 | 縮寫 | 描述 |
---|---|---|---|---|---|
CMD0 | 無(0) | R1 | 沒有 | GO_IDLE_STATE | 軟體重置。 |
CMD1 | 無(0) | R1 | 沒有 | SEND_OP_COND | 啟動初始化過程。 |
ACMD41(* 1) | * 2 | R1 | 沒有 | APP_SEND_OP_COND | 僅适用于SDC。啟動初始化過程。 |
CMD8 | * 3 | R7 | 沒有 | SEND_IF_COND | 僅适用于SDC V2。檢查電壓範圍。 |
CMD9 | 無(0) | R1 | 是 | SEND_CSD | 讀CSD寄存器。 |
CMD10 | 無(0) | R1 | 是 | SEND_CID | 讀CID寄存器。 |
CMD12 | 無(0) | R1B | 沒有 | STOP_TRANSMISSION | 停止閱讀資料。 |
CMD16 | 塊 長[31:0] | R1 | 沒有 | SET_BLOCKLEN | 更改R / W塊大小。 |
CMD17 | 位址[31:0] | R1 | 是 | READ_SINGLE_BLOCK | 讀一個街區。 |
CMD18 | 位址[31:0] | R1 | 是 | READ_MULTIPLE_BLOCK | 讀多個塊。 |
CMD23 | 塊數[15:0] | R1 | 沒有 | SET_BLOCK_COUNT | 僅适用于MMC。 使用下一個多塊讀/寫指令定義要傳輸的塊數。 |
ACMD23(* 1) | 塊數[22:0] | R1 | 沒有 | SET_WR_BLOCK_ERASE_COUNT | 僅适用于SDC。 使用下一個多塊寫入指令定義要預擦除的塊數。 |
CMD24 | 位址[31:0] | R1 | 是 | WRITE_BLOCK | 寫一個塊。 |
CMD25 | 位址[31:0] | R1 | 是 | 識别卡一旦 | 寫多個塊。 |
CMD55(* 1) | 無(0) | R1 | 沒有 | APP_CMD | ACMD <n>指令的主要指令。 |
CMD58 | 無(0) | R3 | 沒有 | READ_OCR | 閱讀OCR。 |
* 1:ACMD <n>表示CMD55-CMD <n>的指令序列。 * 2:Rsv(0)[31],HCS [30],Rsv(0)[29:0] * 3:Rsv(0)[31:12],電源電壓(1)[11:8],檢查圖案(和0xAA)[7:0] |
SPI響應
有一些指令響應格式,R1,R2,R3和R7,取決于指令索引。對于大多數指令,傳回一個響應位元組R1。R1響應的位字段顯示在右圖中,值0x00表示成功。發生任何錯誤時,将設定響應中的相應狀态位。R3 / R7響應(R1 +尾随32位資料)僅适用于CMD58和CMD8。
某些指令花費的時間比N CR長,并且它響應R1b。它是一個R1響應,後跟忙标志(隻要内部程序正在進行,DO就會被驅動為低電平)。主機控制器應等待程序結束,直到DO變為高電平(接收到0xFF)。
SPI模式的初始化過程
上電複位後,MMC / SDC進入其本機工作模式。要将其設定為SPI模式,必須按照此流程執行以下過程。
電源開啟或卡片斷裂
電源電壓達到2.2伏後,至少等待一毫秒。将SPI時鐘速率設定在100 kHz和400 kHz之間。将DI和CS設定為高電平,并向SCLK施加74或更多時鐘脈沖。該卡将進入其本機操作模式并準備接受本機指令。
軟體重置
發送CS為低電平的CMD0以複位卡。CMD0上的卡樣本CS信号被成功接收。如果CS信号為低電平,則卡進入SPI模式,并以In空閑狀态位(0x01)響應R1。由于CMD0必須作為本機指令發送,是以CRC字段必須具有有效值。當卡進入SPI模式時,CRC功能被禁用,并且卡不會檢查CRC,是以可以使用僅對CMD0和CMD8有效且參數為零的寫死CRC值寫入指令傳輸例程。CRC功能也可以通過CMD59進行切換。
初始化
在空閑狀态下,卡僅接受CMD0,CMD1,ACMD41,CMD58和CMD59。任何其他指令都将被拒絕。此時,讀取OCR寄存器并檢查卡的工作電壓範圍。如果系統的電壓超出工作電壓範圍,則必須拒絕該卡。請注意,所有卡的供電電壓範圍至少為2.7至3.6伏,是以如果電源電壓在此範圍内,主機控制器無需檢查OCR。當接收到CMD1時,卡啟動初始化過程。要檢測初始化過程的結束,主機控制器必須發送CMD1并檢查響應,直到初始化結束。當卡成功初始化時,R1響應中的空閑狀态位被清除(R1 resp将0x01更改為0x00)。初始化過程可以采取數百毫秒(大卡往往更長),是以這是确定逾時值的考慮因素。在空閑狀态位清零後,将能夠接受通用讀/寫指令。
因為建議SDM使用ACMD41而不是CMD1,是以首先嘗試使用ACMD41,如果被拒絕則重試CMD1,這對于支援兩種類型的卡都是理想的選擇。
應盡可能快地将SCLK速率更改為最大化讀/寫性能。CSD寄存器中的TRAN_SPEED字段表示卡的最大時鐘速率。在大多數情況下,MMC的最大時鐘頻率為20MHz,SDC的最大時鐘頻率為25MHz。請注意,在SPI模式下,時鐘速率可以固定為20 / 25MHz,因為沒有開漏條件限制時鐘速率。
初始讀/寫塊長度可以在2GB卡上設定為1024,是以應使用CMD16将塊大小重新初始化為512以與FAT檔案系統一起使用。
初始化高容量卡
卡通過CMD0進入空閑狀态後,發送參數為0x000001AA 的CMD8,并在初始化過程之前糾正CRC。如果CMD8因illigal指令錯誤(0x05)而被拒絕,則該卡為SDC版本1或MMC版本3.如果接受,将傳回R7響應(R1(0x01)+ 32位傳回值)。傳回值0x1AA中的低12位表示該卡是SDC版本2,它可以在2.7到3.6伏的電壓範圍内工作。如果不是這種情況,則應拒絕該卡。然後使用帶有HCS标志的ACMD41啟動初始化(第30位)。初始化完成後,使用CMD58讀取OCR寄存器并檢查CCS标志(第30位)。設定時,該卡是一種稱為SDHC / SDXC的高容量卡。下面描述的資料讀/寫操作在位元組尋址的塊尋址中被指令。塊尋址模式下資料塊的大小固定為512位元組。
資料傳輸
資料包和資料響應
在具有資料傳輸的事務中,在指令響應之後将發送/接收一個或多個資料塊。資料塊作為由令牌,資料塊和CRC組成的資料包傳輸。資料包的格式顯示在右圖中,有三個資料令牌。Stop Tran令牌是終止多塊寫入事務,它用作沒有資料塊和CRC的單位元組資料包。
單塊讀取
參數指定以位元組或塊為機關開始讀取的位置。必須正确縮放上層指定的LBA中的扇區位址。當接受CMD17時,啟動讀操作,并将讀資料塊發送到主機。在檢測到有效資料令牌之後,主機控制器接收以下資料字段和CRC。即使不需要,也必須接收CRC位元組。如果在讀取操作期間發生任何錯誤,将傳回錯誤令牌而不是資料包。
多塊讀取
CMD18将從指定位置讀取序列中的多個塊。讀取操作繼續以開放式結束。要終止交易,請将CMD12發送到卡。CMD12之後接收到的位元組immediataly是一個填充位元組,它應該在接收CMD12的響應之前被丢棄。對于MMC,如果在CMD18之前CMD23已經指定了傳輸塊的數量,則讀取事務作為預定義的多塊傳輸啟動,并且讀取操作在最後的塊傳輸時終止。
單塊寫入
單塊寫入将塊寫入卡。在接受CMD24之後,主機控制器将資料包發送到卡。資料包格式與塊讀取操作相同。大多數卡不能改變寫入塊大小,并且固定為512.除非啟用CRC功能,否則CRC字段可以具有任何固定值。該卡響應來自主機的資料包的資料響應immediataly。資料響應跟蹤忙标志,主機控制器必須等待卡準備就緒。
原則上,SPI模式必須在事務期間保持CS信号有效。但是這個規則有一個例外。當卡忙時,主機控制器可以取消CS,以釋放總線上其他SPI裝置的SPI總線。在内部過程中重新選擇時,卡将再次将DO驅動為低電平。是以,在前面的繁忙檢查中,檢查每個指令和資料包之前卡是否繁忙,而不是等待後等待可以消除繁忙的等待時間。此外,内部寫過程在資料響應後的一個位元組處啟動,這意味着需要8個SCLK時鐘來啟動内部寫操作。後時鐘期間CS信号的狀态可以是低或高,是以可以通過下面描述的總線釋放過程來完成。
多塊寫入
Multiple Block Read指令從指定位置寫入序列中的多個塊。在接受CMD25之後,主機控制器将一個或多個資料包發送到卡。除資料令牌外,資料包格式與塊讀取操作相同。寫操作繼續,直到使用Stop Tran令牌終止。busy标志将在每個資料塊和Stop Tran令牌之後輸出。對于MMC,要寫入的塊數可以在CMD25之前由CMD23預定義,寫入事務在最後一個資料塊處終止。對于SDC,可以在CMD25之前由ACMD23指定在寫入事務開始時預擦除的扇區數。始終需要Stop Tran令牌來終止寫入事務。
閱讀CSD和CID
除資料塊長度外,它們與單塊讀取相同。CSD和CID作為16位元組資料塊發送到主機。有關CMD,CID和OCR的詳細資訊,請參閱MMC / SDC規範。
對公共汽車浮動和熱插入的考慮
可以浮動的SPI信号應通過電阻器正确拉低或拉高。這是CMOS器件上的通用設計規則。因為DI和DO通常很高,是以應該将它們拉高。根據SDC / MMC規範,建議将上拉寄存器的值從50k到100k歐姆。但是SDC / MMC規範中沒有提到時鐘信号,因為它總是由主機控制器驅動。當有可能浮動時,它應該被拉到正常狀态,低。
MMC / SDC可以熱插入/移除。但是需要對主機電路進行一些考慮以避免不正确的操作。例如,如果系統電源(Vcc)直接連接配接到卡插槽,則由于卡的内置電容器的充電電流,Vcc将在卡插入的瞬間下降。右圖中的“A”是示波器視圖,它表明發生的電壓驟降約為600 mV。這是觸發掉電探測器的足夠水準。右圖中的“B”表示插入電感器以阻止浪湧電流,電壓驟降降至200 mV。低ESR電容,例如OS-CON,可以像'C'中所示的那樣消除電壓驟降。然而,低ESR電容會引起LDO穩壓器的振蕩。
對多從配置的考慮
在SPI總線中,每個從器件都選擇有獨立的CS信号,多個器件可以連接配接到SPI總線。通用SPI從裝置通過CS信号異步驅動/釋放其DO信号以共享SPI總線。但是,MMC / SDC驅動/釋放DO信号與SCLK同步。這意味着與MMC / SDC以及連接配接到SPI總線的任何其他SPI從裝置存在總線沖突的可能性。右圖顯示了MMC / SDC的驅動/釋放時序(DO信号被拉至1/2 vcc以檢視總線狀态)。是以,為了讓MMC / SDC釋放DO信号,主器件必須在CS信号置為無效後發送一個位元組。
最大SPI時鐘頻率
MMC / SDC可以在高達20/25 MHz的時鐘頻率下工作。當然,所有本機接口都保證以最大時鐘頻率工作。但是,由于時序問題,內建在微控制器中的通用SPI接口可能無法在高時鐘頻率下工作。右圖顯示了SPI接口的時序圖。在SPI模式0/3中,資料在SCLK的下降沿移出,并在下一個上升沿鎖存。td是SDC的SCLK到DO傳播延遲,最大值為14ns。tsu是MISO輸入的最小設定時間。是以,最大允許SCLK頻率可通過以下公式計算:
F SCLK(max) = 0.5 /(td + tsu)
根據時序規範,我使用的一些微控制器限制在10 MHz左右的允許時鐘頻率。
檔案系統
MMC / SDC上使用的檔案系統是FAT。MMC / SDC規範将FAT類型定義為:FAT12為64MB或更小,FAT16為128MB到2GB,FAT32為4GB到32GB,exFAT為64GB到2TB。使用FDISK分區的卡上隻能存在FAT卷,不允許使用像軟碟那樣的更新檔表。當然,除了MMC / SDC規範定義之外的不同檔案系統和分區可以用作PC的通用存儲媒體。然而,這些具有illigal格式的卡可能不被DSC,便攜式錄影機和電視接受。
寫性能的優化
大多數MMC / SDC采用NAND閃存作為存儲器陣列。NAND閃存具有成本效益,并且可以快速讀/寫大資料,但另一方面,存在重寫一部分資料效率低的缺點。通常,閃存需要在寫入新資料之前擦除現有資料,并且最小擦除操作單元(稱為擦除塊)大于寫入塊大小。典型的NAND閃存具有512 / 16K位元組的塊大小用于寫入/擦除操作,并且最近的怪物卡采用大塊晶片(2K / 128K)。這意味着即使隻寫扇區(512位元組),也可以在卡中重寫擦除塊中的整個資料。
基準
我假設一個記憶體大小有限的嵌入式系統,我用一個便宜的8位MCU(ATmega64 @ 9.2MHz)檢查了一些MMC / SDC的讀/寫性能。出于記憶體大小的原因,write()和read()一次以2048位元組執行。結果是:寫入:77kB /秒,讀取:128MB SDC為 328kB /秒,寫入:28kB /秒,讀取:512MB SDC為234kB /秒,寫入:182kB /秒,讀取:128MB為 312kB /秒MMC。
通過稍後的一些基準測試,我猜MMC在寫入吞吐量方面往往比SDC更快。
是以,512MB SDC的寫入性能非常差,即128MB SDC的三分之一值。通常,大容量儲存設備的讀/寫性能與其記錄密度成比例地增加,但是有時在存儲卡上出現相反的趨勢。至于MMC,它似乎比SDC快幾倍,性能也不差。在那之後,我檢查了不同制造商提供的一些SDC,我發現PQI的SDC和日立的MMC一樣快,但松下和東芝的SDC表現非常糟糕。
擦除塊大小
為了分析寫操作的細節,在發送寫資料之後的忙時(輪詢周期數)在低級磁盤寫功能中輸入到控制台。一行中的多個數字表示由多個塊寫入事務發出的資料塊和Stop Tran令牌。
在分析結果中,128MB SDC和512MB SDC之間存在不同的内部過程。128MB SDC在多塊寫入事務結束時重寫擦除塊。512MB SDC似乎具有4K位元組資料緩沖區,并且每4K位元組邊界重寫擦除塊。是以,它不能直接比較,但是對于128MB SDC,重寫擦除塊的處理時間可以被讀取3800,而對于128MB SDC,可以讀取512MB SDC 30000比8倍長的處理時間。從這個結果來看,似乎128MB SDC使用小塊晶片,512MB SDC使用大塊或MLC晶片。當然,較大的塊大小會降低相應塊重寫的性能。在512MB SDC中,隻有從記憶體頂部512K位元組的區域相對較快。這可以從close()中的寫入時間讀取。可能會對此區域應用任何特殊處理以快速進行FAT跟蹤。
提高寫性能
為避免此瓶頸并提高寫入性能,每個寫入事務的塊數必須盡可能大。當然,應用程式和媒體之間的所有層都必須支援多扇區寫入功能。對于低級SDC / MMC寫入功能,它應該在寫入事務之前通知卡的寫入扇區的數量,以進行有效的内部寫入過程。這種方法稱為“預定義多塊寫入”。MMC(CMD23)和SDC(ACMD23)之間的預定義指令不同。
最初對存儲卡進行修補和格式化以使配置設定單元與擦除塊邊界對齊。當使用不相容MMC / SDC的裝置重新格式化或重新格式化存儲卡(這隻是一台PC)時,優化将被破壞,寫入性能可能會丢失。我嘗試使用PC的通用格式功能在FAT32中重新格式化512MB SDC,在檔案副本中測量的寫入性能降低到幾個。是以,應使用SD格式實用程式或符合SDC / MMC标準的裝置重新格式化卡。
執照
MMC規範由MMCA(多媒體卡協會)提供,然後轉移到JEDEC。開發和銷售MMC産品不需要任何許可證。但是,MMC規範不向公衆開放,您需要加入JEDEC以擷取技術文檔。
SD規範是由SDA(SD卡協會)和SD-3C,LLC開發和提供的産品。銷售任何SD規格産品的每個組織或個人都必須獲得SDA的許可。例如,需要HALA(主機和輔助産品許可協定)來銷售任何表明支援SD卡的SD主機産品,無論使用哪種接口,SD模式或SPI模式。對于中間産品,例如嵌入式子產品,子產品銷售商或最終産品需要許可證。隻有被許可人才能在産品,包裝和手冊上放置SD徽标。普通會員的入場費為2,000美元,HALA的許可費為每年1,000美元。
每個産品都聲明支援SD卡需要獲得許可。換句話說,該産品不支援SD卡不需要許可,即使它實際上支援SD卡。為了避免許可證問題,一些吝啬的裝置制造商包括主要公司“支援MMC”,“支援MMC和相容機”或“支援TF卡”。多麼廢話!
連結
- e.MMC | JEDEC
- SDA - SD卡協會
- SDHC實體層規範 由SDA
- 關于SPI
- 通用FAT檔案系統子產品,帶有控制MMC / SDSC / SDHC的示例代碼