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

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

**作者：Bird**

上一回 [【Maker電子學】記憶體的原理與應用—PART19](https://makerpro.cc/2025/01/flash-memory-principle-and-application-part19/)，我們說明了SD卡不同的工作電壓模式以及介面模式，並介紹了如何利用 SPI介面將剛上電、仍處於SD介面模式的卡片reset成SPI模式，我們也成功送出第一個指令 CMD0。

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

### **指令格式**

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

SD 的指令格式是這樣：

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

（圖片來源：Bird 提供）

不管在SPI模式下還是SD模式下，指令都是48-bit一組，裡面包含：

- 2個bits的起始代碼
- 6個bits的指令代碼
- 32個bits的指令參數
- 7 個bits的CRC，用來檢查指令有沒有送錯
- 1 個bit的結束代碼

差別在於，在SD模式下，指令是使用CMD這支獨立的接腳傳送的，而在SPI模式下，指令是使用SPI的MOSI接腳傳送。

我們在SD的各種文件當中常會看到CMDxx或是ACMDxx這樣的描述，指的就是SD卡的各種指令；其中CMD開頭的是一般的指令，或者叫做general commands，而ACMD開頭的叫做application-specific commands。

CMDxx的命令可以直接送出，而要送ACMDxx的命令時，要分兩階段：先送出一個CMD55，這個指令叫做APP_CMD，然後接下來的命令代碼就會被當作是ACMD。

時間回到我們上一次初始化SD卡並將它切換到SPI 模式時：我們在CS 訊號（也就是SD模式下的DAT3訊號）為low的狀態下，送出了CMD0，並讀取卡片送回來的回應碼，成功將卡片切換到SPI模式。

### **卡片辨認**

接下來會有一個極為複雜的卡片辨認過程，涉及很多的命令及流程，主要是因為SD卡的規格經過多年的演變，容量從SD、SDHC、SDXC一直到最新的SDUC，電壓也有3.3 V和1.8 V的差別，傳輸模式更是多樣，從default speed、high speed到各種UHS模式，組合又多又複雜。

雖然SD協會要求所有的SD卡都要相容舊有的模式，但如果能透過卡片辨認指令知道這張卡片支援什麼容量、模式、電壓、速度，裝置端就可以使用對應的模式來操作卡片，榨出卡片的最大性能。

在SPI模式下，根據SD協會標準的建議，送完CMD0後，如果裝置端支援SD 2.0以上的協定，第一個用來辨認卡片的指令應該是CMD8，又叫做SEND_IF_COND，這個指令主要是用來辨認卡片支援什麼介面電壓，因為SD從2.0版標準開始支援1.8 V的介面電壓，如果裝置支援1.8 V，就要問問看卡片是否支援 1.8V，並在必要時切換介面電壓到1.8V。

如果裝置支援2.0以上的標準，但卡片是舊的SD 1.x，卡片就不會回應CMD8（因為它不認得這個指令），這時我們就知道卡片是SD 1.x；如果裝置端不支援SD 2.0 以上的標準，就可以跳過 CMD8 指令，進入 ACMD41 的輪詢（polling）階段。

ACMD41 指令又叫做 SD_SEND_OP_COND，用來告訴 SD 卡裝置端是否支援大容量的操作，並開始 SD 卡的內部初始化動作（對，SD 卡的控制器到這裡才開始初始化，前面其實只是 reset 及模式切換）。

依照我們前面的說明，ACMD41 其實就是先送一個 CMD55，再送一個 41 號的指令代碼，而在 ACMD41 的參數中，有一個位元叫做 HCS，如果這個 bit 為 1，就代表裝置支援 SDHC，否則就不支援。

ACMD41 的回應碼跟我們上一回介紹的 CMD0 一樣，是一個 byte 的 R1 格式，如果卡片還在執行內部的初始化，R1 回應中的 idle state 就會是 1，表示卡片還在忙碌，這時裝置只能重複發送 ACMD41，並檢查 R1 回應碼，知道 idle state 變為 0，才能繼續其它操作；而 R1 回應碼中的其他位元各自代表一些不同的錯誤，比方說指令錯誤、CRC 錯誤等，原則上只要是回應 R1 的指令，只要回應不是全部 0，就代表一定有問題，需要錯誤處理。

當卡片初始化完成，ACMD41 指令的 busy check 通過後，最後一個辨認指令是 CMD58，又叫做 READ_OCR；OCR 是 SD 卡內部的一個暫存器，它叫做 operation conditions register，總共有 32 個 bits：

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

（圖片來源：Bird 提供）

此時我們比較關心的就是 bit30 的 CCS：card capacity status，它告訴我們卡片到底是早期的 SD，還是開始支援大容量的 SDHC/SDXC。

在 SD 卡的標準文件中可以看到一張像這樣的流程圖：

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

（圖片來源：Bird 提供）

這張流程圖表示的是，利用我們前面提到的那些指令，將卡片設置進入 SPI 模式後，還可以區分出三種不同的卡片類型：

- V1.x 的標準 SD 卡
- V2.0 之後的標準容量 SD 卡
- V2.0 之後的大容量 SD 卡（SDHC、SDXC）

知道卡片的容量之後，我們就可以準備來讀寫卡片的內容啦。

### **小結**

這一回我們簡單說明了 SD 卡初始化之後，利用一些指令組合來辨認卡片的容量、電壓、版本等特性的流程。事實上由於SD卡經過十多年的演進，標準變得非常複雜，如果需要涵蓋從最舊到最新的標準，整個辨認過程會再複雜許多，但這邊就以最簡單的 SPI 模式下的版本及容量辨識為例，讓讀者對這個流程有個了解，有興趣深入研究的讀者可以查閱SD相關的標準文件。

下一回我們要來介紹讀取 SD 卡內容的方法。

（責任編輯：賴佩萱）
