
Trong thiết bị nhúng và IoT, mở rộng kết nối phần cứng là một thách thức lớn. SDIO giúp giải quyết vấn đề này bằng cách tận dụng khe thẻ SD để kết nối ngoại vi như Wi-Fi, Bluetooth, GPS, cảm biến mà không cần thêm cổng giao tiếp.
SDIO không chỉ mở rộng kết nối mà còn tăng tốc độ truyền dữ liệu. Nó hỗ trợ DMA, kiểm tra lỗi CRC và hoạt động hiệu quả với nhiều nền tảng nhúng như Raspberry Pi, NVIDIA Jetson, STM32, i.MX8.
Bài viết này sẽ giúp bạn hiểu SDIO là gì, cách hoạt động, ưu điểm so với SPI/UART, và cách triển khai trong thực tế. Nếu bạn cần một giao thức nhanh và linh hoạt, SDIO có thể là lựa chọn phù hợp!
Các định nghĩa cơ bản

1. Thẻ SDIO
Thẻ SDIO (Secure Digital Input/Output) là một thiết bị có thể tháo rời, sử dụng bus SD và các lệnh SD để giao tiếp với hệ thống. Nó có cùng kích thước với thẻ nhớ SD thông thường, nhưng cũng có thể có kích thước mở rộng theo quy định của chuẩn SDIO (phiên bản hiện tại chưa có kích thước mở rộng cho microSDIO).
Thẻ SDIO phải tuân theo:
• Chuẩn SDIO (Phần E1): Mở rộng và điều chỉnh cách hoạt động của lớp vật lý (Physical Layer).
• Chuẩn SD (Phần 1 – Physical Layer): Quy định về bố cục chân (pin), điện áp, tín hiệu, và yêu cầu nguồn điện.
Thẻ SDIO tương thích với thẻ nhớ SD, có cùng cách bố trí chân kết nối và đặc tính điện. Ngoài ra, thẻ SDIO bắt buộc phải hỗ trợ chế độ SPI, nhưng không phải tất cả tính năng đều có thể sử dụng khi chạy ở chế độ này.
2. SDIO nhúng (Embedded SDIO)
Embedded SDIO là thiết bị SDIO không thể tháo rời, được hàn cố định trên bo mạch PCB.
Thiết bị Embedded SDIO cũng phải tuân theo:
• Chuẩn SDIO (Phần E1): Điều chỉnh và mở rộng lớp vật lý của thiết bị SDIO.
• Chuẩn SD (Phần 1 – Physical Layer): Nếu có yêu cầu về điện áp hoặc thời gian hoạt động, thiết bị phải tuân theo tài liệu eSD Addendum.
Thiết bị Embedded SDIO không bị giới hạn về kích thước hay cách bố trí chân kết nối. Chế độ SPI không bắt buộc, và nếu có, không phải tất cả tính năng đều được hỗ trợ.
Xem thêm: Tổng quan về CAN Flexible Data-rate (CAN FD)
Các chân tín hiệu
1. SDIO – Kết nối không có bộ thu phát ngoài

Khi kết nối MMC, SD hoặc SDIO mà không có bộ thu phát ngoài, bộ điều khiển sẽ giao tiếp trực tiếp với thẻ thông qua các chân sau:
Tên tín hiệu | Loại | Mô tả | Giá trị reset |
mmci_clk | O | Xung nhịp cho SDIO | 0 |
mmci_cmd | I/O | Tín hiệu lệnh | 0 |
mmci_dat[7:0] | I/O | Tín hiệu dữ liệu | 0 |
2. SDIO – Kết nối sử dụng bộ thu phát ngoài

