실제로 SD 초기화에서 찾을 수있는 대부분의 정보 / 코드는 SDHC 및 SDXC보다 몇 년 앞서서 날짜가 있거나 정확하지 않습니다. 이 절차는 이전 하드웨어를 이전 버전과 호환되는 방식으로 처리해야하므로 오늘날 더 복잡합니다.
첫째, 다른 사람들이 언급했듯이 낮은 초기 클록 속도를 선택하십시오 (일반적으로 100kHz-400kHz 범위, 가능한 경우 400kHz 사용). 장치에서 허용하는 경우 나중에 더 높은 클럭으로 전환 할 수 있습니다. 새로운 카드는 MHz-ish 클럭킹을 안전하게 견뎌 낼 수 있지만, 오래된 카드는 불평을합니다 (즉, 통신하거나 쓰레기를 반환하지 않음).
다음 것은 사용하지해야한다는 것입니다 CMD1
에 초기화 SD / SDHC / SDXC 카드 카드가 인식하지 못하는 경우를 제외 CMD55
/ ACMD41
; SD 카드 사양에서 언급 한대로 :
어떤 경우 든 CMD1은 호스트가 MultiMediaCard와 SD 메모리 카드를 구별하기 어려울 수 있으므로 권장되지 않습니다.
일부 컨트롤러 (대부분 최신 및 대용량 카드)는 발급 CMD1
할 경우 IDLE에 그대로 유지 됩니다. CMD8 0x1AA
재설정 후 먼저 발행 한 CMD0
다음 ( )을 사용해보십시오 CMD55 + ACMD41
. 실패한 경우 에만를 사용하십시오 CMD1
.
tl; dr SPI 모드에서 카드를 초기화하려면 다음을 수행해야합니다.
CMD0
arg : 0x0
, CRC : 0x95
(응답 : 0x01
)- 0xFF
응답이 없거나 잘못된 경우이 단계를 반복해야합니다. 자세한 내용은 아래를 참조하십시오.
CMD8
arg : 0x000001AA
, CRC : 0x87
(응답 : 0x01
, 그 뒤에 arg의 echo가옵니다 0x000001AA
)-이 명령은 선택적인 것처럼 보이지만, 새로운 카드에서는 반드시 필수입니다. 0x1AA
여기서는 일반적인 인수 값 이지만 실제로 다른 값도 전달할 수 있습니다. "표 7-5 : SPI 모드에서 CMD8의 카드 작동", p. 자세한 내용은 사양에서 108입니다.
3a. CMD55
arg : 0x0
, CRC : any, 0x65
실제로 (응답 : 0x01
; 모든CMD55
접두사 임 ; 응답이 이면 오래된 카드를 가지고 있음 / / 대신 arg [CRC ]로 반복 ) ACMD
0x05
CMD1
0x0
0xF9
CMD55
ACMD41
3b. ACMD41
, arg : 0x40000000
, CRC : any, 0x77
실제로 (이 인수는 카드가 HCS 카드라고 가정합니다. 일반적으로 0x0
그렇습니다 0xE5
. 오래된 카드 에는 arg [CRC ]를 사용하십시오). 응답이 0x0
이면 괜찮습니다. 그렇다면 0x01
3a로 이동하십시오. 이 경우 0x05
위의 참고 사항을 참조하십시오 (3a). 그렇지 않은 경우 문제가있는 것입니다 (아래 참조).
대부분의 카드 는 3a / 3b 단계 (또는 CMD1
오래된 카드의 경우)를 반복 해야합니다 . 즉, 실제 순서는 CMD0
/ CMD8
/ CMD55
/ ACMD41
/ CMD55
/ ACMD41
(또는 CMD0
/ CMD8
/ CMD1
/ CMD1
) - 시도, 확인하기 위해 CMD55
/ ACMD41
(또는 CMD1
당신이 가지고있는 경우 0x05
그들로부터) 번 (선택 이유에서, 그것은 실제로는 매우 일반적입니다을 기다려야 장치가 전원이 켜진 직후이면 수백 ms이므로 원하는 경우 시도 사이에 약간의 지연이 있고 응답이 실패하면 실패한다고 가정합니다.엔엔0
표시되지 않습니다 (예 : 기기가 어떤 이유로 유휴 모드에있는 경우). 또한 장치가 이전에 "이상한"상태에있는 경우 수신 0xFF
하는 CMD0
것이 일반적입니다 (예 : 전화 끊기, S̲S̲ deasserted [높음], 일부 핀의 과전압 / 저전압 등)-시간을두고 헹구고 반복하십시오. 번. 에 대한 왜곡 응답은 당신이 그것을 몇 번을 보낸 경우 응답이 여전히도 - 때때로 꽤 괜찮 도 , 앞으로 이동하려고합니다 . 그것이 효과가 있다면-잘 가십시오. 그렇지 않은 경우 아마도 고장 일 수 있습니다.엔CMD0
0xFF
0x01
CMD8
MSB가 설정되었지만 응답이 0xFF
일반적으로 SD 핫 플러그를 수행 할 때 발생하는 Vcc 감소의 결과로 SPI가 클럭킹에 변화를 가져 왔음을 암시 하지는 않습니다 . 문제를 해결하려면 장치를 완전히 재설정하십시오 (전원 켜기 / 끄기, deassert / assert S̲S̲ 등). 그것은 일반적으로 작동합니다.
또한 사양에 따르면
마지막 SD 메모리 카드 버스 트랜잭션 후, 호스트는 클럭을 종료하기 전에 카드가 작동을 완료하기 위해 8 (8) 클럭 사이클을 제공해야합니다.
그것 없이는 작동 할 수 있지만 8주기 = 1 SPI 출력 바이트이기 때문에 크게 아프지 않으며 그것을 갖는 것이 좋습니다.
적어도 각 전후에 S̲S̲ (일명 CS)를 낮게 설정 CMD
해야합니다.이 경우 CMD0
장치가 켜지지 않는 경우 완전히 필수 이며 실제로 CMD
표준이있는 경우 다른 모든 장치에 필요합니다. 호환 SD 카드. GND에 카드의 SS를 연결하면 영구적으로 보일 수 있습니다카드가 uC 출력 핀과 코드로 코드를 관리해야 할 필요성을 모두 저장하고 카드가 모두 선택되었다고 가정해야하므로 호스트가 연결하는 유일한 SPI 클라이언트 인 경우 좋은 아이디어입니다. 그 시간의. 실제로, 일부 카드 (대부분의 카드는 아님)는 실제로 단순히 낮은 것을 감지하는 대신 높은-낮은 슬로프가 켜지기를 기대하므로 S̲S̲ 비트를 전혀 토글하지 않으면 지연됩니다. 시계 또는 침을 뱉는 쓰레기; 일부 (일반적으로 최신) 카드가 작동하고 일부 (이전) 카드가 작동하지 않을 수 있습니다 (YMMV). 그럼에도 불구하고 더 강력한 SPI 구성 (> 1 슬레이브 장치)의 경우 지정된 SD 카드와의 실제 트랜잭션 전에 핀을 낮게 설정해야합니다.
사양 그는 말한다 동안 게다가, CMD0
및 CMD8
SPI 모드에서 CRC가 있어야 (트랜센드 것과 같은) 일부 SD 카드 에 대한 적절한 CRC를 필요로하는 것 CMD55
/ ACMD41
- 당신은 안전을하려면, 단순히 그들을 위해 미리 계산 된 값을 사용합니다.
또한 SPI는 자체적으로 풀업 / 다운을 필요로하지 않지만 MISO에 47k 풀업을 던지는 것이 좋습니다. 일부 디바이스는 특정 상황 (예 : 초기화되지 않음)에서 DO 핀을 Z로 높게 유지하며 플로팅 핀은 항상 이상한 문제의 원인이 될 수 있습니다. 경우 귀하의 uc에 3.3 VCC를 가지고, 당신은 내부 풀업을 사용할 수 있습니다; 5V 인 경우 MISO 라인에 적절한 5-> 3.3V 로직 변환이없는 한 그렇게하지 마십시오.
더 읽을 거리 :
MMC / SDC 사용 방법
SD 사양 1 부 간체 물리적 레이어 간체 사양 - 가장 중요한 섹션 6.4.1 의 전원을 켭 및 7.2.1 모드 선택 및 초기화 와 그림 7-1 : SD 메모리 카드 스테이트 다이어그램 (SPI 모드)
CMD8
사전에 발급 되지 않으면 전혀 시작되지 않습니다 . 또한 시계가 적당한 범위 내에있는 한 일반적으로 문제가되지 않습니다.