SPI에서 microSD 카드 초기화를위한 올바른 명령 순서는 무엇입니까?


18

Silicon Labs C8051F931 컨트롤러 와 microSD 카드 (2GB, Kingston, Sandisk) 를 인터페이스하려고합니다 .

초기화를 위해 따라야하는 시퀀스에 대해 매우 혼란 스럽습니다. PIC 마이크로 컨트롤러를 사용한 SD 카드 프로젝트 책에서 135 페이지를 언급합니다.

따라서 SD 카드를 SPI 모드로 전환하는 단계는 다음과 같습니다.
전원 켜기.
• CS 및 데이터 아웃 라인이 로직 "1"로 설정된 상태에서 최소 74 개의 클럭 펄스를 카드로 보냅니다.
• CD 라인을 낮게 설정하십시오.
• 6 바이트 CMD0 명령“40 00 00 00 00 95”를 보내 카드를 SPI 모드로 설정하십시오.
• R1 응답을 점검하여 오류 비트가 설정되어 있지 않은지 확인하십시오.
• R1 응답의 "idle-state"비트가 "0"으로 설정되고
오류 비트가 설정 될 때까지 명령 CMD1을 반복해서 보냅니다 . 이제 카드가 읽기 / 쓰기 작업을 할 준비가되었습니다.

나는 이것을 시도했지만 CDM1에서도 01을 얻고있다. 00이 예상됩니다.

또한 여기에 CMD0 다음에 CMD8을 보내는 다른 명령 시퀀스가 ​​표시됩니다. 그러나이 책은 CMD1을 보내야한다고 말합니다.

올바른 순서는 무엇입니까?

답변:


34

실제로 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 모드에서 카드를 초기화하려면 다음을 수행해야합니다.

  1. CMD0arg : 0x0, CRC : 0x95(응답 : 0x01)- 0xFF응답이 없거나 잘못된 경우이 단계를 반복해야합니다. 자세한 내용은 아래를 참조하십시오.

  2. CMD8arg : 0x000001AA, CRC : 0x87(응답 : 0x01, 그 뒤에 arg의 echo가옵니다 0x000001AA)-이 명령은 선택적인 것처럼 보이지만, 새로운 카드에서는 반드시 필수입니다. 0x1AA여기서는 일반적인 인수 값 이지만 실제로 다른 값도 전달할 수 있습니다. "표 7-5 : SPI 모드에서 CMD8의 카드 작동", p. 자세한 내용은 사양에서 108입니다.

    3a. CMD55arg : 0x0, CRC : any, 0x65실제로 (응답 : 0x01; 모든CMD55 접두사 임 ; 응답이 이면 오래된 카드를 가지고 있음 / / 대신 arg [CRC ]로 반복 ) ACMD0x05CMD10x00xF9CMD55ACMD41

    3b. ACMD41, arg : 0x40000000, CRC : any, 0x77실제로 (이 인수는 카드가 HCS 카드라고 가정합니다. 일반적으로 0x0그렇습니다 0xE5. 오래된 카드 에는 arg [CRC ]를 사용하십시오). 응답이 0x0이면 괜찮습니다. 그렇다면 0x013a로 이동하십시오. 이 경우 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 [높음], 일부 핀의 과전압 / 저전압 등)-시간을두고 헹구고 반복하십시오. 번. 에 대한 왜곡 응답은 당신이 그것을 몇 번을 보낸 경우 응답이 여전히도 - 때때로 꽤 괜찮 도 , 앞으로 이동하려고합니다 . 그것이 효과가 있다면-잘 가십시오. 그렇지 않은 경우 아마도 고장 일 수 있습니다.CMD00xFF0x01CMD8

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 카드와의 실제 트랜잭션 전에 핀을 낮게 설정해야합니다.

사양 그는 말한다 동안 게다가, CMD0CMD8SPI 모드에서 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 모드)


4

SD 카드 사양은 sdcard.org 에서 확인할 수 있습니다 . 단순화 된 버전은 일부 세부 사항을 생략했지만, 예를 들어 SDHC 및 SD 카드에 대한 초기화 순서가 설명 된 1 부의 그림 7-2를 참조해야합니다.

2GB 미만의 MicroSD 카드는 구형 카드처럼 작동 할 수 있으므로 결국0x00 결과를 제공해야합니다 . 카드가 SPI 버스의 외부 클록을 사용하여 일부 내부 처리를 수행 할 수 있으므로 재시도 횟수 이상이 필요할 수 있습니다.CMD1