SDIO kết nối với thẻ DIO thông qua bộ thu phát ngoài. Bộ thu phát ngoài giúp ổn định tín hiệu, hỗ trợ các mức điện áp khác nhau và mở rộng khoảng cách truyền.
Tên tín hiệu | Loại | Mô tả | Giá trị reset |
mmc2_clk | O | Xung nhịp đầu ra cho SDIO | 0 |
mmc2_clkin | I | Xung nhịp đầu vào từ SDIO | 0 |
mmc2_cmd | I/O | Tín hiệu lệnh | 0 |
mmc2_dir_cmd | O | Điều khiển hướng của mmc2_cmd khi dùng bộ thu phát ngoài | 0 |
mmc2_dat[3:0] | I/O | Tín hiệu dữ liệu | 0 |
mmc2_dir_dat0 | O | Điều khiển hướng dữ liệu của mmc2_dat0 | 0 |
mmc2_dir_dat1 | O | Điều khiển hướng dữ liệu của mmc2_dat1 và mmc2_dat3 | 0 |
mmc2_dir_dat2 | O | Điều khiển hướng dữ liệu của mmc2_dat2 | 0 |
mmc2_dir_dat3 | O | Điều khiển hướng dữ liệu của mmc2_dat[7:4] (không khả dụng trên một số thiết bị do trùng chân với các tín hiệu khác) |
Giao thức truyền dữ liệu giữa bộ điều khiển SDIO và thẻ nhớ
1. Lệnh (Command)
Mô tả: Lệnh được gửi từ bộ điều khiển đến thẻ để yêu cầu thực hiện một thao tác.
Truyền trên: Dây tín hiệu mmci_cmd.
2. Phản hồi (Response)
Mô tả: Sau khi nhận được lệnh, thẻ sẽ gửi phản hồi về bộ điều khiển để xác nhận đã nhận lệnh và cung cấp thông tin cần thiết.
Truyền trên: Dây tín hiệu mmci_cmd.
3. Dữ liệu (Data)
Mô tả: Dữ liệu có thể được truyền từ bộ điều khiển đến thẻ hoặc từ thẻ đến bộ điều khiển.
Truyền trên: Các đường dữ liệu DATA (mmci_dat[3:0] hoặc mmci_dat[7:0] tùy chế độ truyền).
4. Trạng thái bận (Busy)
Mô tả: Khi thẻ đang xử lý dữ liệu vừa nhận, nó sẽ giữ tín hiệu mmci_dat0 ở mức thấp để thông báo cho bộ điều khiển rằng nó đang “bận”.
Truyền trên: mmci_dat0 (dữ liệu bit 0).
5. Trạng thái kiểm tra lỗi CRC (CRC Status)
Mô tả:
• Khi thực hiện ghi dữ liệu, thẻ sẽ gửi kết quả kiểm tra lỗi CRC qua mmci_dat0.
• Nếu có lỗi truyền dữ liệu, thẻ sẽ gửi trạng thái CRC âm (negative CRC status).
• Nếu truyền thành công, thẻ sẽ gửi trạng thái CRC dương (positive CRC status), sau đó bắt đầu quá trình ghi dữ liệu vào bộ nhớ.
Truyền trên: mmci_dat0 (dữ liệu bit 0).
Xem thêm: Fritzing Cơ Bản: Hướng dẫn chi tiết vẽ mạch trực quan
Tổng quan về giao thức
Trong giao thức SDIO, có hai kiểu truyền dữ liệu chính:
• Truyền tuần tự (Sequential Operation).
• Truyền theo khối (Block-Oriented Operation).
1. Truyền tuần tự (Sequential Operation) trong SDIO
- Chỉ hỗ trợ chế độ truyền 1-bit.
- Dữ liệu được truyền liên tục mà không bị chia thành các khối cố định.
- Quá trình truyền kết thúc khi bộ điều khiển gửi lệnh dừng (stop command) qua đường mmci_cmd.
Ứng dụng: Phù hợp với các ứng dụng truyền dữ liệu liên tục, ví dụ: luồng dữ liệu âm thanh, video hoặc truyền thông nối tiếp.
a. Đọc dữ liệu SDIO

