Miho's Memory

組込みとアートとまぜまぜ

はじめての F (⋈◍>◡<◍)。✧♡ ~ Pythonプログラム編② の弐~

はじめての F (⋈◍>◡<◍)。✧♡ ~ RasPi編②の弐 ~

さてっ.
RasPi編②の壱 では サンプルプログラムを実行して、FRAMメモリの読み書きができてそうか?ってのを波形をみて確認しました。
そう
波形は信号の『素顔💛』です ^^#

せっかくなので、データシートのすべてのコマンドを実行してみようと思います。
ここは、FRAM波形ワールドなページ♪

引き続き、波形を見るにはおうちにあった LabTool を使います。

Random Readコマンド

FRAMサンプルプログラム!
【fram_main2.py】

import os
import time
import sys
import time
import random 

from i2c_fram2 import *

if __name__ == '__main__':

    print(" HELLO FRAM ")
    print("----------------- ")
    fram = SDL_I2CFRAM(addr = 0x50)

    print("- WRITE - ")
    fram.write8(7,34)
    print("WRITE FINISH")

    print("- READ - ")
    fram.read8(7)
    print("READ FINISH")

    print("---framEND---")

【i2c_fram2.py】

import time
import smbus2
import sys
from decimal import *

from datetime import datetime

class SDL_I2CFRAM():

    ###########################
    # SDL_I2CFRAM Code
    ###########################
    def __init__(self, twi=1, addr=0x50):
        self._bus = smbus2.SMBus(twi)
        self._addr = addr

    def write8(self, address, data):
        w = smbus2.i2c_msg.write(self._addr, [address>>8, address%256, data]) 
        self._bus.i2c_rdwr(w)

    def read8(self, address):
        w = smbus2.i2c_msg.write(self._addr, [address>>8, address%256])    # r1
        r = smbus2.i2c_msg.read(self._addr, 1)    # r2
        self._bus.i2c_rdwr(w,r)    # r3
        print(list(r)[0])

では、プログラムを実行しておきましょう!

(env) pi@Donkey-Miho:~/miho/blog $ python fram_main2.py
 HELLO FRAM
-----------------
- WRITE -
WRITE FINISH
- READ -
34
READ FINISH
---framEND---

波形はこれ ↓↓

f:id:MihoN:20210209200651p:plain

つぎ!
■ Page Writeコマンド

FRAMサンプルプログラム!
【fram_main3.py】

import os
import time
import sys
import time
import random 

from i2c_fram3 import *

if __name__ == '__main__':
    fram = SDL_I2CFRAM(addr = 0x50)

    print(" HELLO FRAM ")
    print("----------------- ")

    print("- WRITE - ")
    address =0x00
    data = [1, 2, 3, 4, 5, 6, 7, 8]
    fram.write_block(address, data)
    print("WRITE FINISH")

# With LabTool
    print("- MemDump - ")
    fram.mem_dump()

    print("---framEND---")

【i2c_fram3.py】

import time
import smbus2
import sys
from decimal import *
from datetime import datetime

class SDL_I2CFRAM():

    ###########################
    # SDL_I2CFRAM Code
    ###########################
    def __init__(self, twi=1, addr=0x50):
        self._bus = smbus2.SMBus(twi)
        self._addr = addr

    def write_block(self, address, data):
        cnt_len = len(data)
        for y in range(0, cnt_len):
            print("data[%d] = %d" %(y, data[y]))
        print("---")
        new_data = [address%256] + data
        cnt_len = len(new_data)
        for y in range(0, cnt_len):
            print("new_data[%d] = %d" %(y, new_data[y]))
        self._bus.write_i2c_block_data(self._addr,address>>8, new_data)  # r1

    def mem_dump(self):
        w = smbus2.i2c_msg.write(self._addr, [0x00>>8, 0x00%256]) 
        self._bus.i2c_rdwr(w)
        for x in range(0,10):
            r = smbus2.i2c_msg.read(self._addr, 1)
            self._bus.i2c_rdwr(r)
            print("data = 0x%x " % (list(r)[0]))

では、プログラムを実行しておきましょう!

(env) pi@Donkey-Miho:~/miho/blog $ python fram_main3.py
 HELLO FRAM
-----------------
- WRITE -
WRITE FINISH
- MemDump -
data = 0x1
data = 0x2
data = 0x3
data = 0x4
data = 0x5
data = 0x6
data = 0x7
data = 0x8
data = 0x6c
data = 0x6d
---framEND---

※ 出力結果 0x6c や 0x6d の部分は、FRAMに書かれているデータが違えば変わってきます

波形はこれ ↓↓
f:id:MihoN:20210209195624p:plain

つぎ!
■ Sequential Readコマンド

