マイクロビット(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')