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