M5StickCでSPI通信をする

本体に内蔵しているのと同じSPI接続のST7735Sに160×80ピクセルの0.96インチOLEDを接続してみました。

SPIとは?

3線+αの信号線を使って通信する通信方式です。I2Cに比べて高速通信が可能で、M5StickCでは画面表示などに利用しています。

ArduinoMaster側Slave側別名用途
SCKSCKSCKSCLK, SCLデータ送信のクロックをマスターが送信する
MISOSDISDODC, D/Cマスターの受信、スレーブの送信をする
MOSISDOSDISDAマスターの送信、スレーブの受信をする
SSSSCS特定スレーブのCSを0Vにすることで通信先を選択する

基本は3線で通信を行い、複数の通信先(スレーブ)がいる場合には、マスター側が複数のSS用PINを操作して、通信先のCSを0Vにすることで通信先を選択する。

相手先が1つだけの場合には、配線の段階でCSをGNDに接続することで常に選択されている状態となる。

名称は接続先のデバイスによって命名が様々なので、接続先に注意する必要がある。またSPI以外の通信線も接続する必要があるデバイスもあるので混乱しやすい。

SPIサポート

M5StickCでは最大4系統のSPI通信をサポートしています。

  • SPI0 : 内部Flashへの接続に利用済み
  • SPI1 : 内部Flashへの接続に利用済み
  • HSPI : 未使用
  • VSPI : 内蔵画面への接続に利用済み

M5StickCで追加で利用できるSPIは1系統のみになります。ただし、そもそも4線しか使えるピンが無いので外部に2系統使うことはできません。

接続デバイス

手元にあったST7735Sと接続してみました。M5StickCに内蔵しているのと同じスペックの画面ですが、内蔵クラスはPIN番号などが固定化されているので、そのまま使えませんでした。

ST7735Sのピン配置

ST7735M5StickC内容
GNDGND共通GND
VCC3V3電源
SCL0SCK
SDA32MOSI
RES33リセット
DC26MISO
CSGNDこのデバイスを選択
BLK未接続バックライト制御

上記の接続にしました。CSはGNDに直結したので3線でSPI自体は通信できますが、画面のリセット用の1線必要になっています。

接続例

Groveはメス端子は販売していますが、ケーブルは自作できないので、この手の接続をするときにはきれいに接続するのは難しいかもしれません。

サンプルスケッチ

#include <M5StickC.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>

Adafruit_ST7735 tft = Adafruit_ST7735(-1, 0, 26, 32, 33); // cs, dc, mosi, sclk, rst

uint16_t color = 0;

void setup() {
  M5.begin();

  tft.initR(INITR_MINI160x80);
}

void loop() {
  tft.fillScreen(color);
  M5.Lcd.fillScreen(color);
  color += 0x0100;
}

最低限のコードだけに削っているものになります。AdafruitとM5StickCでcolorの型が違うので、違う色が表示されますが、画面の色が塗り替わっているまでは確認できました。

Adafruit ST7735とその親クラスにあたるAdafruit GFXを利用させていただいています。

まとめ

M5StickCでSPI通信は使えました。しかし自由に使えるPINが4線しかないので、接続とかがいろいろ大変そうですね。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)