• Host gửi lệnh đến thẻ nhớ (Host to card) báo hiệu một yêu cầu đọc dữ liệu.
• Thẻ nhớ phản hồi (Card to host): Sau khi nhận lệnh, thẻ gửi một “Response” trên mmci_cmd để xác nhận lệnh hợp lệ và sẵn sàng xử lý dữ liệu.
• Giai đoạn truyền dữ liệu (Data transfer operation): Khi phản hồi hợp lệ, luồng dữ liệu được truyền trên mmci_dat0.
• Dừng truyền dữ liệu (Data stop operation): Sau khi hoàn tất truyền dữ liệu, Host gửi một lệnh dừng (STOP_TRANSMISSION – CMD12). Thẻ phản hồi xác nhận đã ngừng truyền. Kết thúc quá trình đọc dữ liệu.
b. Ghi dữ liệu SDIO

• Host gửi lệnh đến thẻ nhớ (Host to card) báo hiệu một yêu cầu ghi dữ liệu.
• Thẻ nhớ phản hồi (Card to host): Sau khi nhận lệnh, thẻ gửi một “Response” trên mmci_cmd để xác nhận lệnh hợp lệ và sẵn sàng xử lý dữ liệu.
• Giai đoạn truyền dữ liệu (Data transfer operation): Khi phản hồi hợp lệ, luồng dữ liệu được truyền trên mmci_dat0.
• Sau khi kết thúc luồng dữ liệu, Host gửi một lệnh dừng (Data stop operation). Thẻ không phản hồi ngay lập tức mà báo hiệu Busy trên mmci_dat0. Trạng thái Busy cho biết thẻ đang xử lý dữ liệu (ví dụ: ghi dữ liệu vào bộ nhớ flash bên trong). Khi thẻ hoàn tất quá trình nội bộ, nó mới gửi phản hồi Response cho Host. Kết thúc quá trình ghi dữ liệu.
2. Truyền theo khối (Block-Oriented Operation)
- Có thể hoạt động ở cả chế độ 1-bit, 4-bit, 8-bit.
- Dữ liệu được chia thành các khối cố định kèm theo bit kiểm tra lỗi CRC.
- Quá trình truyền kết thúc khi bộ điều khiển gửi lệnh dừng (stop command) trên đường mmci_cmd.
Ứng dụng: Thường được sử dụng cho việc đọc/ghi dữ liệu trong bộ nhớ, giúp đảm bảo tính toàn vẹn dữ liệu.
a. Đọc dữ liệu

• Host gửi lệnh đọc dữ liệu trên đường mmci_cmd. Thẻ nhớ phản hồi bằng một Response xác nhận sẽ gửi dữ liệu.
• Thẻ nhớ gửi dữ liệu: Trên đường mmci_dat[7:0], thẻ nhớ gửi Data block (Dữ liệu chính) + CRC (Giúp kiểm tra lỗi trong quá trình truyền).
• Nếu Host yêu cầu đọc nhiều khối, quá trình trên sẽ lặp lại.
• Khi hoàn thành việc đọc, Host gửi Command để dừng quá trình. Thẻ nhớ phản hồi Response, xác nhận dừng truyền dữ liệu.
b. Ghi dữ liệu

• Host gửi lệnh ghi dữ liệu, thẻ nhớ phản hồi bằng Response, xác nhận sẵn sàng nhận dữ liệu.
• Trên đường mmci_dat[7:1], Host gửi Data block + CRC.
• Sau khi nhận xong dữ liệu, thẻ nhớ kiểm tra CRC Status. Nếu CRC hợp lệ, thẻ nhớ tiếp tục ghi dữ liệu vào bộ nhớ flash. Nếu CRC sai, thẻ nhớ có thể yêu cầu gửi lại dữ liệu.
• Trên đường mmci_dat0, thẻ nhớ giữ trạng thái Busy trong khi đang ghi dữ liệu vào bộ nhớ flash. Thời gian Busy phụ thuộc vào tốc độ ghi của thẻ nhớ.
• Nếu Host yêu cầu ghi nhiều khối, quá trình trên sẽ lặp lại cho từng khối.
• Khi hoàn thành việc ghi, Host gửi Command để dừng quá trình. Thẻ nhớ phản hồi Response, xác nhận đã hoàn thành ghi dữ liệu.
Xem thêm: Cách Tạo Linh Kiện Mới Trong Fritzing: Hướng Dẫn Từ A Đến Z
Data format (Định dạng dữ liệu)
1. Lệnh (Command Token)

