如何使用MMC / SDC以及SPi

如何使用MMC / SDC

安全數字存儲卡(以下SDC)是一個用於移動設備的事實上的標準存儲卡。SDC被開發爲與多媒體卡(下面的MMC)的上部兼容。在大多數情況下,SDC完井設備也可以使用MMC。還有縮小尺寸的版本,例如RS-MMCminiSDmicroSD,具有相同的功能。MMC / SDC中有一個微控制器。閃存控制(塊大小轉換,糾錯和磨損級別 - 稱爲FTL)在存儲卡內部完成。數據以512字節爲單位作爲數據塊在存儲卡和主機控制器之間傳輸,因此從上層層的視點可以看作是像通用硬盤驅動器那樣的塊設備。

本頁介紹了使用MMC / SDC和小型嵌入式系統時所瞭解的基本知識和其他內容。我相信這些信息對於將要在電子手工項目中使用MMC / SDC的人來說必須是一個有用的入門說明。

  1. 引腳
  2. SPI模式
  3. SPI模式的初始化過程
  4. 數據傳輸
  5. 對公共汽車浮動和熱插入的考慮
  6. 對多從配置的考慮
  7. 最大SPI時鐘頻率
  8. 文件系統
  9. 寫性能的優化
  10. 執照
  11. 鏈接

引腳

SDC / MMC接觸面
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字段。

cmd框架

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響應

MMC和SDC

有一些命令響應格式,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卡”。多麼廢話!

鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章