MicroPython的午睡(89) STM32版、I2C接続EEPROM読み書きテスト

Joseph Halfmoon

前回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とピン名が印字されている端子に信号が出ているもの。

実験した24LC64との接続は以下です。NucleoF401RE_24LC64_Schematic

 

実験に用いたMicroPythonスクリプト

さて、MicroPythonでのI2Cの利用は以下のmachineモジュールについての解説ページに記載があります。

クラス I2C — 2線式シリアルプロトコル

上記に従って書けばよいとはいうものの、ボード固有の実装に引きずられる面があります。以前、以下の自前記事でラズパイ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)

実行してみると以下のようなエラーを受け取りました。

I2C_ERROR

このエラーは前回の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、読み出せてますな。

I2C_Result

まさにチョイ直しで、ラズパイPico用のコードがSTM32で走りました。こういうところがMicroPythonの良いところじゃね。当たり前か。

MicroPython的午睡(88) STM32版、SPI接続のSRAM読み書きテスト へ戻る

MicroPython的午睡(90) STM32F401RE、UART6はOK、UART1? へ進む