MicroPythonからI2C EEPROMを使う

先日実装したMicroPythonのI2Cでのレジスタ読み書きメソッドは、読み書きのアドレスのビット幅をaddrsizeキーワードで指定することができます。
センサなどでは8ビットのアドレス空間があれば大抵間に合うはずですが、このような大きなアドレス空間を使用するものの代表にEEPROMがあります。

シリアルIスケアC EEPROM 24FC64-I/P: マイコン関連 秋月電子通商 電子部品 ネット通販

addrsizeがちゃんと指定できていることの確認のため、上のリンクにあるEEPROMを使ってみました。
このEEPROMはI2C接続で、64Kbit(8Kbytes)の容量がありますので、13bitのアドレス空間になります。

ピンは8本で、うち3本はアドレス線です。これによってスレーブアドレスを3bitの範囲で変えることができますので、1つのI2Cバスに最大8個のEEPROMを接続することができます。
アドレス線に何も接続しない場合のスレーブアドレスは0x50でした。

結線は、Vcc(3.3V)、Vss(GND)、SDA、SCLの各ピンを対応する信号線に接続するほか、WPをGNDに接続します。
WPはWrite Protectで、Hなら書き込み禁止、Lなら書き込み許可です。

使用方法は、まずwriteで読み書きしたいレジスタアドレスを2バイト(上位バイト、下位バイトの順)で送り、つづいてデータを書き込み、または読み出します。
Micropythonから使用する場合は、第1引数でスレーブアドレス、第2引数でレジスタアドレスを整数で指定し、レジスタアドレスのビット幅をaddrsizeキーワードを用いて8の倍数で指定します。
こんな感じです。(EEPROMのスレーブアドレスが80、読み書きするスレーブアドレスが0の場合。)

import machine
buf=bytearray([1,2,4,8,16,32,64,128])
i2c=machine.I2C(1)
i2c.writeto_mem(80,0,buf,addrsize=16)
i2c.readfrom_mem(80, 0, 8, addrsize=16)

ちょっと試してみただけですが、問題なく読み書きできているようです。

なお、EEPROMではデータの書き込みの際、書き込みアドレスがページ境界(24FC64では32バイト)を超えると、アドレスがそのページの先頭に戻ってしまいます。
上の例ではアドレス0からデータを8バイト書いていますが、もし33バイト書いたら33バイト目はアドレス0に書き込まれることになります。

コメント