티스토리 뷰

728x90

CAUTION

사실 라즈베리파이는 여러 개의 USB 포트를 제공하기 때문에 굳이 SPI로 SD 카드를 제어할 필요가 없다. (라즈베리파이 zero 제외)

따라서 SPI만을 사용해야 하는 특별한 이유가 없다면 SD to USB 컨버터를 사용하는 것이 더 효율적이다..!! 그 이유는 아래와 같다.

 


1. SPI는 SDIO에 비해 속도가 느리다.

SD card는 기본적으로 SD 모드로 동작이 되는데, 이때 SD 모드에서는 명령 전송을 위한 데이터 라인과 데이터 전송을 위한 데이터 라인이 분리되어 있다. 하지만 SPI 모드는 한 개의 데이터 라인에서 명령과 데이터를 순차적으로 보내야 하므로 SD 모드에 비해 속도가 느리다.

또한, SD 모드는 데이터를 보낼 때 1개의 데이터 라인을 사용하는 1-bit 모드와 4개의 데이터 라인을 사용하는 4-bit 모드로 나뉘는데, 4-bit 모드에서는 SPI 모드와의 속도 차이가 더욱 커진다.

2. SPI 방식은 호환성이 낮다.

SD to USB 컨버터를 사용할 경우에는 컨버터 안에 내장되어 있는 컨트롤러에 의해 SD 카드가 /dev/sda 와 같이 block device로 인식되기 때문에 디스크 장치로 mount도 할 수 있고, dd 커맨드 등을 사용해서 데이터 복사도 손쉽게 할 수 있으며, parted 등을 사용해서 파티션도 쉽게 나눌 수 있다.

하지만, SPI 방식으로 연결하는 경우에는 /dev/spidev0.0과 같이 character device로 인식되기 때문에 block device driver와 호환되지 않으므로 메모리 제어와 관련된 다양한 명령어를 사용할 수 없다.
물론 spi로 연결된 메모리 장치를 block device로 인식시켜주는 디바이스 드라이버인 mmc_spi가 있지만, 이 드라이버의 경우에는 5.5 이상의 커널 버전이 적용된 raspbian os의 커널에서는 호환이 안된다. 😭

3. 파이에서 SPI로 SD 카드를 제어하는 방법에 대한 레퍼런스가 거의 없다.

위 1번, 2번의 이유로 인해 파이에서 SPI로 SD 카드를 제어하는 방법은 더 이상 찾아볼 수 없다. 구글을 이 잡듯이 뒤져서 나오는 레퍼런스들도 거의 7~8년 전의 포스트들이라 현재의 raspbian os (buster & bullseye)에서는 동작이 안된다.

따라서 가능하다면 SD to USB 컨버터를 사용하는 것이 정신 건강에 이롭다! 😇

 


 

위에서 나열한 단점에도 불구하고 비용적인 측면이나 하드웨어 이슈 등 여러 가지 이유로 인해 SPI 통신을 사용해야 하는 경우가 있을 수 있다. 따라서 이번 기회에 리눅스에서 SPI로 SD 카드를 제어하는 방법에 대해 시리즈로 소개하려 한다.

 

Prerequisite

라즈베리파이에서 SPI를 사용해 SD 카드를 제어하기 위해 선행해야 할 것들이 몇 가지 있다. 기본적으로 라즈베리파이는 SPI가 비활성화되어 있기 때문에 SPI 드라이버를 먼저 활성화시켜줘야 하며, 그다음 SD to SPI 컨버터를 물리적으로 라즈베리파이의 GPIO 핀에 연결해주어야 한다.

 

준비물

👉 라즈베리파이 (Raspberry Pi 4B)

우선 기본적으로 라즈베리파이가 필요하다. 이번 예제에서 사용한 버전은 4B 버전인데, 다른 버전의 라즈베리파이에서는 테스트해보지 않았지만, 해당 파이가 raspbian os로 buster 또는 bullseye를 사용한다면 다른 버전의 파이에서도 가능할 것이다.

 

Raspberry Pi 4B

 

👉 SD to SPI 컨버터 (SZH-EKBZ-005)

다음으로 필요한 것은 SD to SPI 컨버터이다. 기본적으로 6핀(VCC, GND, CS, SCK, MOSI, MISO)을 제공하는 SPI 컨버터를 사용하면 되며, 예제에서 사용하는 제품 외에 다른 제품을 사용해도 무방하다. 대신 컨버터마다 지원하는 SD 카드의 종류가 다를 수 있으므로 사용하고자 하는 SD 카드에 맞는 SPI 컨버터를 사용하면 된다.

 

SD to SPI 컨버터 (SZH-EKBZ-005)

 

👉 microSD 카드 (SanDisk microSDHC Class10 Ultra 32GB)

마지막으로 필요한 것은 microSD 카드이다. SD 카드는 사용 가능한 핀의 개수와 크기에 따라 SD, miniSD, microSD로 나뉘며, 그 안에서도 세부적으로 SDV1, SDV2, SDHC, SDXC로 나뉜다. 이번 예제에서는 위에 나열된 모든 종류의 SD 카드를 지원하므로 사용하고자 하는 종류와 버전을 자유롭게 선택하면 된다.

 

microSD 카드 (SanDisk microSDHC)

 

spidev 드라이버 활성화

spidev 드라이버를 활성화하는 데에는 여러 가지 방법이 있다. 간편하게 raspi-config를 사용해서 GUI로 SPI를 활성화하는 방법도 있지만, cli를 활용해서 SPI를 활성화하기 위해서는 아래 과정을 수행하면 된다.

 

1. sudo apt-get update
2. sudo apt-get upgrade
3. sudo vi /boot/config.txt
4. /boot/config.txt 파일에 dtparam=spi=on 추가
5. sudo reboot
6. lsmod | grep spi 입력 후, spi_bcmXXXX 및 spidev가 출력되는지 확인
7. ls /dev/spi* 입력 후, /dev/spidev0.0 및 /dev/spidev0.1이 출력되는지 확인

 

SPI Converter 연결

만약 CS 0을 사용할 것이라면 아래와 같이 SPI Converter를 연결하면 된다. CS 1을 사용할 경우에는 아래 그림에서 노란색 선을 바로 아래의 SPI0 CS1 (26번 핀)에 연결해주면 된다.

 

SPI Converter 연결도

 

이로써 SPI로 SD 카드를 제어하기 위한 준비가 완료되었다..! 다음 포스트에서는 spidev 드라이버를 간단하게 소개하고, 이를 사용해 SD 카드와 데이터를 주고받을 수 있는 인터페이스를 구현해볼 것이다.

 

728x90