M5StickCでSPI接続のSDカードを使う

※本ブログは現時点での情報です、最新情報はM5StickC非公式日本語リファレンスを参照してください。

使うことはないとは思いますが、手元にSPI接続のSDカードリーダーがあったので、、、

利用デバイス

いろいろなSDカードリーダーがありますが、これの右側みたいなやつを使いました。SPI接続以外にもいろいろとSDカードリーダーがあるので、気をつけて選びましょう。

接続方法

M5StickCSD
3V33V3
GNDGND
0CLK
26MISO
32MOSI
33CS

M5StickC側はどのピンでもアサイン可能ですが、初期化時に若い番号から並ぶようにアサインしました。

SDカードの仕様上、プルアップする必要がありますが、基板上に抵抗などの部品があれば内部でやってくれているはずですので、そのまま直結させます。

SDカードは3.3Vで動きますので、間違ってGROVE端子などの5Vを接続しないようにしましょう。

サンプルスケッチ

#include <M5StickC.h>
#include "SD.h"
// PIN配置
enum { spi_sck = 0, spi_miso = 26, spi_mosi = 32, spi_ss = 33 };
void setup()
{
  // M5StickC初期化
  M5.begin();
  M5.Lcd.setRotation(3);
  // SPI初期化
  SPI.begin(spi_sck, spi_miso, spi_mosi, spi_ss);
  // SDカード初期化
  if (!SD.begin(spi_ss)) {
    M5.Lcd.println("Card Mount Failed");
    return;
  }
  // SDカード種別取得
  uint8_t cardType = SD.cardType();
  if (cardType == CARD_NONE) {
    M5.Lcd.println("None SD Card");
    return;
  }
  M5.Lcd.print("SD Card Type: ");
  if (cardType == CARD_MMC) {
    M5.Lcd.println("MMC");
  } else if (cardType == CARD_SD) {
    M5.Lcd.println("SDSC");
  } else if (cardType == CARD_SDHC) {
    M5.Lcd.println("SDHC");
  } else {
    M5.Lcd.println("UNKNOWN");
  }
  // SDカード容量取得
  uint64_t cardSize = SD.cardSize() / (1024 * 1024);
  M5.Lcd.printf("SD Card Size: %lluMB\n", cardSize);
}
void loop() {
}

SDカードをマウントしてから種別と容量を取得するだけのサンプルです。

まとめ

SDカードはSPI接続以外にも接続方法がありますが、M5StickCの場合利用できるピン数の関係でSPIしか利用できません。

今回4線全部利用していますが、CSはGNDに落とすことで使わなくすることができますが、SD.begin()で何らかのピンを指定しないといけないので、33を割り振っています。

コメント