|
이름 |
타잎 |
크기
(bit) |
위치
(bit) |
설명 |
Manfacturer ID |
Binary |
8 |
127~120 |
제조사의 고유 식별 변호 |
OEM/Application ID
(OID) |
ASCII |
16 |
119~104 |
OEM 혹은 카드 내용에 대한 식별번호 |
Product Name (PNM) |
ASCII |
40 |
103~64 |
제품명 |
Product Revision
(PRV) |
BCD |
8 |
63~56 |
제품 리비젼. 2자리의 BCD번호 |
Serial Number (PSN) |
Binary |
32 |
55~24 |
시리얼 번호. 32비트 정수 |
Reserved |
N/A |
4 |
23~20 |
|
Manufacture Date Code (MDT) |
BCD |
12 |
19~8 |
제조일자 (yy-m포맷) |
CRC7 checksum (CRC) |
Binary |
7 |
7~1 |
CID레지스터에 대한 CRC7 체크섬 |
Reserved |
N/A |
1 |
0 |
사용하지 않음. 항상 ‘1’ |
CID레지스터는 MMC 커맨드10(SEND_CID)을 이용해서 읽을 수 있다.
< Transcend 64MB SD 카드의 CID레지스터 내용 >
4. CSD레지스터
5. MMC의 대표적인 커맨드 요약
명령어 형식
MMC 커맨드는 위와 같은 형식으로 구성되어 있다.
즉, 위의 표에 보여진대로 5바이트의 데이터를 카드에 전송하면 해당 커맨드가 실행되고 결과값을 돌려주게 된다.
0번 바이트는 Start bit와 Host bit, 커맨드(6비트)로 구성되어 있다.
Start bit는 0, Host bit는 1로 설정하면 된다.
unsigned char cmd[0] = 0;
cmd[0] = 0x40 | command; // 01XXXXXX
1~4바이트는 32비트의 인수를 넘겨준다. 억세스할 섹터의 번호등을 카드에 전달하는데 사용된다.
5번바이트는 CRC7값을 전송해야 하는데, SPI모드에서는 기본적으로 CRC검사가 해제되어 있으므로
처음 보내는 커맨드에만 0x95의 CRC를 전송하고 그 뒤는 임의의 값을 전송해도 좋다.
결과값
커맨드가 실행된 이후에 돌아오는 결과값은 크기에 따라 R1, R2, R3형식이 있는데, 각각 8비트, 16비트, 40비트의 크기를 갖는다.
R1형식은 각각의 비트가 고유한 의미를 가지고 있다.
여기서 RCA란 Relative Card Address를 말하는 것으로, CMD3(SET_RELATIVE_ADDR)커맨드로 카드에 주소를 부여했을 경우 사용한다.
일반적인 경우 무시(0으로 지정)해도 사용상 문제는 없었다.
이외에도 쓰기 금지 명령 등 상당히 많은 커맨드가 존재하지만 실제적으로는 상기 커맨드만으로도 충분할 것으로 보인다.
더욱 자세한 내용은 MMC스펙에 기술되어 있을것으로 보이나, MMC Association에서는 MMC의 테크니컬 문서를 공개하고 있지 않다.
아마 OEM회사 혹은 개발사에게만 제공하는것으로 생각된다. 이는 SD카드도 마찬가지이다.
이래저래 등록을 해야 하는듯 싶은데, 무슨 메뉴얼 하나 구하는게 그리 힘들게 해놓았는지 인심 한 번 흉악하다 하겠다.
하지만 방법이 없는 것도 아니여서, Sandisk사의 MMC의 카드 메뉴얼에도 매우 상세한 내용이 나와 있으므로, 그것을 참조하면 될 것이다.
Sandisk사 역시 SD카드 스펙 만큼은 꼭꼭 숨겨놓았던데, "google"에서 잘 뒤져보면 뒷구멍으로 구할 수 있으니 관심이 있다면 검색해보도록 한다.
6. 블럭 단위의 읽기 및 쓰기
7. FAT16/32 파일 시스템의 적용
단순히 SD/MMC카드를 섹터 단위로 읽고 쓰는 기능만을 구현해서는 별로 활용도가 높지 않을 것이다.
SD/MMC가 저렴한 대용량 매체인 것으로만 생각하면 곤란하다.
자신의 장비에 정말 "대용량"의 데이터를 저장할 필요가 있다면, 일반 하드디스크를 장착해버리는 편이 가격면에서 훨씬 싸다.
(물론 인터페이스가 상대적으로 복잡한 면은 있으나, 수GB 이상의 데이터를 수집하는 장비에서 이 정도는 감수할만 할 것이다)
또한 근래에는 수MB의 용량을 가진 시리얼 플래시메모리도 싼 가격에 쉽게 구할 수 있고, NAND 플래시는 말할 것도 없다.
이러한 메모리 카드의 장점이라면, 쉽게 탈착 및 휴대가 가능하며, 기기에 독립적으로 상호호환이 가능하다는 점이라고 생각한다.
그러므로, 표준적인 파일시스템을 구현해 주지 않는다면, 메모리카드의 가장 큰 장점인 상호 호환성을 잃는다고 할 수 있을것이다.
쉽게 말해서 PC에서 읽을 수도 없는 카드를 어디다 쓸 것인가? 임베디드 시스템에 적용할 의미가 없는것이다.
SD/MMC카드는 블럭단위의 억세스를 하는 디바이스로, CF메모리와 함께 하드디스크와의 유사점이 많이 있다.
그러므로, 별다른 하드웨어적인 추상화를 생략하고 기존에 MP3 주크박스를 제작하면서 IDE하드디스크용으로 작성했던 FAT32펌웨어를 약간 수정해주면 바로 사용이 가능할 것으로 보인다.
FAT파일 시스템은 그 구조가 간단하여 다양한 분야에 적용이 가능할 것으로 보이고, 이미 디지털 카메라 및 MP3플레이어 등에서 널리 사용되고 있다.
차후에 이 파일 시스템 구현에 대한 내용으로 따로 글을 쓰기로 하고 일단 여기서 다루지는 않겠다.
8. 구현 예제 및 소스해설
< ATmega128 + Transcend 64MB SD Card >
출처 : http://www.project-hf.net/blog/?no=25&category=5