前回SPI接続のSRAMの読み書きテストをしてみたので、今回はI2C接続のEEPROMの読み書きテストです。こちらも以前Raspberry Pi Picoボードで実験済のコードをSTM32版MicroPython上にもってきています。やっぱりボード毎の違いはあるので、小幅な修正は必要。ほぼほぼ前回と以下同文ぞなもし。
※「MicroPython的午睡」投稿順 Indexはこちら
※ST Microelectronics社製Nucleo-F401REボード上で使用しているSTM32版MicroPythonについてはこちら
I2C接続EEPROM
今回Nucleo-F401REボードの「ハードウエア」I2Cポートに接続してみるメモリは以下のMicroChip社製のものです。
24LC64 64Kb I2C compatible 2-wire Serial EEPROM
E2PROMとしては少し大きめの8Kバイト搭載品であります。不揮発なので設定値など電源を切っても値を保存したいデータ向けです。
Nucleo-F401REボードとの接続
STM32F401REマイコンは、ハードウエアのI2Cを3チャネルも使用できるようですが、今回はI2C1と呼ばれるプライマリなハードウエアを使ってみます。Nucleo-F401REボード搭載のArduino互換ピンソケットには、SCL/D15、SDA/D14とピン名が印字されている端子に信号が出ているもの。
実験に用いたMicroPythonスクリプト
さて、MicroPythonでのI2Cの利用は以下のmachineモジュールについての解説ページに記載があります。
上記に従って書けばよいとはいうものの、ボード固有の実装に引きずられる面があります。以前、以下の自前記事でラズパイPicoボードと24LC64を接続してみています。
MicroPython的午睡(17) ラズパイPico、I2CでシリアルEEPROM接続
上記で使ったスクリプトをもってきて、I2CのID番号とI2Cで使用する端子名をSTM32用に変更してみました。こんな感じ。
i2c = I2C(1, scl=machine.Pin.board.D15, sda=machine.Pin.board.D14, freq=100000)
実行してみると以下のようなエラーを受け取りました。
このエラーは前回のSPIと同様ですな。
-
- ラズパイPicoではペリフェラルが使用する端子名を与える必要がある
- STM32ではペリフェラルが使用する端子名は指定してはいけない
今回もI2C(1 のようにハードウエアの番号を指定すれば、STM32では使用する端子も自動的に定まるので、端子名を書いてはイカンということみたいです。
結局、以下のようなシンプルな指定にすれば動作OKっと。
i2c = I2C(1, freq=100000)
さて、ラズパイPico用のソースを持ってきて「微妙」な修正を加えたソースが以下に。やっていることは、0xF00番地に’A’と一文字、0xF01番地に’B’と一文字書いて、読み出してみているだけ。
#STM32: I2C1 E2PROM R/W test #I2C1_SCL PB_8 D15 #I2C1_SDA PB_9 D14 import time from machine import Pin, I2C def main(): print("STM32F401RE I2C1 E2PROM R/W Test.") i2c = I2C(1, freq=100000) i2c.writeto_mem(0x50,0x0F00,bytes([0x41]), addrsize=16) #A time.sleep_ms(100) i2c.writeto_mem(0x50,0x0F01,bytes([0x42]), addrsize=16) #B time.sleep_ms(100) dF00 = i2c.readfrom_mem(0x50,0x0F00, 1, addrsize=16) time.sleep_ms(5) dF01 = i2c.readfrom_mem(0x50,0x0F01, 1, addrsize=16) print("ADR 0x0F00: {0}".format(dF00)) print("ADR 0x0F01: {0}".format(dF01)) if __name__ == "__main__": main()
実験結果
実機上で走らせたときの様子が以下に。AとB、読み出せてますな。
まさにチョイ直しで、ラズパイPico用のコードがSTM32で走りました。こういうところがMicroPythonの良いところじゃね。当たり前か。