Bắt đầu bằng bit ‘0’ và kết thúc bằng bit ‘1’.
Bit thứ hai là bit xác định bên truyền:
• 1 → Lệnh từ host (bộ điều khiển gửi lệnh đến thẻ nhớ).
• 0 → Lệnh từ thiết bị (thẻ nhớ) (rất hiếm khi xảy ra).
Chỉ số lệnh (Command Index): 6-bit để xác định lệnh cụ thể.
Tham số lệnh (Argument): 32-bit dữ liệu, có thể là địa chỉ hoặc tham số khác.
Mã kiểm tra lỗi CRC (Cyclic Redundancy Check): 7-bit để kiểm tra lỗi dữ liệu.
2. Phản hồi (Response Token)


Cấu trúc:
Bit | Ý nghĩa |
1-bit Start | Luôn là 0, đánh dấu bắt đầu phản hồi. |
1-bit Transmitter | Luôn là 0 (do phản hồi đến từ thẻ nhớ/thiết bị SDIO). |
N-bit Response Data | Nội dung phản hồi, số bit tùy vào loại phản hồi (R1, R2, R3, R4, R5, R6). |
7-bit CRC | Mã kiểm tra lỗi (chỉ áp dụng cho một số loại phản hồi). |
1-bit End | Luôn là 1, đánh dấu kết thúc phản hồi. |
Các loại Response Token:
Loại Response | Độ dài (bit) | Ý nghĩa |
R1 | 48 | Trạng thái của thẻ (OK, lỗi, bận, v.v.). |
R2 | 136 | Thông tin chi tiết về thẻ (CID, CSD). |
R3 | 48 | Dữ liệu OCR (Operating Conditions Register). |
R4 | 48 | Dành cho SDIO, chứa thông tin về IO OCR. |
R5 | 48 | Phản hồi từ lệnh IO_RW_DIRECT (CMD52). |
R6 | 48 | Phản hồi từ lệnh CMD3 (Publish RCA – Relative Card Address). |
Xem thêm: Giao thức 1-Wire là gì? Tất cả những điều bạn cần biết
3. Định dạng dữ liệu
Dữ liệu luôn bắt đầu bằng bit 0 và kết thúc bằng bit 1.
a. Truyền 1-bit
Dữ liệu được truyền trên một đường duy nhất (mmci_dat0).
Mỗi byte dữ liệu có bit thấp nhất (LSB) ở đầu và bit cao nhất (MSB) ở cuối.
• Nếu sử dụng chế độ Sequential data, kích thước của dữ liệu sẽ không giới hạn. Dữ liệu sẽ liên tục được gửi cho đến khi có lệnh Stop.
• Nếu sử dụng chế độ Block data, kích thước của dữ liệu là cố định với Block length * 8, ở cuối mỗi dữ liệu sẽ có thêm một giá trị CRC ở cuối để kiểm tra lỗi.

b. Truyền 4-bit
Dữ liệu được truyền trên 4 đường song song (mmci_dat[3:0]).
Mỗi đường truyền một phần của byte dữ liệu.
CRC vẫn được thêm vào để kiểm tra lỗi.

c. Truyền 8-bit
Dữ liệu được truyền trên 8 đường song song (mmci_dat[7:0]).
Tương tự như chế độ 4-bit nhưng tốc độ cao hơn do truyền đồng thời nhiều bit hơn.

