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通信でつっかえている人が少なからずいるようで。
記事内容は低レベルかもしれませんが、今回解消できたので、同じ症状で悩んでいる方へ少しでもプラスとなれば幸いです。
また、質問に丁寧に回答いただいた皆様、ありがとうございました。