稼働中

Raspberry Pi Pico(s_10)AT24C32 用モジュール

AT24C32 AT24C32c.py

AT24C32は32Kビット(4Kバイト)のEEPROMです。I2Cデバイスです。
※詳細はAT24C32のデータシートを参照ください。
Raspberry Pi PicoでAT24C32を使う自作の’AT24C32c.py’を作成しました。記事d_12を元に作成しています。使い方だけを記載します。’AT24C32c.py’は末尾にあります。

使い方

■ ファイル転送
Raspberry Pi Picoへ’AT24C32c.py’を送った後でimportして使います。
※AT24C32c.pyの末尾に、使用例(AT24C32_ex.py)の## example以降をコピペ追加しても動作確認できます。
■ メソッド
‘AT24C32c’をimportすると「m_write、m_read、read_EP、erase_EP」のメソッドが使えるようになります。

AT24C32(num=1,sda=10,slave=0x57)で初期化します。
num:I2C0、I2C1の番号です。デフォルトは1(I2C1)
sda:SDAのGPIO番号です。デフォルトは10(GP10)
slave:AT24C32のスレーブアドレスです。デフォルトは0x57(A0~A2が’1’)

(01)m_write(moji,r_pos=0x00)
EPPROMへデータを開始番地から書き込みます。
moji:書込むデータ、英数文字列
r_pos:EPPROMの書込み開始番地
(02)m_read(num,r_pos=0x00)
EPPROMからデータを開始番地から読出したデータを返します。
moji:読み出すバイト数
r_pos:EPPROMの読出し開始番地
(03)read_EP()
EPPROMの全データを読み、データが0xffで無ければ表示します。
(04)erase_EP()
EPPROMの全データを消去(0xffを書込)します。

使用例

EEPROMのアドレス0xff0から16英数文字を保存、読出しなどをしています。


AT24C32c_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
from AT24C32c import AT24C32
# Atmel AT24C32 EEPROM 4k_0x50(80)~0x57(87)

## exapmle -----------------------
a=AT24C32(1, 10) #init(num=1,sda=10,slave=0x57)
str_moji='0123456789ABCDEF' # 文字列 16_moji

ep_pos=0xff0                # save regi-address
a.m_write(str_moji,ep_pos) 

lo_data=a.m_read(len(str_moji),ep_pos) # load data
print("read_data=",lo_data)

a.read_EP()   # 書込みのあるデータを表示
a.erase_EP()  # 全データを消去(0xffで埋める)
a.read_EP()   # 書込みのあるデータを表示  

実行結果

実行すると以下のようになりました。※Thonnyのshellに表示されます。


>>> %Run -c $EDITOR_CONTENT
read_data= 0123456789ABCDEF     # 書込みを確認
Reading--                       # 全書込みを確認
4080 0xff0 b'0'
4081 0xff1 b'1'
4082 0xff2 b'2'
4083 0xff3 b'3'
4084 0xff4 b'4'
4085 0xff5 b'5'
4086 0xff6 b'6'
4087 0xff7 b'7'
4088 0xff8 b'8'
4089 0xff9 b'9'
4090 0xffa b'A'
4091 0xffb b'B'
4092 0xffc b'C'
4093 0xffd b'D'
4094 0xffe b'E'
4095 0xfff b'F'
reg_count= 16                   # 16dataを確認
Erasing--                       # 全消去
Reading--                       # 全書込みを確認
reg_count= 0                    # 全消去されている
>>> 

AT24C32用モジュール


AT24C32c.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
from machine import I2C,Pin
import time
#RTC DS3231 Module
## Atmel AT24C32 EEPROM 4k 0x00-0xfff
class AT24C32:
    def __init__(self,num=1,sda=10,slave=0x57):
        self.ep_adr=slave    # 0x50(80)~0x57(87)
        self.i2c=I2C(num, scl=Pin(sda+1), sda=Pin(sda), freq=100_000)

    # word address first/second
    def word_adr(self,dat):
        reg_adr=bytearray(2) # EEPROM Address
        reg_adr[0]= dat >>8             #first
        reg_adr[1]=(0x00ff & dat)       #second
        return reg_adr

    ## 英数字だけ
    # write moji code to EEPROM
    def m_write(self,moji,r_pos=0x00):    
        reg_adr=self.word_adr(r_pos)    # word address
        m_dat=moji.encode()             # 英数字をエンコードする

        #write to EEPROM 
        buf=reg_adr+m_dat  #rom_address + moji_code_data
        self.i2c.writeto(self.ep_adr,buf)
        time.sleep_ms(10)  # 待機が必要 OSError: [Errno 5] EIO
        return

    #read moji_code from EEPROM
    def m_read(self,num,r_pos=0x00):
        reg_adr=self.word_adr(r_pos)  # word address
        self.i2c.writeto(self.ep_adr,reg_adr)
        s=self.i2c.readfrom(self.ep_adr,num)
        de_moji=""
        for i in range(num):        
            de_moji=de_moji+chr(s[i])
        return de_moji

    #read all data EEPROM
    def read_EP(self):
        print('Reading--')
        seg=0   # used regi num
        reg_adr=bytearray(2) # EEPROM Address 0x00~0xfff
        for i in range(0x1000):
            reg_adr=self.word_adr(i) # word address
            #print(reg_adr)
            self.i2c.writeto(self.ep_adr,reg_adr)
            s=self.i2c.readfrom(self.ep_adr,1)
            if s != b'\xff':
                seg=seg+1
                print(i,hex(i),s) # 数、番地、値
        print('reg_count=',seg)

    #erase 0xff write 4k=1024*4 全消去
    def erase_EP(self):
        print('Erasing--')
        erase_dat=bytearray(32)
        for i in range(32):
            erase_dat[i]=0xff   # 0xffを書込む(消去)

        reg_adr=bytearray(2)            # EEPROM Address 32*128=4096
        for i in range(128):
            reg_adr=self.word_adr(i*32) # word address
            #print(reg_adr)
            buf=reg_adr+erase_dat       #rom_address + moji_code_data
            self.i2c.writeto(self.ep_adr,buf)
            time.sleep_ms(10)           # OSError: [Errno 5] EIO