각종 CHIP

MCU에서 Micro SD카드 사용하기 2편 (MicroSD SPI 프로토콜)

원원 2025. 5. 12. 22:34

안녕하세요. 오늘은 Micro SD카드 SPI 프로토콜에 대해 알아보겠습니다.

SPI, SD Mode 방식이 있고 해당 글에서는 SPI모드를 사용할 예정입니다. 

아래의 사이트에서 프로토콜에 대한 내용을 확인 할 수 있습니다. (Physical Layer Simplified Specification)
https://www.sdcard.org/downloads/pls/

*SPI MODE 설정
1. CPOL : 클럭이 Idel 상태일때 Low (0)
2. CPHA : 첫 번째 엣지에서 데이터 샘플링 (0)
3. Significant Bit : MSB
4. Enable Line : Low
5. 클럭속도
1) 초기화 클럭 주파수 : 100kHz~400kHz(권장)
2) 초기화 완료 후 데이터 전송 단계 : 25MHz(최대)


*패킷해석방법
※ 커맨드(MOSI)

1바이트 : command index
2~5바이트 : Argument
6바이트 : CRC7+end bit (end bit는 항상 1)

※ 응답(MISO)
커맨드 전송 후 1~8바이트 이내로 응답하고 응답하는 바이트수는 커맨드에따라 다름

응답 커맨드 길이 주요 용도
R1 CMD0, CMD17 등 1 byte 상태 비트 (Idle, CRC error 등)
R1b CMD12 등 1 byte + busy 상태 + Busy 처리
R2 CMD13 2 bytes R1 + 내부 오류 정보
R3 CMD58 5 bytes R1 + OCR (전압 범위, CCS 등)
R7 CMD8 5 bytes R1 + 전압/Check Pattern Echo

 

(각 커맨드가 어떤 응답하는지 보는 곳)



*SD카드 SPI 모드 진입하는 순서
아두이노 우노에 Micro SD를 연결해서 실제로 SPI모드에 진입하는 파형을 확인해보겠습니다.
사용하는 코드는 아래와 같습니다.

#include <SPI.h>
#include <SD.h>

void setup() {
  Serial.begin(9600);
  Serial.println("begin start");
  
  if (!SD.begin(4))
  {
    Serial.println("begin fail");
    return;
  }
  Serial.println("begin done");
}

void loop() {

}


1. 전원 인가 후 클럭 흔들기(Dummy Clocks)

- CS가 High 인 상태로 최소 74클럭 흔들어야함



2. SD 카드를 SPI 모드로 진입시키고, 초기화 상태로 만듦 (CMD0: GO_IDLE_STATE)
CS = LOW로 바꾼 뒤
커맨드: 0x40 00 00 00 00 95 전송
응답: R1 = 0x01 (Idle 상태)


3. 초기화전에 전압 범위 (2.7~3.6V) 지원 여부 & 패턴 확인 (CMD8: SEND_IF_COND)
커맨드: 0x48 00 00 01 AA 87
(Argument = 0x000001AA, CRC=0x87)
응답: R7 = 0x01 + 0x00 00 01 AA (정상)


4.SD카드 초기화 요청 시도 (CMD55 + ACMD41 반복)
커맨드 CMD55: 0x77 00 00 00 00 FF
커맨드  ACMD41: 0x69 40 00 00 00 FF
응답: 0x01 (반복) → 마지막엔 0x00 (초기화 완료)

 


5. OCR 확인 (CMD58: READ_OCR)
커맨드 : 0x7A 00 00 00 00 FF
응답 R3
R1 : 0x00 (정상)
OCR : 0xC0FF8000 (SDHC/SDXC카드(CCS=1), UHS-I 지원카드, 2.7V~3.6V 전압지원)


(결론)
1. 전원 인가 후 클럭 흔들기(Dummy Clocks)
2. CMD0 → 응답 0x01 → Idle 상태 진입, SPI 모드 진입 성공
3. CMD8 → 응답 0x01 + 0x000001AA  → 전압 범위 2.7V~3.6V 지원 확인
4. CMD55 + ACMD41 (with HCS=1) 반복 전송
초기화 과정 → 응답이 0x00이 될 때까지 반복
응답 0x00 시 → 카드 초기화 완료, Ready 상태
5. CMD58 → OCR 응답 0xC0FF8000 분석 결과:
CCS = 1 → SDHC/SDXC 카드 (고용량)
S18A = 1 → 1.8V 전환 지원(UHS-I 가능)
전압 범위: 2.7~3.6V 지원 확인