2

@vaxquis 우수 답변에 덧붙여 " 물리적 계층 단순화 사양 버전 4.10 , © 저작권 2001-2013 SD 그룹 (Panasonic, SanDisk, Toshiba) 및 SD 카드 연결"(그림 7-2) 의 해당 차트를 인용하고 싶습니다. : SPI 모드 초기화 흐름) :

SD 카드 SPI 초기화 순서

여기에서 어떤 명령을 어떤 순서로 보내야하는지와 응답이 카드 유형에 대해 알려주는 내용을 볼 수 있습니다. 장치가 가능한 한 많은 카드를 지원하는 것이 바람직하다고 생각합니다. 512 바이트의 블록을 읽고 쓰는 기본 작업에 관한 한 최소한 모든 V1.x 및 V2.0 SD 및 HC 카드에 대해 가능해야합니다.


2

SPI 모드에서 Samsung MicroSD EVO 32GB는 모든 명령 코드가 유효한 CRC 코드를 갖도록 요구합니다. 나는 그들이 유일한 것이 아니라고 확신합니다. 32GB 이상의 모든 카드가 그렇게 될 수 있다고 생각한 의견을 읽었습니다. 나는 일주일 이상 버그를 디버깅 해왔다. 카드로 전송 된 모든 코드에 유효한 crc 코드가있을 때까지 코드가 작동하지 않습니다. 나는 모든 CRC 코드를 계산하기 위해 사용 https://github.com/hazelnusse/crc7/blob/master/crc7.cc 심지어 싫다는 CRC 코드를 해제 명령 59을 사용하여 시도합니다. 이것이 다른 사람에게 많은 시간과 노력을 아끼지 않기를 바랍니다.

CRC 값이있는 초기화 코드

Power On..
Clock card at least 74 (I use 80) cycles with cs high
CMD0 0, crc=0x95
CMD8 0x01aa, crc=0x87
CMD58 0, crc=0xfd
CMD55 0, crc=0x65
CMD41 0x40000000, crc=0x77
CMD9 0, crc=0xaf
CMD16, 512, crc=0x81 (If you want block length of 512)

Some random other commands..
CMD17 0, crc=0x3b (Read one block)
CMD18 0, crc=0x57 (Read multiple blocks)
CMD24 0, crc=0x6f (set write address for single block)
CMD25 0, crc=0x03 (set write address for first block)

-2

SPI 버스가 400kHz에 있는지 확인 하시겠습니까? SD 카드가 유휴 상태에 있다고보고 할 때까지 SPI 버스는 400kHz에서 실행되는 상태에서 초기화해야합니다. SPI 버스 클럭 속도가 증가 할 수 있습니다 (정확한 최대 값은 제조업체마다 다르지만, 12 MHz는 대부분의 카드에 안전한 내기입니다).

또한 이것에 따르면 : http://elm-chan.org/docs/mmc/mmc_e.html CMD1은 올바른 초기화입니다. CMD8은 전압 범위를 쿼리하는 데만 필요하며 비 SDHC (<= 2GB) 카드에서는 문제가되지 않습니다.


실제로 많은 SD 카드 (대부분 최신 카드, Sony SR-32C4 32GB는 하나임)는 CMD8사전에 발급 되지 않으면 전혀 시작되지 않습니다 . 또한 시계가 적당한 범위 내에있는 한 일반적으로 문제가되지 않습니다.
vaxquis

-3

어쩌면 이것이 너무 늦었지만 카드의 응답은 정상입니다! CMD0 이후에는 응답이 0x01이어야합니다. 즉, 카드가 유휴 상태에 있고 작업 할 준비가되었습니다. 0b00000101과 같은 것이 있으면 2 위의 1은 이것이 불법 명령이고 0 위의 1은 sard가 여전히 유휴 상태이며 작업 준비가되었음을 나타냅니다. 응답이 0x00이면 카드가 유휴 상태가 아니므로 다른 RESET 명령을 보내야 함을 의미합니다.


질문을 전혀 읽었습니까? OP가 명확하게 I tried this, but I am getting 01 even for CDM1답변 CMD1했습니다 -NOT OK 에 대한 응답으로 유휴 상태가됩니다 . "답변"에서 그의 실제 문제를 해결하고 있지 않습니다.
vaxquis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.