ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SD Card 사용법
    Study/DSP 2008. 2. 11. 19:13

    1. SD/MMC의 하드웨어 인터페이스

            

    SD/MMC의 인터페이스는 다른 SPI디바이스와 다를 것이 없다. 해당 신호선대로만 배선을 해주면 끝나는데, 유의할 점은 신호레벨이 3.3V라는 점이다.

    5V MCU와 인터페이스하기위 해서는 74LVC245를 이용하던가 저항을 이용해서 전압레벨을 낮추어 주어야 한다.



    [ PDF로 보기 ]

     

    2. SD/MMC의 초기화 과정

    SD와 MMC는 초기화 과정에서 약간의 차이를 보이는데, SD카드는 MMC카드와 하위호환성을 가지므로 MMC의 초기화와 동일하게 하더라도 사용이 가능하다.

    하지만 SD의 4비트모드 등 SD의 특정기능을 사용하기 위해서는 SD카드 특유의 초기화 과정을 거쳐야 한다.


     

    3. CID레지스터

    CID레지스터는 SD/MMC카드의 고유한 정보를 담고 있다.
    128비트의 크기에 카드의 제품명, 시리얼번호 등의 내용을 가지고 있는데 그 내용은 아래와 같다.

    이름
    타잎
    크기
    (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의 대표적인 커맨드 요약

    명령어 형식

    바이트
    0
    1 ~ 4
    5
    비트
    7
    6
    5...0
    31..0
    7..1
    0
    내용
    Start Bit
    Host 비트(1)
    커맨드
    인수
    CRC7
    End bit

    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형식은 각각의 비트가 고유한 의미를 가지고 있다.

    비트
    이   름
    의   미
    0
    Idle State
    카드가 IDLE상태에 진입했으며 초기화가 진행중임.
    1
    Erase reset
    지우기 동작이 중단되었음.
    2
    Illegal command
    잘못된 커맨드를 수신함.
    3
    Communication CRC error
    CRC검사 에러
    4
    Erase sequence error
    지우기 명령 실행 순서에 오류가 있음.
    5
    Address error
    잘못된 어드레스를 지정함(블록 크기의 배수로 정렬되지 않은 어드레스가 전달되었음)
    6
    Parameter error
    잘못된 인수를 지정(주소, 블록 크기 등)
    7
    Reserved
    이 비트는 항상 0임.



    주요 명령어

    커맨드
    이름
    응답
    형식
    인수
    설명
    CMD0
    GO_IDLE_STATE
    R1
     
    카드를 리셋하고 idle상태로 만든다.
    CMD1
    SEND_OP_COND
    R1
     
    현재 작동상태를 요구한다.
    CMD10
    SEND_CID
    R2
    [31:16]RCA
    [15:0] don't care
    CID레지스터의 내용을 요구한다.
    CMD13
    SEND_STATUS
    R1
    [31:16]RCA
    [15:0] don't care
    CSD레지스터의 내용을 요구한다.
    CMD16
    SET_BLOCKLEN
    R1
    [31:0] block length
    억세스에 사용할 블럭의 크기를 지정한다.
    CMD17
    READ_SINGLE_BLOCK
    R1
    [31:0] data address
    1개의 블럭을 읽는다.
    CMD18
    READ_MULTIPLE_BLOCK
    R1
    [31:0] data address
    다수의 블럭을 읽는다.
    CMD24
    WRITE_BLOCK
    R1
    [31:0] data address
    1개의 블럭을 기록한다.
    CMD25
    WRITE_MULTIPLE_BLOCK
    R1
    [31:0] data address
    다수의 블럭을 기록한다.

    여기서 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 >




     

    9. 참고 문헌 및 자료

    Sandisk사의 제품 메뉴얼 페이지
    http://www.sandisk.com/oem/manuals.asp

    Ulrich Radig의 홈페이지(독일어 사이트)
    http://www.ulrichradig.de/site/avr_mmcsd/index.htm

    미시건 주립대 강의자료(출처 불명)
    http://www.egr.msu.edu/classes/ece480/goodman/fall/group05/deliverables/appnote_foust.pdf

    Luminous - MMC-to-Serial Adaptor
    http://homepage.ntlworld.com/seanellis/mmcserial.htm

    Juicebox Project
    http://www.positron.org/projects/juicebox/index.shtml

    AVR (ATmega128, etc):
    http://cafe.naver.com/carroty.cafe
    http://cafe.daum.net/8051plus
    http://control.cntc.ac.kr/cpu/

    SD Card:
    http://www.project-hf.net/blog/?no=25&category=5
    http://www.sandisk.com/Oem/Manuals/
    http://www.sdcard.co.kr/
    http://blog.naver.com/hyperlancer?Redirect=Log&logNo=120021185990
    http://blog.naver.com/hyperlancer/120021284894
    http://forum.microchip.com/tm.aspx?m=58980

    SPI, I2C Data Communication:
    http://www.pjrc.com/tech/mp3/sta013.html#i2c
    http://cafe.daum.net/8051plus
    http://blog.naver.com/elephant21?Redirect=Log&logNo=20021494624
    http://blog.naver.com/ahinoam75?Redirect=Log&logNo=50000470074

    STA013 MP3 Decoder:
    http://www.pjrc.com/tech/mp3/sta013.html#i2c
    http://www.st.com/stonline/

    FAT32 File System:
    http://www.pjrc.com/tech/8051/ide/fat32.html
    http://blog.naver.com/inpluto?Redirect=Log&logNo=40015303883
    http://imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=746&sselect=wr_subject&stext=fat&soperator=1&srch_rows=10&srch_comment=1&srch_days=0
    http://www.project-hf.net/blog/
    http://blog.naver.com/adinewtn

    MP3 File Structure:
    http://www.multiweb.cz/twoinches/MP3inside.htm#MP3FileStructure

    MP3 Project:
    http://yuki-lab.jp/hw/mp3player2.html
    http://www.myplace.nu/mp3/
    http://www.procyonengineering.com/procyonmp3/index.html
    http://www.mp3project.org/


    'Study > DSP' 카테고리의 다른 글

    Code Composer Studio v4 설치  (1) 2011.08.31
    TMS320F28335 - CAN 통신  (0) 2011.04.07
    TMS320F28335 초소형 모듈 두 분의 명복을 빕니다.  (1) 2011.03.17
    Code Generation Tools for CCS3.3  (3) 2011.01.04
    ADC성공하다!!!  (0) 2008.01.22
Designed by Tistory.