---
title: Flash 記憶體的原理與應用—PART19
description: "**作者：Bird** 上一回[【Maker電子學】Flash 記憶體的原理與應…"
url: "https://makerpro.cc/docs/flash-memory-principle-and-application-part19/"
updated: "2025-03-31"
category: Flash記憶體
---

# Flash 記憶體的原理與應用—PART19

**作者：Bird**

上一回[【Maker電子學】Flash 記憶體的原理與應用—PART18](https://makerpro.cc/2024/12/flash-memory-principle-and-application-part18/)，我們介紹了 SD 卡的容量分級以及速度分級標準，並說明了達到不同傳輸速度所使用的技術，包含早期的單端邏輯訊號到較新的差動訊號等技術。這一回我們要開始從軟體的觀點，來看看如何存取 SD 卡或 eMMC。

### **卡片的電源**

在進入軟體的存取協定之前，我們還是要先來看幾個基本的硬體參數，其中最重要的就是電源。

早期的 SD 卡全部運作在 3.3 V（嚴格來說是 2.7 V 到 3.6 V）的電源及介面電壓，而在 SD 3.0 標準出來後，為了降低 EMI 及耗電，較新的 UHS-I 模式都使用 1.8 V（嚴格來說是 1.70 V 到 1.95 V）的介面電壓。由於較新的卡片支援不同的電壓，為了保證系統的相容性，讓舊的裝置可以使用新的卡片、新的裝置也可以使用舊的卡片，SD 卡在初始化的過程中有一個蠻複雜的辨認過程。

首先，為了保證系統的相容性，所有的 SD 卡在一開始工作時，都使用 3.3 V 供電，並使用 3.3 V 完成初始化以及一些卡片辨認的過程，包括卡片支援哪些速度、模式、電壓等。如果卡片支援較新的 1.8 V 低電壓模式，系統可以送出一個「切換電壓」的指令 CMD11，並與卡片同步將電壓從 3.3 V 切換到 1.8 V 的模式，一旦卡片切到 1.8 V 的工作模式，就只能停留在 1.8 V 的模式，直到斷電 reset 重來。

這裡有件事要特別注意的是，當卡片進入 1.8 V 模式時，只有卡片的 I/O 介面電壓（signaling voltage）變成 1.8 V，供應給卡片的電源始終維持 3.3 V 不會改變。

### **卡片的工作模式**

我們之前說過，SD卡從MMC演變過來時，保留了最早最古老的SPI模式，而SD協會也很佛心的在規格中要求所有的卡片都要向前相容到上古時代，直到SDUC出現後，SD協會才在規格中放寬，讓SDUC不用支援SPI模式。

為了SD標準的尊嚴，所有的SD卡在開機時都是處在SD bus模式，如果要將卡片設定成SPI模式，需要將 CS 接腳拉 low，同時送一次CMD0去 reset 卡片，這時卡片就會進入SPI模式。

在 SD 模式下，傳資料的 DAT0-3 都是雙向的，但 SPI 介面的每一隻腳都是固定方向的，我們有辦法用 SPI 介面傳送 CMD0 給 SD 卡的任務嗎？來看看 SD 模式與 SPI 模式的腳位對應就知道了：

 ![](https://makerpro.cc/wp-content/uploads/2025/01/Screenshot-2025-01-16-224210.png)

（圖片來源：Bird 提供）

SPI 模式的 MOSI 訊號剛好對應到送指令給 SD 卡的 CMD 接腳，因此我們可以用 SPI 的 MOSI 發送 CMD0 指令給 SD 卡，而 SD 卡收到指令後，會用 DAT0 訊號回應對指令的反應，這個訊號剛好接到 SPI 的 MISO，因此我們可以透過 MISO 讀取 SD 卡對 CMD0 指令的回答，來知道指令有沒有發送成功。當然，SD 模式的 clock 接腳也是 SPI 模式的 clock 接腳，所以在兩個模式下都使用這個 clock 訊號來取樣指令或資料訊號。

### **送指令**

SPI 模式的資料傳輸都是以 byte 為單位，而 SD 模式下的指令，又叫做 token，則是 48-bit，因此我們可以用 6 個 SPI 的 byte 傳輸來完成一次 CMD0 的發送。

SD 模式下的指令格式是這樣：

 ![](https://makerpro.cc/wp-content/uploads/2025/01/Screenshot-2025-01-16-224228.png)

（圖片來源：Bird 提供）

CMD0 的指令代碼就是 0b000000，而且它沒有參數，因此接下來 32 個 bits 填什麼都無所謂。但 SD 模式下預設要做 CRC 檢查，因此送完 32 個 bits 無關緊要的指令參數之後，需要送出一個正確的 CRC，卡片才會接收指令。SD 卡的 CRC 是用 x^7 + x^3 +1 這個多項式來計算的，如果指令參數全部送 0 的話，算出來的 7-bit CRC 就是 0x43。

整理一下上面的資料，我們要用 SPI 送出 CMD0 的資料就變成：

 ![](https://makerpro.cc/wp-content/uploads/2025/01/Screenshot-2025-01-16-224246.png)

（圖片來源：Bird 提供）

也就是說，只要用 SPI 依序送出 0x40, 0x00, 0x00, 0x00, 0x00, 0x87 六個 bytes，同時讓 CS 腳也就是 DAT3 維持在 low，SD 卡就會被 reset 後進入 SPI 模式。

### **指令回應**

SD 卡的的每一個指令都會有對應的回應碼，也叫做 response token，用以告知系統指令有沒有送成功，以及其它關於指令執行的狀態；根據指令的不同，回應從 8 個 bits 到 40 個 bits 不等。

送完指令 token 之後，系統應該要將 CMD 腳，也就是 MOSI 腳拉回 high，然後持續送出 clock 訊號，讓 SD 卡裡面的邏輯繼續運作；卡片需要一點時間去處理指令，這段時間叫做 NCR，也就是卡片回應指令所需要的時間，從 0 到 8 個 bytes 的 clock 時間不等。

CMD0 的回應格式叫做 R1，只有 8 個 bits，或是一個 byte。當 SD 卡經過足夠的 NCR，處理完 CMD0 後，它就會在 DAT0，也就是 MISO 接腳上送出回應。

R1 回應的 8 個 bits 是這些意思：

 ![](https://makerpro.cc/wp-content/uploads/2025/01/Screenshot-2025-01-16-224252.png)

（圖片來源：Bird 提供）

這個 R1 回應包含相當多的資訊，很多指令都會用到，但原則上它報的都是錯誤，也就是說 R1 的回應如果有非 0 的 bit，通常代表出事了，因此我們會希望 CMD0 送過去後，經過 NCR 時間後，我們在 DAT0 上收到的回應都是 0。

好了，我們已經成功利用 SPI 介面將 SD 卡 reset 成 SPI 模式，接下來就可以繼續利用 SPI 送指令來操作卡片了。

### **小結**

這一回我們說明了 SD 卡不同的工作電壓模式以及介面模式，並介紹了如何利用 SPI 介面將剛上電、仍處於 SD 介面模式的卡片 reset 成 SPI 模式，我們已經成功送出第一個指令 CMD0 了。

下一回，我們要繼續看看，如何利用 SPI 介面來送出其它指令，操作 SD 卡。

（責任編輯：賴佩萱）
