티스토리 뷰

프로젝트/microSD

SD memory card - Read

Just4Fun 2017. 7. 26. 22:52

이번 글에서는 SD 메모리 카드 안에 저장 되어 있는 데이터를 읽어 오는 방법에 대해서 설명하도록 하겠다.

SD 메모리 카드에서 데이터를 읽어 올때는 block 단위로 읽어 올 수 있는데, 한번에 하나의 블럭을 읽어 오는 방법과 하나의 명령으로 여러 블럭의 데이터를 읽어 오는 방법이 있다.

위의 표에서 볼 수 있듯이, 하나의 블럭단위로 읽어 오기 위한 명령어는 CMD17이고, 여러 블럭을 한꺼번에 읽어 오기 위한 명령은 CMD18이다.

명령어를 수행할 때에는 데이터를 어디에서 읽어 올지 그 주소를 알려주어야 하는데, 메모리 용량에 따라 주소의 의미가 달라진다.

위의 그림에서 보는것처럼 SDHC나 SDXC type의 메모리의 경우 block address를 의미하는것이지만, SDSC의 경우에는 byte address를 의미하고 있기 때문에 read 명령을 수행할 때에는 주의하여야 한다.

SD 메모리에서 데이터를 읽어 오기 위한 코드를 위와 같이 만들어 보았다.

3,4번줄은 몇번째 메모리 block에서 읽어 올 것인지, 몇개의 block을 읽을 것인지 저장해 두기 위하여 변수를 선언하였다.  초기 값으로 0번 블럭 하나를 읽어 오는것으로 설정해 두었다.

사용자가 argument 없이 "read" 명령만 입력하였을 경우에 사용하기 위한 초기값인 것이다.

만약 특정 block을 읽고 싶다면 read 명령 다음에 위치 시키면 된다.  이를 처리하기 위한 부분이 6~7번 줄이다.

한번에 여러 블럭을 읽어오기 위해서는 몇개의 블럭을 읽을 것인지 알려 주어야 하는데 두번째 argument 위치에 알려 주면 된다. 블럭 개수를 읽기 위한 코드는 9~10번줄에 해당한다.

읽기 위한 블럭 개수는 최소 1개는 되어야 하기 때문에 혹시 실수로 블럭 개수를 0으로 입력하였을 때에는 이런 오류를 수정하기 위하여 블럭 개수를 1로 설정해 주어야 한다.  12~13번 줄이 블럭 개수가 0인 경우 1로 변경하는 코드이다.

블럭 개수가 1보다 큰 경우에는 multi-read 동작을 수행하도록 하기 위하여 15~20번 줄에 해당하는 코드를 실행 시키고, 하나의 블럭 데이터만 읽기 위해서는 single-read 동작을 하면 된다.

17~18번 줄에 있는 코드는 RAM 메모리 크기가 충분하면 불 필요한 코드이지만, MCU와 같이 RAM 메모리 크기가 작은 경우 SD 메모리에서 읽어 온 데이터를 저장할 수 있는 공간이 제한적이므로 적당한 크기만큼만 읽어 오도록 해 주어야 한다.

이 글에서는 최대 4개 블럭크기만큼 한번에 읽어 오도록 하였다.

한개의 블럭 크기만큼만 읽기 동작을 수행하기 위한 read_mem_single() 함수는 위와 같이 만들 수 있다.

9번 줄에서 READ_SINGLE_BLOCK 명령어를 사용한 것을 볼 수 있고, 10~13번 줄은 메모리 용량 차이에 따른 주소 설정을 다르게 하는것을 볼 수 있다.

정상적으로 메모리 데이터를 읽어 왔으면, 어떤 값을 읽어 왔는지 확인해 보기 위하여 27번 줄에 보이는 것처럼 dump_mem() 함수를 이용하여 화면에 출력해 본다.

위의 그림은 "read"라는 명령만 수행하였을 경우의 결과 화면이다. 0번 블럭 하나를 정상적으로 읽어 온 것을 확인할 수 있다.  일반적으로 0번 블럭에는 MBR(Master Boot Record) 데이터가 들어있는데, 읽어 온 데이터를 보면 제대로 읽어 왔음을 짐작할 수 있다.

위의 그림은 특정 블럭 하나를 지정하여 읽어 온 결과 화면이다. MBR에 있는 데이터중에서 첫번째 boot record를 읽어 온 것이다.  FAT32로 된 파일 시스템인것을 알 수 있다.

한번에 여러 블럭의 데이터를 읽어 오기 위한 read_mem_multi() 함수는 위와 같이 만들수 있다.

읽어 온 메모리 데이터를 저장하기 위하여 5번 줄에 나오는것처럼 calloc()을 이용하여 heap 메모리에서 필요한 크기만큼 할당 받는다.

15번 줄에서 READ_MULTIPLE_BLOCK 명령을 사용한것을 볼 수 있다.  그 뒤로 SD 메모리 용량에 따른 주소값을 설정하는 코드가 있다.

원하는 블럭에 대하여 읽기 동작을 완료 하였으면, SD 메모리에 STOP 명령을 보내 주어야 한다.  이 부분은 33~41번 줄에 들어 있다.

역시 제대로 읽어 왔는지 결과를 확인해 본다.

위의 그림은 0x2000부터 10개의 블럭을 읽어 오도록 수행한 결과 화면이다.  비록 10개의 블럭을 읽기 위한 명령을 사용하였지만, 실제로는 4개의 블럭만 읽어 오도록 만든것을 확인할 수 있다.

위의 그림은 나머지 부분이 잘려져 있지만, 실제 읽어 온 데이터는 다음과 같다.

에러 없이 4개 블럭에 있는 데이터를 한번에 읽어 왔음을 확인할 수 있다.


microSD_read.zip


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

SD memory card - Write  (3) 2017.07.29
SD memory card - CSD  (0) 2017.07.25
SD memory card - CID  (0) 2017.07.17
SD memory card - 초기화  (16) 2017.07.14
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
글 보관함