稼働中

マイクロビット(c_15)AT23C32 用モジュール

AT23C32(I2C) AT23C32_c.py

AT24C32は4KバイトのEEPROMです。DS3231モジュールに付属しています。※詳細はデータシートを参照ください。
DS3231モジュールの温度測定で使う自作の’AT23C32_c.py’を作成しました。使い方だけを記載します。(※記事e_019を元にクラスにしました。)
‘AT23C32_c.py’は末尾にあります。使い方だけを記載します。

使い方

ファイル転送
micro:bitへ’AT23C32_c.py’を送った後でimportして使います。micro:bitに直接ファイルをアップロード出来ない場合(Thonny 3.1.12など)は、microfsなどを使ってアップロードします。
※microfsについては、当サイト内のこちらを参照ください。
※AT23C32_c.pyの末尾に、使用例(AT23C32_ex.py)の## example以降をコピペ追加しても動作確認できます。

メソッド
‘AT23C32_c’をimportすると「read_Rom, write_Data, ep_Erase, ep_Aread」のメソッドが使えるようになります。
AT24C32()で初期化します。
(1)read_Rom(epp_adr,num)
EEPROMデータを読み出します。
epp_adr:開始アドレスを与えます。
num:読み出すバイト数を与えます。
(2)write_Data(d_str,ep_adr=0x00)
EEPROMにデータを書き込みます。
d_str:書込むデータを文字列で与えます。
ep_adr:開始アドレスを与えます。デフォルトは0x00です。
(3)ep_Aread()
EEPROMの4kバイトのデータを読出します。書込みのあるアドレスとデータを返します。
(4)ep_Erase()
EEPROMの4kバイト全て消去します。’0xff’が書き込まれます。

使用例

AT24C32 EEPROMの読み書きと消去を


AT23C32_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *
from AT23C32_c import AT24C32
# AT23C32_c.py
# AT24C32 EEPROM 4kbyte '0x000~0xfff' hex(1024*4) '0x1000'
## example ------------------
i2c.init()      # I2C初期化
a=AT24C32()     # instance
ep_adr=0x00f  # EEPROM先頭アドレス

## EEPROMに書込み
write_dat='ABCDEFG'
print('write_Data',write_dat)
a.write_Data(write_dat,ep_adr)

# EEPROMから読み出し
num=len(write_dat)
## read data from eeprom
r_rom=a.read_Rom(ep_adr,num)
print('read _Data',r_rom)

print('')
a.ep_Aread()     # 全データ読出し
print('')
a.ep_Erase()     # 全データ消去
print('')
a.ep_Aread()     # 全データ読出し

実行結果


>>> %Run AT23C32_ex.py
write_Data ABCDEFG
read _Data b'ABCDEFG'

Read_AT23C32_4KB
0xf A
0x10 B
0x11 C
0x12 D
0x13 E
0x14 F
0x15 G
Read_END

Erase_AT23C32_4KB
Erase_END

Read_AT23C32_4KB
Read_END
>>> 

AT24C32 用モジュール


AT23C32_c.py
from microbit import *
# AT24C32 EEPROM 4kbyte '0x000~0xfff'
class AT24C32:
    def __init__(self):
        # slave address AT24C32: 0x50(80)~0x57(87)
        self.e_adr=0x57       
        #32byte 消去データ'0xff' capable of 32-byte page writes.
        self.erase_dat=bytearray(32)
        for i in range(32):
            self.erase_dat[i]=0xff
    
    # mem-address 0x000~0xfff
    # write register 開始アドレス,バイト数
    def write_rom(self,epp_adr,wdata):
        add=bytearray(2)
        add[0]=epp_adr >> 8
        add[1]=epp_adr & 0x0ff
        buf=add+wdata
        #print(buf)
        i2c.write(self.e_adr,buf)
        sleep(20)
        return buf    

    ## read_Rom 開始アドレス,バイト数
    def read_Rom(self,epp_adr,num):
        buf=bytearray(2)
        buf[0]=epp_adr >> 8
        buf[1]=epp_adr & 0x0ff
        i2c.write(self.e_adr,buf)
        sleep(5)
        r_reg=i2c.read(self.e_adr,num)
        sleep(5)
        return r_reg

    ## write_Data  文字列データ,開始アドレス
    def write_Data(self,d_str,ep_adr=0x00):
        l_len=len(d_str)
        l_dat=list(d_str)
        #print(l_dat)
        
        w_dat=bytearray(l_len)
        for i in range(l_len):
            w_dat[i]=ord(l_dat[i])
            #print(i,l_dat[i],ord(l_dat[i]))
        #print(w_dat)
        self.write_rom(ep_adr,w_dat)

##--------------------------------------------------
    ## AT23C32_4KB ALL Clear 全消去
    def ep_Erase(self):
        print('Erase_AT23C32_4KB')
        #4KB=0xfff 1024*4=4096 4096/32=128 
        for i in range(128):
            ep_adr=i*32
            #print(i,ep_adr,hex(ep_adr))
            self.write_rom(ep_adr,self.erase_dat)
        print('Erase_END')

    ## 4kBまでの全データを確認する
    # 32byte比較してデータがあれば1byte比較 アドレスとデータ値(chr)を表示
    def ep_Aread(self):
        print('Read_AT23C32_4KB')
        r_dat=bytearray(32)
        for i in range(128):
            ep_adr=i*32
            r_dat=self.read_Rom(ep_adr,32)
            #print( i,r_dat==erase_dat) #bytearray 引算は出来ないが一致評価は可能
            if r_dat != self.erase_dat:
                for n in range(32):
                    if r_dat[n] != 0xff:
                        print(hex(i*32+n),chr(r_dat[n]))
        print('Read_END')