티스토리 뷰

프로젝트/microSD

SD memory card - 초기화

Just4Fun 2017. 7. 14. 21:10

MCU와 SD 메모리 카드가 제대로 연결되었는지 확인하는 차원에서 메모리 초기화 과정부터 진행해 보도록 하겠다.

메모리 카드에 전원이 들어간 이후에 수행하여야 할 절차에 대한 설명을 볼 수 있다.

중요한 것은 첫번째 command를 받기 전에 74 clock이 필요하다는 것과, 초록색 박스에 보이는 것처럼 초기화에 필요한 command와 그 순서를 알아야 한다.

모든 동작은 Host에서 SD 메모리 카드로 command를 이용하여 이루어진다.  메모리 카드에서 command를 받으면 반드시 command 종류에 따른 몇가지 response 데이터를 보내주도록 되어 있다.

Command는 48비트(6바이트) 크기를 가진다.  처음 2비트 값은 반드시 '01'로 시작 되어야 한다.  그 다음 6비트가 어떤 동작을 할 것인지 알려주기 위한 command가 되고, command를 실행할 때 필요한 경우 32비트 argument를 이용한다.  제대로 된 command 인지 확인하기 위하여 CRC7이 들어가게 된다.  Command의 끝을 알려주기 위하여 맨 마지막 비트 값은 항상 1이 되어야 한다.

기본적으로 SPI 모드에서는 CRC가 disable 되어 있지만 CMD0와 CMD8에 대해서는 반드시 정확한 CRC 값을 넣어 주어야 한다.

위의 그림이 SPI 모드에서 메모리 초기화 절차를 설명하고 있다.

Power On 상태에서 CS를 0으로 만든 다음 CMD0 명령을 보내면 SD 메모리 카드는 SPI 모드로 동작되며 그 상태를 계속 유지하게 된다.  현재까지 SD 메모리 규격이 6.0까지 나와 있는데, 버전2.0이전에 만들어진 메모리 카드는 CMD8에 응답을 하지 않는다.

요즘에 나오는 대부분의 메모리 카드는 버전2.0 이후에 생산됐을 가능성이 높기 때문에 대부분 CMD8에 대한 응답을 받을 것이다.

CMD8 명령 이후 ACMD41 명령을 주면 메모리 카드는 내부적으로 초기화 과정을 수행하게 되고, CPU는 메모리 카드가 초기화 과정이 끝나는지를 확인하여야 한다.  초기화 과정은 1초 이내에 끝나는게 정상이므로 1초가 지나도록 초기화 과정이 끝나지 않으면 에러로 처리하여야 한다.

메모리 카드는 저장 용량에 따라 Standard, SDHC, SDXC로 나누어 지는데, 이를 확인하기 위하여 CMD58을 이용한다.

그럼, 이제 초기화 코드를 만들어 SPI 통신이 제대로 이루어지는지부터 확인해 보도록 하겠다.

microsd_init() 함수를 이용하여 SD 메모리 초기화를 수행한다.  SPI 통신을 위한 GPIO 설정을 한 후 set_spi_mode()를 불러 SD 메모리에 클럭을 공급해준다.

CMD0와 CMD8 command를 차례로 보내어 어떤 response를 받는지 화면에 출력해 본다.

보드에서 실행한 결과 화면은 위와 같다.  초록색으로 표시된 부분이 R1 response에 해당되는 값이다.

R1 response의 비트별 의미는 위의 그림과 같다.  최상위 비트값은 항상 0이어야 하고 0번 비트가 1이면 SD메모리 카드는 idle 상태임을 나타내므로 일반적인 command에 대해서는 항상 0x01의 값을 가진다.

SD 모드에서는 response 데이터의 포맷이 각각 다르지만, SPI 모드에서는 항상 R1 response가 오고, 뒤 따라서 command에 따른 response가 연속해서 들어오게 된다.

위의 결과 값의 두번째에 해당되는 CMD8의 경우가 R1 다음에 32비트값의 response 값이 더 들어오게 되는 것이다.

CMD8에 해당되는 비트 값은 위와 같다. 19:16에 해당되는 값은 위의 표와 같은데, 일반적으로 2.7~3.6V에서 동작되는지 확인하기 위하여 1의 값을 주고, 15:8에 check pattern 값으로 임의의 값을 넣어주게 된다.

이번 예제에서는 0xAA값의 check pattern 값을 사용하였다.

위의 표를 보면 CMD8에 대한 response type이 R7이라고 되어 있는것을 볼 수 있다.

R7 response에 대한 설명은 위와 같다.  결론은 CMD8 명령을 보낼 때 사용했던 데이터가 그대로 들어오면 정상인 것이라고 보면 된다.  만약 CMD8에 대한 응답이 없으면 SD 버전이 2.0 이전이라고 판단하게 되는 것이다.

여기서 주의 할 점이 하나 있다.

결과 화면에 보이는 빨간색으로 표시된 부분을 32비트 값으로 그대로 읽게 되면 little endian CPU의 경우 0xAA010000으로 읽히게 된다.  따라서 little endian CPU의 경우 32비트 값을 취할 경우 데이터를 반드시 swap 시켜야 한다.

초기화 절차 과정에서 CMD8 과정 다음으로는 ACMD41 command를 수행하는 것이다.

앞 부분에 언급했듯이 ACMD41을 통해 SD 메모리 카드의 초기화를 진행한다.  ACMD41의 argument 값으로 들어가는 내용중에 HCS 비트 값이 있는데, host가 SDHC나 SDXC 카드를 지원 가능하면 HCS값을 1로 설정해 주면 된다.

SPI mode 초기화 절차 flow chart에 보면 ACMD41 command를 보낸 후 response 값의 in_idle_state 비트값이 0으로 읽히면 초기화가 끝났다고 판단하게 된다.

따라서 response 값이 0이 될때 까지 ACMD41을 반복 수행해 주어야 한다.  그러나, 무한정 수행하는 것은 아니고 적어도 1초 안에는 초기화가 완료 되므로, 1초보다 긴 시간이 경과 되도록 초기화가 완료 되지 않으면 SD 메모리 카드는 초기화에 실패한것으로 간주하여야 한다.

ACMD41까지가 기본적인 초기화 과정이지만, SD 메모리 카드 type을 알기 위한 목적으로 OCR 레지스터 값을 읽는 과정까지를 초기화에 포함시킨다.  OCR 레지스터를 읽기 위한 명령은 CMD58이고 response type은 R3이다.

R3 response 데이터 형식은 위와 같다.

OCR 레지스터의 비트별 의미는 위의 그림과 같다.  중요한 것은 30번비트에 해당되는 CCS 비트값이 1이면 SDHC나 SDXC 카드이라는 것이다.

ACMD41과 CMD58을 이용하여 OCR 레지스터 값을 읽어 오는 동작까지 연속으로 수행시켜 보도록 하겠다.

OCR 레지스터 값까지 정상적으로 읽어 오는 것을 볼 수 있다.


microSD.zip


'프로젝트 > microSD' 카테고리의 다른 글

SD memory card - Write  (3) 2017.07.29
SD memory card - Read  (0) 2017.07.26
SD memory card - CSD  (0) 2017.07.25
SD memory card - CID  (0) 2017.07.17
SD memory card - 준비  (0) 2017.07.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함