稼働中

マイクロビット(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のスクリプトは以前よりかなり簡素になったと思います。