Xem thêm: Inter-IC sound (I2S) là gì? Hiểu về giao thức truyền âm thanh số
Hệ thống quản lý buffer (bộ đệm)
Hệ thống quản lý buffer (bộ đệm) giúp chuyển dữ liệu giữa bộ nhớ (RAM/CPU) và thẻ nhớ MMC/SD/SDIO một cách hiệu quả.
Tưởng tượng buffer giống như hai cái xô nước để vận chuyển dữ liệu:
• Nếu ta có hai xô (ping-pong buffer), khi một xô đang đổ đầy (ghi dữ liệu), xô kia có thể rót ra (đọc dữ liệu) ngay lập tức.
• Nếu chỉ có một xô (buffer đơn), ta phải đợi đầy mới có thể rót ra.
1. Chế Độ Ping-Pong (Block ≤ 512 bytes)
Khi kích thước dữ liệu ≤ 512 bytes (BLEN ≤ 0x200), bộ đệm chia thành hai phần 512 byte hoạt động luân phiên.
a. Cách Hoạt Động
Bộ đệm được chia làm hai phần, mỗi phần 512 byte.
Một phần có thể được đọc, trong khi phần kia đang ghi dữ liệu.
Cách hoạt động này giúp luồng dữ liệu không bị gián đoạn, vì khi một phần đang được xử lý, phần kia đã sẵn sàng cho lần truy xuất tiếp theo.
b. Ví dụ hình 15

1. Đầu tiên dữ liệu từ bus hệ thống được chuyển vào Portion B, trong khi đó Portion A vẫn đang trống.
2. Sau đó dữ liệu từ Portion B được truyền vào Card bus.
1′. Trong khi dữ liệu được truyền vào Card bus, Portion A nhận dữ liệu mới từ bus hệ thống.
2′. Dữ liệu từ Portion A được truyền vào Card bus, Portion B tiếp tục nhận dữ liệu mới từ bus hệ thống.
Quá trình này lặp lại liên tục theo cơ chế “ping-pong”, giúp đọc/ghi dữ liệu nhanh chóng mà không có thời gian chết. Cơ chế này cũng hoạt động tương tự khi đọc dữ liệu (Hình 16).