FRAMサンプルプログラム!
【fram_main4.py】

import os
import time
import sys
import time
import random 

from i2c_fram4 import *

if __name__ == '__main__':
    fram = SDL_I2CFRAM(addr = 0x50)

    print(" HELLO FRAM ")
    print("----------------- ")

    print("- WRITE - ")
    address =0x00
    data = [1, 2, 3, 4, 5, 6, 7, 8]
    fram.write_block(address, data)
    print("WRITE FINISH")

    print("- READ - ")
    fram.read_block(0x00, 3)
    print("READ FINISH")

# With LabTool
    print("- MemDump - ")
    fram.mem_dump()

    print("---framEND---")

【i2c_fram4.py】

import time
import smbus2
import sys
from decimal import *
from datetime import datetime

class SDL_I2CFRAM():

    ###########################
    # SDL_I2CFRAM Code
    ###########################
    def __init__(self, twi=1, addr=0x50):
        self._bus = smbus2.SMBus(twi)
        self._addr = addr

    def write_block(self, address, data):
        cnt_len = len(data)
        for y in range(0, cnt_len):
            print("data[%d] = %d" %(y, data[y]))
        print("---")
        new_data = [address%256] + data
        cnt_len = len(new_data)
        for y in range(0, cnt_len):
            print("new_data[%d] = %d" %(y, new_data[y]))
        self._bus.write_i2c_block_data(self._addr,address>>8, new_data)

    def read_block(self, address, sequence):
        w = smbus2.i2c_msg.write(self._addr, [address>>8, address%256])   # r1
        r = smbus2.i2c_msg.read(self._addr, sequence)   # r2
        self._bus.i2c_rdwr(w,r)   # r3
        for x in range(0, sequence):
            print("data = 0x%x" % (list(r)[x]))

    def mem_dump(self):
        w = smbus2.i2c_msg.write(self._addr, [0x00>>8, 0x00%256]) 
        self._bus.i2c_rdwr(w)
        for x in range(0,10):
            r = smbus2.i2c_msg.read(self._addr, 1)
            self._bus.i2c_rdwr(r)
            print("data = 0x%x " % (list(r)[0]))

では、プログラムを実行しておきましょう!

(env) pi@Donkey-Miho:~/miho/blog $ python fram_main4.py
 HELLO FRAM
-----------------
- WRITE -
WRITE FINISH
- READ -
data = 0x1
data = 0x2
data = 0x3
READ FINISH
- MemDump -
data = 0x1
data = 0x2
data = 0x3
data = 0x4
data = 0x5
data = 0x6
data = 0x7
data = 0x8
data = 0x6c
data = 0x6d
---framEND---

※ 出力結果 0x6c や 0x6d の部分は、FRAMに書かれているデータが違えば変わってきます

波形はこれ ↓↓
f:id:MihoN:20210212110620p:plain

さいご!
■ Device IDコマンド

FRAMサンプルプログラム!
【fram_main5.py】

import os
import time
import sys
import time

from i2c_fram5 import *

if __name__ == '__main__':

    print(" HELLO FRAM ")
    print("----------------- ")
    fram = SDL_I2CFRAM(addr = 0x50)

    print("- DeviceID - ")
    fram.read_device_id()
    print("DeviceID FINISH")

    print("---framEND---")

【I2C_fram5.py】

import time
import smbus2
import sys

from decimal import *
from datetime import datetime

class SDL_I2CFRAM():

    ###########################
    # SDL_I2CFRAM Code
    ###########################
    def __init__(self, twi=1, addr=0x50):
        self._bus = smbus2.SMBus(twi)
        self._addr = addr

    def read_device_id(self):
        w = smbus2.i2c_msg.write(0xf8//2, [0xa0])   # D1
        r = smbus2.i2c_msg.read(0xf9//2, 3)   # D2
        self._bus.i2c_rdwr(w, r)   # D3
        print(list(r)[0],list(r)[1],list(r)[2])

では、プログラムを実行しておきましょう!

(env) pi@Donkey-Miho:~/miho/blog $ python fram_main_DeviceID.py
 HELLO FRAM
-----------------
- DeviceID -
0 165 16
DeviceID FINISH
---framEND---

波形はこれ ↓↓
f:id:MihoN:20210209202822p:plain
f:id:MihoN:20210209202834p:plain:w500

smbus2 を使った FRAM MB85RC256V の データシートのコマンドを全部実行できました!
API の仕様がうまく分ってなくても ^^; 波形を見るとこうなってるから、こう設定しよう!とか、いったい何がどうなって、どうなってるのかわかります ^^#
お手軽ロジアナで十分波形を見れました!
次は、SPI の FRAM の 波形を見てみたいなと思います ^^#