本文演示如何使用安全數(shù)字(SD)介質(zhì)格式擴展MAXQ2000的非易失性數(shù)據(jù)存儲。
低功耗、低噪聲MAXQ2000微控制器適用于多種應(yīng)用。MAXQ2000將非易失數(shù)據(jù)存儲在閃存中,具有32k字(64kB)閃存容量,與用戶代碼空間共享。但是,如果您的應(yīng)用程序需要更多非易失性存儲,該怎么辦?本文演示如何使用安全數(shù)字 (SD?)介質(zhì)格式,以擴展MAXQ2000的非易失性數(shù)據(jù)存儲。
外部存儲的設(shè)計注意事項
應(yīng)用的首要設(shè)計考慮因素是電源電壓和電流要求。在典型的MAXQ2000應(yīng)用中,采用雙通道線性穩(wěn)壓器來運行處理器內(nèi)核電壓(VDD) 以所選設(shè)計時鐘速率所需的最低電壓。The MAXQ2000 VDD電源可低至 1.8V。MAXQ2000上的I/O引腳由V供電迪奧,其允許的較低范圍為 VDD上限為3.6V。外部存儲的可接受電流消耗取決于電源的額定電流,如果是電池供電設(shè)備,則取決于電池系統(tǒng)的容量。
其次,用于連接外部存儲器的MAXQ2000 I/O線數(shù)量必須保持在最低限度,同時仍能為預期應(yīng)用提供足夠的帶寬。例如,Atmel AT29LV512 閃存芯片在與主機微控制器連接時需要 15 條地址線、2000 條數(shù)據(jù)線和 2000 條控制線。由于MAXQ<>沒有外部地址/數(shù)據(jù)總線,因此在該示例中需要軟件控制總線事務(wù)。對于某些應(yīng)用,該方法不能有效利用MAXQ<>的I/O引腳。
SPI?和我2然而,基于 C 的外部閃存設(shè)備只需要三個或四個接口引腳。MAXQ2000具有硬件SPI模塊,而2C必須由用戶在MAXQ2000上軟件中實現(xiàn)(即“位敲擊”)。這種集成功能意味著SPI接口是訪問外部非易失性存儲器的主要途徑。
SD 存儲卡格式
SD介質(zhì)格式是一種非易失性外部存儲器,可滿足許多應(yīng)用的上述考慮因素。SD格式是“多媒體卡”格式或MMC的繼承者。SD卡存儲器通常采用3.3V電源供電,電流要求適中。SD卡容量范圍從幾兆字節(jié)到最大容量4GB。這種廣泛的可用尺寸為許多應(yīng)用提供了充足的外部存儲空間。
乍一看,SD似乎不能輕易與MAXQ2000連接,因為前者專有的共享總線。但是,SD繼承了MMC的輔助總線格式SPI。因此接口很簡單,因為MAXQ2000包含對SPI的硬件支持。
圖1.MAXQ2000可輕松連接至SD存儲卡。
圖1所示為典型應(yīng)用電路。SD 卡需要全雙工 8 位 SPI 操作。數(shù)據(jù)從MAXQ2000的MOSI引腳輸入卡的DI引腳,從卡的DO線進入MAXQ2000的MISO引腳。數(shù)據(jù)在CLK線的上升沿同時輸入和傳出卡。每筆交易結(jié)束時必須提供八個額外的時鐘,以允許SD卡完成任何未完成的操作。這些額外時鐘期間的輸入數(shù)據(jù)必須全部為 400。在識別階段,時鐘速率必須限制為最大25kHz,但一旦識別SD卡,時鐘速率可以增加到<>MHz。
MAXQ2000 SPI模塊
MAXQ2000包含一個硬件SPI模塊,易于配置為SD卡接口。為了配置時鐘極性和數(shù)據(jù)長度,SPICF寄存器被編程為全零。這將SPI模塊配置為在上升時鐘邊沿鎖存數(shù)據(jù),并將數(shù)據(jù)長度設(shè)置為2000位。對于該應(yīng)用,MAXQ16的系統(tǒng)時鐘頻率為0MHz。在這種情況下,SPICK寄存器被編程為28x380,從而產(chǎn)生大約<>kHz的SPI時鐘。必須通過設(shè)置 SPICN 寄存器的兩個較低位來啟用 SPI 主模式。
標清 SPI 數(shù)據(jù)格式
SD 卡的 SPI 協(xié)議類似于其 SD 總線協(xié)議。沒有數(shù)據(jù)要發(fā)送的卡不會在每個時鐘邊沿從SD卡的DO引腳接收有效數(shù)據(jù),而是將DO引腳保持在所有時鐘邊沿的空閑狀態(tài)。當卡有數(shù)據(jù)要發(fā)送回主機時,在數(shù)據(jù)之前發(fā)送起始位為零的專用令牌。從SD卡傳輸?shù)乃袛?shù)據(jù)都會在這些令牌之后立即發(fā)送,并且長度固定。由于接收方事先知道預期的字節(jié)數(shù),因此響應(yīng)中不包含長度字節(jié)。此外,由于在發(fā)送啟動令牌和數(shù)據(jù)之前不會發(fā)生空閑狀態(tài),因此所有數(shù)據(jù)字節(jié)都將原封不動地傳輸,并且沒有前綴。與總線上的所有其他流量一樣,令牌在 SPI 事務(wù)的 8 位邊界上對齊。從主機到卡的命令和數(shù)據(jù)遵循類似的格式,所有 7 都表示空閑總線。除狀態(tài)令牌之外的所有事務(wù)都受附加到數(shù)據(jù)末尾的循環(huán)冗余校驗 (CRC) 代碼的保護。提供了兩種CRC算法:CRC-16用于短數(shù)據(jù)塊,CRC-<>用于較長的數(shù)據(jù)塊。CRC 是 SD SPI 接口的可選部分,但應(yīng)用于保證數(shù)據(jù)完整性,除非應(yīng)用限制阻止其使用。
循環(huán)冗余校驗
CRC算法通常用于檢測由不可靠的通信信道引起的錯誤。特定CRC的選擇取決于要保護的數(shù)據(jù)大小。對于標清介質(zhì),指定了CRC-7和CRC-16。
CRC算法將受保護的數(shù)據(jù)除以選定的除數(shù)并產(chǎn)生余數(shù)。由于算法中使用的多項式數(shù)學,這種除法是在沒有進位邏輯的情況下完成的。由于不需要進位,因此可以通過邏輯異或運算完成除法。選定的除數(shù)通常稱為CRC多項式。然后,生成的余數(shù)與數(shù)據(jù)一起傳輸,接收器可以使用該余數(shù)來檢查數(shù)據(jù)在傳輸過程中是否未損壞。
對于CRC-7,余數(shù)可以使用軟件中的7位移位寄存器進行計算。此移位寄存器在計算開始時初始化為所有零。當受保護數(shù)據(jù)的每個位(MSB優(yōu)先)移入移位寄存器的LSB時,移位寄存器的MSB被移出并檢查。如果剛剛移出的位是 7,則移位寄存器的內(nèi)容通過 XOR 與 CRC-0 多項式值 09x7 進行修改。如果移出移位寄存器的位為零,則不執(zhí)行異或。一旦受保護數(shù)據(jù)的最后一位被移入并且條件異或完成,就必須以類似的方式再移入七個零。此過程稱為增強,并完成多項式除法。此時,可以直接從移位寄存器讀取CRC-<>值。
圖2.CRC-7可以使用移位寄存器架構(gòu)進行計算。
當接收器擁有所有受保護的數(shù)據(jù)時,接收器可以計算受保護數(shù)據(jù)的CRC-7值,并將其與接收到的CRC-7值進行比較。如果值不同,接收方知道受保護的數(shù)據(jù)在傳輸過程中已損壞。如果值匹配,接收方可以高度確定地知道數(shù)據(jù)完整性不會受到通信信道的影響。
CRC-16算法可以用同樣的方式構(gòu)建。在這種情況下,移位寄存器的長度為16位而不是7位,多項式值更改為0x1021,輸入數(shù)據(jù)增加了16個零位。
SD 命令格式
命令以6字節(jié)格式發(fā)送到卡(圖3)。命令的第一個字節(jié)可以通過使用十六進制6x0對 40 位命令代碼進行 OR 運算來構(gòu)造。接下來的四個字節(jié)提供單個 32 位參數(shù)(如果命令需要);最后一個字節(jié)包含字節(jié) 7 到 1 的 CRC-5 校驗和。表 1 列出了重要的 SD 命令。
圖3.SPI 模式 SD 命令以 6 字節(jié)格式發(fā)送到卡。
命令 | 記憶 | 論點 | 答 | 描述 |
0 (0x00) | GO_IDLE_STATE | 沒有 | R1 | 重置 SD 卡。 |
9 (0x09) | SEND_CSD | 沒有 | R1 | 發(fā)送特定于卡的數(shù)據(jù)。 |
10 (0x0a) | SEND_CID | 沒有 | R1 | 發(fā)送卡標識。 |
17 (0x11) | READ_SINGLE_BLOCK | 地址 | R1 | 讀取字節(jié)地址處的塊。 |
24 (0x18) | WRITE_BLOCK | 地址 | R1 | 在字節(jié)地址處寫入塊。 |
55 (0x37) | APP_CMD | 沒有 | R1 | 應(yīng)用程序命令的前綴。 |
59 (0x3b) | CRC_ON_OFF | 僅位 0 | R1 | 參數(shù)將 CRC 設(shè)置為 (1) 或關(guān)閉 (0)。 |
41 (0x29) | SEND_OP_COND | 沒有 | R1 | 啟動卡初始化。 |
在 SPI 模式下初始化 SD 卡
上電時,SD 卡默認采用專有的 SD 總線協(xié)議。要將卡切換到 SPI 模式,主機發(fā)出命令 0 (GO_IDLE_STATE)。SD 卡通過觀察卡選擇 (CS) 引腳在GO_IDLE_STATE命令期間保持低電平來檢測 SPI 模式選擇??ㄒ皂憫?yīng)格式R1響應(yīng)(圖4)。空閑狀態(tài)位設(shè)置為高,表示卡已進入空閑狀態(tài)。為了保持與MMC卡的兼容性,在此階段SPI時鐘速率不得超過400kHz。
圖4.響應(yīng)格式 R1 指示發(fā)出的命令成功或失敗。
現(xiàn)在 SD 卡處于 SPI 模式,SD 規(guī)范要求主機先發(fā)出初始化命令,然后才能處理任何其他請求。為了區(qū)分 MMC 和 SD 卡,SD 卡實現(xiàn)了 MMC 卡不響應(yīng)的備用初始化命令。向卡發(fā)送命令 55 (APP_CMD) 后跟應(yīng)用程序命令 41 (SEND_OP_COND) 即可完成此重要步驟。MMC 卡不響應(yīng)命令 55,該命令可用于拒絕 MMC 卡作為無效介質(zhì)。重復此命令序列,直到來自卡的R1響應(yīng)中的所有位都為零(即空閑位變低)。
清單 1.代碼必須使用 SEND_OP_COND 標識 SD 和 MMC 卡。
SD 卡包含幾個重要的寄存器,這些寄存器提供有關(guān) SD 卡的信息。最重要的寄存器是卡特定數(shù)據(jù)寄存器(CSD)。對于我們的示例應(yīng)用程序,我們對內(nèi)存的塊大小和總大小感興趣。我們還必須注意卡識別數(shù)據(jù)寄存器(CID),因為它包含有關(guān)卡制造商和序列號的詳細信息。圖 5 顯示了 CSD 和 CID 寄存器的布局。
圖5.CSD 和 CID 寄存器提供有關(guān) SD 卡的信息。
檢查 SD 卡響應(yīng)
要從卡中讀取卡寄存器或塊,我們必須首先了解卡如何響應(yīng)我們的查詢。在 SPI 模式下,SD 卡使用 R9 格式回復命令SEND_CSD (10)、SEND_CID (17) 和READ_SINGLE_BLOCK (1)。接下來是開始令牌、請求的數(shù)據(jù),最后是數(shù)據(jù)的 CRC-16 校驗和。我們不能假設(shè) R1 回復和數(shù)據(jù)啟動令牌一個接一個地立即發(fā)生,因為總線可以在這兩個事件之間進入空閑狀態(tài)一段時間。圖 6 詳細介紹了數(shù)據(jù)響應(yīng)。
圖6.從 SD 卡到主機的數(shù)據(jù)傳輸以啟動令牌為前綴。
讀取懲教署和國際舞蹈委員會寄存器元數(shù)據(jù)
SEND_CSD 和 SEND_CID 命令發(fā)回用于確定 SD 卡參數(shù)的寄存器內(nèi)容。這些命令返回固定數(shù)量的字節(jié),分別對應(yīng)于 CSD 或 CID 寄存器的大小。這些 SEND 命令的 SD 卡將忽略命令字節(jié)中包含的參數(shù)。
從 SD 卡讀取數(shù)據(jù)塊
從SD卡讀取數(shù)據(jù)塊非常簡單。主機發(fā)出 READ_SINGLE_BLOCK 命令,并將起始字節(jié)地址作為參數(shù)。此地址必須與介質(zhì)上塊的開頭對齊。然后,SD 卡評估此字節(jié)地址,并使用 R1 命令回復進行響應(yīng)。命令回復中指示超出范圍的地址。
如果從 SD 介質(zhì)完成讀取而沒有錯誤,則會發(fā)送一個起始數(shù)據(jù)令牌,后跟固定數(shù)量的數(shù)據(jù)字節(jié)和兩個字節(jié)用于 CRC-16 校驗和。如果 SD 卡遇到硬件故障或介質(zhì)讀取錯誤,則不會發(fā)送啟動數(shù)據(jù)令牌。相反,將發(fā)送錯誤令牌并中止數(shù)據(jù)傳輸。
將數(shù)據(jù)塊寫入 SD 卡
寫入數(shù)據(jù)塊類似于讀取,因為主機必須提供與 SD 卡塊邊界對齊的字節(jié)地址。寫入塊大小必須等于 READ_BL_LEN,通常為 512 字節(jié)。通過發(fā)出 WRITE_BLOCK (24) 命令來啟動寫入,SD 卡使用 R1 命令響應(yīng)格式響應(yīng)該命令。如果命令響應(yīng)指示寫入可以繼續(xù),則主機將傳輸數(shù)據(jù)開始令牌,后跟固定數(shù)量的數(shù)據(jù)字節(jié),并以發(fā)送數(shù)據(jù)的 CRC-16 校驗和結(jié)束。SD 卡返回一個數(shù)據(jù)響應(yīng)令牌,指示接受或拒絕要寫入的數(shù)據(jù)。
如果數(shù)據(jù)被接受,SD卡在卡繁忙時將DO線持續(xù)保持低電平。主機沒有義務(wù)在繁忙時段保持卡選擇低電平,如果 CS 被取消斷言,SD 卡會釋放 DO 線路。當多個器件連接到SPI總線時,此過程非常有用。主機可以等待 SD 卡釋放忙音指示,也可以通過定期斷言芯片選擇來檢查卡。如果卡仍然繁忙,它將把 DO 線拉低以指示此狀態(tài)。否則,卡將 DO 線返回到空閑狀態(tài)(請參閱圖 7)。
圖7.從主機到 SD 卡的數(shù)據(jù)傳輸涉及更復雜的握手。
SPI 命令和數(shù)據(jù)錯誤檢測
CRC-7 和 CRC-16 校驗和可用于檢測主機和 SD 卡之間通信中的錯誤。錯誤檢測允許在發(fā)生物理引起的錯誤時進行可靠的錯誤恢復,例如插入和移除過程中的觸點反彈或可拆卸介質(zhì)固有的不理想的觸點配接情況。強烈建議使用校驗和,方法是使用參數(shù)中設(shè)置的最低位發(fā)出 CRC_ON_OFF (59) 命令。
清單 2.強烈建議啟用 CRC 校驗和。
結(jié)論
SD介質(zhì)卡格式代表了一種緊湊、低功耗的非易失性存儲器解決方案,適用于嵌入式系統(tǒng)。通過使用MAXQ2000微控制器提供的硬件SPI支持,可以以很小的開銷訪問SD介質(zhì)卡。Maxim提供的參考軟件演示了最小實現(xiàn),其中包括從SD卡讀取模塊和向SD卡寫入模塊所需的基本操作。
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7559瀏覽量
151486 -
嵌入式
+關(guān)注
關(guān)注
5083文章
19131瀏覽量
305549 -
存儲器
+關(guān)注
關(guān)注
38文章
7493瀏覽量
163879
發(fā)布評論請先 登錄
相關(guān)推薦
評論