前回はPICマイコンのSPIスレーブのテストをお手伝い。こちらからは送信一方でした。今回は同じくPICマイコンのI2Cスレーブのテストですが送受してます。折り返してデータを照合しようなどとは考えてないので各方向とも同じデータの垂れ流しっす。MicroPythonを使えば「さらさら」書ける簡単なプログラム。ホントか?
※「MicroPython的午睡」投稿順 Indexはこちら
※Windows11上のThonny IDE 4.0.1 と ESP32 Devkit C に書き込んだMicroPython v1.19.1で動作確認しています。
別シリーズでPICマイコンのI2Cスレーブを使ってみたのは以下記事です。PICマイコンのMSSPは、SPIでもI2Cでも、マスタでもスレーブでもなる変幻自在?な周辺回路です。
PIC三昧(16) MSSP、I2C Slaveモードでデータを送受、PIC16F18855
MicroPython ソフトウエアI2Cバス
ESP32の場合、ハードウエアのI2Cインタフェースも当然使えるのですが、ソフトウエアのI2Cというものも使えます。フルソフトでIOポートを操作してI2Cしているので、速度的にはハードには及びませぬが、GPIOピンを漏れなく使えるので便利です。日本語ドキュメントは以下に。
今回はテストのお手伝いなので、ソフトウエアI2Cを使ってみます。
実験に使用したMicroPython スクリプト
I2Cマスタになって、相手のPICマイコンの通信のお相手をします。短いスクリプトですが、以下を2秒ごとに繰り返します。
-
- I2Cバスをスキャン。使用可能な7ビットアドレスを全スキャンする。該当アドレスからACKが返ってくればそのアドレスを表示。
- PICマイコンに設定のアドレス宛に1バイトデータ0xA5を書き込み
- PICマイコンに設定のアドレスから1バイトデータを読み込む。読み込んだデータを表示。
from machine import Pin, SoftI2C import time I2CADR = 8 def main(): print("ESP32, SOFT I2C master.") i2c = SoftI2C(scl=Pin(21), sda=Pin(22), freq=10000) while True: print("i2c SCAN: ", i2c.scan()) i2c.writeto(I2CADR, b'\xA5') rb = i2c.readfrom(I2CADR, 1) print("READ : 0x{0:02x}".format(int.from_bytes(rb, 'little'))) time.sleep_ms(2000) if __name__ == "__main__": main()
ESP32 DevKitCとPIC16F18855をI2C接続
ESP32 DevKitC(MicroPythonが動作している)と、PIC16F18855の開発ボード(被テスト対象のC言語からビルドしたオブジェクトが動作している)を接続したところが以下に。
どちらもI2Cバスの端子は自由度が大きいので、上は単なる成り行きの結果っす。
動作確認
PIC側での受信(当方からみたら送信)結果は別記事で(まあ成功しておるけど。)以下は、MicroPython上でのSCANと1バイトリードの結果。
i2c SCANは[8]が返ってきております。i2cバスに接続しているのは7ビットアドレス0x08のPICマイコンのみ。ちゃんとPICのインタフェースは生きておるみたい。
その後の1バイトリードの結果は0x34とな。これは予定どおり。
まあ、PICマイコンのI2Cスレーブ、動いているみたいね。お手伝いできてよかった?