---
# System prepended metadata

title: 航電組SD卡研究

---

# 「[Avionic 101](https://hackmd.io/@Jackiempty/avionic-101-list)」：航電組SD卡研究

SD卡在物理層面，也就是透過 **數據線** 傳輸的通訊協定一般有兩種
1. SPI
2. SDIO

SPI(Serial Peripheral Interface)一共有四條訊號線
* SCK
* MOSI
* MISO
* NSS(也可稱為NC、SS、CS)

SPI通訊協定將通訊雙方分為主機和從機
主機只能有一個，但從機可以有複數個，因此可以一對一、一對多，但不能多對一
以下是示意圖： 
![image](https://hackmd.io/_uploads/S1oYXbqSlx.png)

SPI的運作流程如下：

1. 主機拉低 CS 線（選中某個從機）。
2. 主機產生時鐘信號（SCLK），控制訊號間隔。
3. 主機透過 MOSI 傳送資料（一個位元一個位元傳送）。
4. 同時，從機也可透過 MISO 回傳資料（雙向同步）。
5. 資料每個位元在時鐘上升緣或下降緣時傳送（根據設定）。
6. 資料交換完成後，主機拉高 CS 線，結束通訊。

SDIO(Secure Digital Input and Output)
SDIO是由一種通訊協定的外設：SD I/O卡所組成的
該外設由五個部份組成
1. 儲存單元
1. 儲存單元介面	-> 資料輸入
1. 電源偵測	-> 確保電壓穩定
1. 卡片及介面控制器	-> 控制SD卡的運作(8個暫存器)
1. 介面驅動器	-> 控制引腳

並且有九條數據線：

* CLK時鐘（由主設備產生）
* CMD命令/回應線（雙向）
* DAT0~DAT3資料線（支援 1-bit 或 4-bit 資料傳輸）-> 4條
* VDD
* GND
* CD（選用）卡插入偵測（Card Detect）

內部構造圖如下：![image](https://hackmd.io/_uploads/rkvlJtmLge.png)

當中包含了八個寄存器，用於設定或表示SD卡訊息
以下是各寄存器的功能描述：![image](https://hackmd.io/_uploads/SymQfKmUex.png)

SDIO的運作流程如下：
1. MCU 送出 命令（CMD0） → 卡重置。
1. MCU 傳送 CMD5 / CMD8 → 確認是否為 SDIO 卡，並獲得功能資訊。
1. 確認支持的 I/O 功能與可用資料線（如 1-bit 或 4-bit）。
1. 轉入高速/多位元傳輸模式，開始進行資料傳輸。

兩種資料傳輸模式的比較：

| 項目 | SDIO模式 | SPI模式 |
| -------- | -------- | -------- |
|  通訊速度| 高（最高可達 50MHz）|低（一般<25MHz）|
支援多功能|✅|❌|
中斷支援|✅|❌(需另接中斷腳位)|
驅動與初始複雜度|較高（需 SDIO 控制器）|較低（一般 MCU 皆可用）|
硬體需求|需要 SD I/O外設支援|只需 SPI 模組|
應用| 適合需要高頻寬、低延遲、複雜通訊邏輯的裝置(例如：影片、圖片)     |資料量小、速度中等、通訊邏輯簡單的裝置(例如：OLED、高度數據)|

#### SD卡內部的通訊協定(資料傳輸層、內部運作)
採用「命令–回應式資料傳輸」
SD 卡的主控制器（Host，例如 MCU）會：
1. 發出一個命令給 SD 卡。
1. SD 卡接收到命令(Command)後會根據命令內容：
1. 回覆一個「回應（Response）」。
1. 如果命令需要資料交換（例如讀寫），會接著進行資料傳輸

<font color=#FF6600>**不論是 SPI 或 SD 模式，都遵循此命令/回應結構（但格式略有不同）**</font>

參考資料：
https://lingshunlab.com/book/esp32/esp32-micro-sd-card-list-read-and-write
https://blog.csdn.net/qq_25218501/article/details/131878632
程式參考：
https://randomnerdtutorials.com/esp32-cam-take-photo-save-microsd-card/
https://pizgchen.blogspot.com/2020/08/esp32-esp32-cam-micro-sd.html
