energy note

色々と勉強中なので備忘録として。

M5Stack BasicでのSPI通信について

これこそ備忘録で書いておかないと、と思い殴り書きます。

M5Stackで数chくらいAD変換して値を拾いたくて手元にあったMCP3204と通信させようと試みました。
ネット上ではArduinoとMCP3204を通信させている記事はいくつかありました。

SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV8);
SPI.setDataMode(SPI_MODE0);

int mcp3204(int ch){
  int highByte,lowByte;
  digitalWrite(ss,LOW);
  highByte = SPI.transfer(0x06|(ch>>2));
  highByte = SPI.transfer(ch<<6);
  lowByte = SPI.transfer(0x00);
  digitalWrite(ss,HIGH);
  return (highByte&0x0F)*256+lowByte;
}

これで確かにM5StackのSCK、MI、MO端子(+CSバー)をMCP3204に接続すると使用することができました。
しかし、M5.LCD.〇〇関連の命令を実行すると途端に受信データがおかしくなりました。
色々と人に尋ね、色々と調べ、このピンがLCDと共用で干渉しているのでは、と行きつき。
M5Stackでは使えるSPIが2種類あり、VSPIとHSPIという種類がある、VSPIがLCDとSDで利用されているので、HSPIが使えると。

#define CK 5
#define MI 17
#define MO 16
#define SS 22

#define HSPI_CLK 1000000

SPIClass hspi(HSPI);
SPISettings spiSettings = SPISettings(HSPI_CLK,SPI_MSBFIRST,SPI_MODE0);

void setup() {
  M5.begin();

  pinMode(CK,OUTPUT);
  pinMode(MI,INPUT);
  pinMode(MO,OUTPUT);
  pinMode(SS,OUTPUT);

  hspi.begin(CK,MI,MO,SS);
}
int mcp3204(int ch){
  int highByte,lowByte;

  hspi.beginTransaction(spiSettings);
  digitalWrite(SS,LOW);
  highByte = hspi.transfer(0x06|(ch>>2));
  highByte = hspi.transfer(ch<<6);
  lowByte = hspi.transfer(0x00);
  digitalWrite(SS,HIGH);
  hspi.endTransaction();

  return (highByte&0x0F)*256+lowByte;
}

色々と参考にさせてもらいながらようやく通信ができました。多分これで動くはずです。(自分の環境ではM5.LCD.〇〇を使っても動いていました)
あと、指定するピンで、25・26・35・36らへんを使うとうまく受信できませんでした。今回は原因ピンの突き止めまではしていませんので25・26・35・36が全部使えないというわけではないと思います。
細かく見ていませんが、ずっと0が出力されていたり、たまに数字が出たり(値は違う)していたので、おそらくまた何かの機能と干渉しているのかと思っています。
今回の症状はM5初心者にはちょっとハードルが高かったです。だって、普通にピンが出てるんだし使えると思うやんけ。
能力がカスなのか語彙力がカスなのかググっても時間かかった・・・今回はgoogle先生よりtwitter検索のほうが解決の決め手だった。
twitterとか見ても、M5StackとSPI通信でつっかえている人が少なからずいるようで。
記事内容は低レベルかもしれませんが、今回解消できたので、同じ症状で悩んでいる方へ少しでもプラスとなれば幸いです。
また、質問に丁寧に回答いただいた皆様、ありがとうございました。