2022/12/22
マイクロビット(e_49)AT24C32 の使い方を再考
AT24C32 の再検討
以前、DS3231 RTCを搭載したリアルタイムクロックモジュールにはEEPROM AT24C32 が付いています。AT24C32の使い方を記事(e_19)で記載したのですが、スッキリしませんでした。
そのため、再検討をしました。少しはよくなったと思うので記載します。
改善したスクリプトだけ記載します。AT24C32の詳細は記事(e_19)を参照してください。
EEPROM書込み
write_Data(d_str,ep_adr=0x00)
で書込みます。
d_strは文字列データです。32バイトが最大です。
ep_adrは書込み先のアドレスです。defaltは0x00です。
read_rom(epp_adr,num)
で読み出します。
ep_adrは読出し先の先頭アドレスです。
numは読み出すバイト数です。
スクリプト
ds3231_eeprom_rw.py
from microbit import *
# EEPROM : 0x50(80)~0x57(87)
adr_rom=0x57
# write register
# First Word Address,Second Word Address,Write bytearray
def write_rom(epp_adr,wdata):
add=bytearray(2)
add[0]=epp_adr >> 8 # 0xf23なら0x0f
add[1]=epp_adr & 0x0ff # 0xf23なら0x23
buf=add+wdata # bytearrayは足し算できる
i2c.write(adr_rom,buf)
sleep(20)
return buf # 書込んだ値を確認するなら必要
# read register
def read_rom(epp_adr,num):
buf=bytearray(2)
buf[0]=epp_adr >> 8
buf[1]=epp_adr & 0x0ff
i2c.write(adr_rom,buf)
sleep(5)
r_reg=i2c.read(adr_rom,num)
sleep(5)
return r_reg
def write_Data(d_str,ep_adr=0x00): # 文字データ,書込み先アドレス
l_len=len(d_str) # 文字の長さ
l_dat=list(d_str) # 文字を分解
w_dat=bytearray(l_len)
for i in range(l_len):
w_dat[i]=ord(l_dat[i]) # 文字を Unicodeに変換
write_rom(ep_adr,w_dat)
## ----------------------------------------------------
# eeprom >>
dat='EFG' # 書込む文字列
write_Data(dat,0xff1) # datの文字列を0xff1から書込む
# <<
実行結果
書込んだ値の確認結果がThonnyのshellに表示されます。
>>> %Run ds3231_eeprom_rw.py
0 0x45 E
1 0x46 F
2 0x47 G
>>>
全データ読出し・消去
ep_Aread()で書込みのあるデータを全て読み出します。
ep_Erase()で全て消去します。0xffを書込みます。
スクリプト
ds3231_eeprom_erase.py
from microbit import *
# EEPROM : 0x50(80)~0x57(87)
adr_rom=0x57
# 32bytesの‘0xff’ 消去データ
erase_dat=bytearray(32)
for i in range(32):
erase_dat[i]=0xff
# write register
# First Word Address,Second Word Address,Write bytearray
def wr_rom(epp_adr,wdata):
add=bytearray(2)
add[0]=epp_adr >> 8
add[1]=epp_adr & 0x0ff
buf=add+wdata
i2c.write(adr_rom,buf)
sleep(20)
return buf
# read register
def read_rom(epp_adr,num):
buf=bytearray(2)
buf[0]=epp_adr >> 8
buf[1]=epp_adr & 0x0ff
i2c.write(adr_rom,buf)
sleep(5)
r_reg=i2c.read(adr_rom,num)
sleep(5)
return r_reg
# AT23C32_4KB ALL Clear 全消去
def ep_Erase():
# 32bytes区切りで4kB書込む
for i in range(128):
ep_adr=i*32
wr_rom(ep_adr,erase_dat)
# 4kBまでのデータを確認する
# 32bytes区切りでデータがあれば1byte比較 アドレスとデータ値(chr)を表示
def ep_Aread():
r_dat=bytearray(32)
for i in range(128):
ep_adr=i*32
r_dat=read_rom(ep_adr,32)
if r_dat != erase_dat:
for n in range(32):
if r_dat[n] != 0xff:
print(hex(i*32+n),chr(r_dat[n]))
print('AT23C32_4KB')
#ep_Aread()
実行結果
スクリプトを実行後、Thonnyのshellでep_Aread()と ep_Erase()を実行しました。
>>> %Run ds3231_eeprom_erase.py
>>> ep_Aread()
0xff1 E # アドレス、文字データ
0xff2 F
0xff3 G
AT23C32_4KB
>>> ep_Erase()
>>> ep_Aread()
AT23C32_4KB # データ無し
>>>
まとめ
EEPROM AT24C32のスクリプトは以前よりかなり簡素になったと思います。