Xem thêm: Tìm hiểu về Universal Serial Bus (USB)
2. Chế Độ Buffer Đơn (Block > 512 bytes)
Khi kích thước block > 512 bytes (BLEN > 0x200), buffer sẽ hoạt động như một khối duy nhất (1024 byte).
Cách Hoạt Động:
• Cả buffer 1024 byte được sử dụng như một phần duy nhất.
• Không thể vừa đọc vừa ghi cùng lúc!
• Nếu có hai luồng truy xuất đồng thời, hệ thống sẽ báo lỗi BADA (Bad Access Error).
3. Cải Thiện Hiệu Suất đọc và ghi với Prefetch & Post-Write Buffer
a. Prefetch Register (Bộ đệm đón trước)
Khi CPU hoặc DMA yêu cầu đọc dữ liệu từ thẻ nhớ, dữ liệu không được đọc trực tiếp từ Data Buffer mà thay vào đó:
• Prefetch Buffer tự động nạp dữ liệu từ Data Buffer trước khi CPU/DMA yêu cầu, giúp giảm độ trễ khi truy xuất dữ liệu.
• CPU/DMA đọc dữ liệu từ Prefetch Buffer thay vì trực tiếp từ Data Buffer, cho phép truy cập nhanh hơn.
• Khi Prefetch Buffer cạn dữ liệu, nó sẽ tự động lấy thêm dữ liệu từ Data Buffer, giúp duy trì luồng dữ liệu liên tục mà không làm CPU/DMA phải chờ đợi.
Lợi ích:
• Tăng tốc độ đọc nhờ nạp dữ liệu trước.
• Giảm tải CPU/DMA, vì dữ liệu luôn sẵn sàng.
b. Post-Write Buffer (Bộ đệm ghi sau)
Thay vì ghi trực tiếp vào Data Buffer, CPU/DMA ghi dữ liệu theo trình tự sau:
• Dữ liệu đầu tiên được ghi vào Post-Write Buffer tạm thời.
• Post-Write Buffer tự động đẩy dữ liệu vào Data Buffer, sau đó dữ liệu được truyền đến thẻ nhớ
• Ngay sau khi ghi vào Post-Write Buffer, CPU/DMA có thể tiếp tục thực hiện tác vụ khác mà không phải chờ dữ liệu ghi hoàn tất.
Lợi ích:
• Giảm thời gian chờ của CPU/DMA, giúp tăng hiệu suất hệ thống.
• Tối ưu luồng dữ liệu, giúp truyền tải mượt mà hơn mà không bị nghẽn.
Xem thêm: Controller Area Network (CAN) bus – Hệ Thần Kinh Của Ô Tô Hiện Đại
So sánh SDIO với các giao thức khác
Tiêu chí | SDIO | SPI | UART | USB | PCIe |
Tốc độ tối đa | Lên đến 104 MB/s | ~25-50 Mbps | ~1 Mbps (115200 bps thông dụng) | 480 Mbps (USB 2.0), 5 Gbps (USB 3.0) | 2.5-16 GT/s (PCIe Gen1 – Gen4) |
Độ trễ | Thấp | Trung bình | Cao | Trung bình (có xử lý giao thức) | Rất thấp |
Tiêu thụ điện | Thấp | Rất thấp | Rất thấp | Trung bình đến cao | Cao |
Số lượng dây | 4-8 dây | 4 dây (MISO, MOSI, SCK, SS) | 2 dây (TX, RX) | 4 dây trở lên | Nhiều lane phức tạp |
Độ phức tạp | Trung bình | Thấp | Rất thấp | Cao (giao thức phức tạp) | Rất cao |
Ứng dụng chính | Wi-Fi, cảm biến, module GPS | Cảm biến SPI, bộ nhớ Flash | Giao tiếp thiết bị đơn giản | Lưu trữ, kết nối ngoại vi | Card đồ họa, SSD, thiết bị tốc độ cao |
Ứng dụng thực tế của SDIO

• Module Wi-Fi/Bluetooth SDIO trong các thiết bị nhúng như Raspberry Pi, ESP32, STM32.
• Thẻ nhớ SDIO trong hệ thống nhúng để mở rộng bộ nhớ.
• Cảm biến hình ảnh tốc độ cao trong camera và thiết bị thị giác máy.
• Cảm biến đo lường (IMU, gia tốc, địa từ,…) trong robot và thiết bị điều khiển tự động.
• Hệ thống Infotainment trên ô tô (kết nối Wi-Fi, Bluetooth, lưu trữ dữ liệu).
• Thiết bị y tế như ECG, máy siêu âm di động để truyền dữ liệu cảm biến.
• Máy quét mã vạch SDIO trong hệ thống bán lẻ và logistics.
• Thiết bị GPS SDIO trong các hệ thống định vị nhúng.
• Ứng dụng IoT cần giao tiếp không dây và lưu trữ dữ liệu tốc độ cao.
Tóm lại, SDIO là một giao thức mạnh mẽ giúp mở rộng khả năng kết nối của các hệ thống nhúng và IoT thông qua khe cắm thẻ SD. Với tốc độ truyền dữ liệu cao, hỗ trợ DMA, kiểm tra lỗi CRC và khả năng tương thích rộng rãi, SDIO là lựa chọn tối ưu cho các thiết bị cần kết nối Wi-Fi, Bluetooth, GPS hay cảm biến. Việc hiểu rõ cách hoạt động và triển khai SDIO sẽ giúp bạn tận dụng tối đa tiềm năng của giao thức này trong các ứng dụng thực tế.
Xem thêm: Hiểu về Direct Memory Access (DMA)