Miho's Memory

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

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

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

さてっ.
RasPi編① では サンプルプログラムを実行して、FRAMメモリの読み書きができてそう、ってところまで確認しました。

でも、なんとなく不安です。。。本当にコマンドはちゃんと実行されているのだろうか。。。
不安なら安心しましょう!そう!波形を見ればいいんです!!

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

ではさっそく ^^# っと、その前に
I2C について一緒に簡単に勉強しておきましょう♪

今回LobToolにつながれるFRAMはI2Cインターフェースを持つFRAMデバイスです。


■ なになに? I2C

I2C は Philips社(現在のNXP社)によって開発されたシンプルなシリアルバスです。
I2C は FRAMとMCU 間をシンプルにつなぎ、シリアル通信を提供します。
I2C は マスターがスレーブデバイスとの通信を開始する同期式プロトコルです。
その、I2Cプロトコルはデータ転送速度(クロック周波数)であるクロックをマスターが出す、マスター/スレーブ通信です。

Master                       Slave
MCU      ←   Data  → FRAM
            -- Clock →

双方向バスなので、マスターはスレーブへの書き込みと、スレーブからの読み取りが可能です。
また、その双方向のシリアルバスは、シリアルクロック(SCL)とシリアルデータ(SDA)の2つです。

I2Cバス:
・必要なバスラインは2本だけ!シリアル・データライン(SDA)とシリアル・クロックライン(SCL)
・バスに接続されている各デバイスを固有のアドレスで指定できる!
・通信は常にシンプルな、マスタ/スレーブ!
・複数のマスタが同時にデータ転送を開始した場合のデータの破損を防止する、衝突検出と調停機能を備える!
・ I2CではSCLの立ち上がりエッジ時にデータが読み込まれる!また、SDAの出力が遷移するのはSCLの立ち下がりエッジ時!

 
■ MB85RC256V I2C FRAM で確認してみよう!

以下は、同じI2Cバスに3つのFRAMを接続した例(マスタ1個、スレーブ(FRAM)3個)です。
f:id:MihoN:20200801224715p:plain
f:id:MihoN:20201112150159p:plain
プルアップ抵抗は I2C FRAM が正しく通信するために必要です。これは、I2Cプロトコルが、SCLおよびSDAバスラインがオープンドレインまたはオープンコレクタであることを前提としているためです。


■ I2C通信の波形からI2C通信を理解する

LabTool を使って波形を見てみます。
f:id:MihoN:20201127185227j:plain:w300

まず、LabTool を パソコンに接続し、LabToolの画面を立ち上げます。
立ち上がったら
” Sample Rate を 50MHz ” にし、” Add Signal ” を行います。設定は以下の図を参考に。
f:id:MihoN:20201127192656p:plain:w400

OK押下で以下の画面が出てきます。
SCL が D0 ってのと、 SDA が D1 ってのを覚えてOK押下。
f:id:MihoN:20201127192919p:plain:w200

最後に、D0 と D1 の トリガは立下りにします。
団子みたいな絵の Continuous capture を有効にします。
なお、D0 D1 I2C ってやつの順番は上下入れ替えできます。
掴んで動かしてみて ^^
f:id:MihoN:20201127193752p:plain:w200

次は、LabTool と FRAM を接続します。
前回の『はじめての F (⋈◍>◡<◍)。✧♡ ~ RasPi編① ~』を参考に、SCL、SDA、GNDの足を確認してね。
こんな感じ。
f:id:MihoN:20201127194428p:plain:w400
f:id:MihoN:20201127194444j:plain:w300

前回の『はじめての F (⋈◍>◡<◍)。✧♡ ~ RasPi編① ~』のプログラムを確認します!
分かりやすくするために、

RasPi編① で紹介したFRAMサンプルプログラム の fram_main.py の一部を少し変えてみます。
value = x +100 ※100を足しておきます 特に意味はないです ^^;
繰り返し文は 2回繰り返しにします。
あと、プログラムをシンプルに、print文も削除します。

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

import sys
from i2c_fram1 import *

if __name__ == '__main__':

    print(" HELLO FRAM ")
    print("----------------- ")
    fram = SDL_I2CFRAM(addr = 0x50)
    for x in range(0,2):
        value = x + 100
        fram.write8(x,value)
    print("---------")
    for x in range(0,2):
        fram.read8(x)  
    print("---framEND---")

【i2c_fram1.py】

import smbus2
import sys
from decimal import *

class SDL_I2CFRAM():

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

    def write8(self, address, data):
        print("addr =0x%x address = 0x%x data = 0x%x  " % (self._addr, address, data))
        self._bus.write_i2c_block_data(self._addr,address>>8,[address%256, data])     # w1

    def read8(self, address):
        self._bus.write_i2c_block_data(self._addr,address>>8,[address%256])              # r1
        returndata = self._bus.read_byte(self._addr)                                                      # r2
        print("addr = 0x%x address = 0x%x %i returndata = 0x%x " 
                 % (self._addr, address, address, returndata))
        return returndata

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

(env) pi@Donkey-Miho:~/miho/blog $ python3 fram_main1.py
 HELLO FRAM
-----------------
addr =0x50 address = 0x0 data = 0x64
addr =0x50 address = 0x1 data = 0x65
---------
addr = 0x50 address = 0x0 0 returndata = 0x64
addr = 0x50 address = 0x1 1 returndata = 0x65
---framEND---

そして、そう!LabTool をみて!
波形がみえます。右にスクロールすれば5つ分の波形が見えてきます。
FRAMメモリへのデータ書き込みの様子が波形で確認できました!

f:id:MihoN:20210115205402p:plain

最初の波形を取り上げて

f:id:MihoN:20210115205504p:plain

波形について少し見てみましょう!
波形のアタマは...

f:id:MihoN:20210221214103p:plain

続きからオシリは...

f:id:MihoN:20210221214122p:plain

データシートの説明とも重ねてみましょう。

f:id:MihoN:20210213165645p:plain

データシートの Byte Write コマンドだ!

Byte Writeコマンドは、I2Cfram1.py の #w1 の1文が実行されたときの波形になります。
実行結果を載せときます これ ↓↓
■ Byte Writeコマンド
f:id:MihoN:20210209174931p:plain

つづけて # r1 , # r2 が実行されたときの波形をみてみましょう。
実行結果を載せときます これ ↓↓
Random Readコマンド
f:id:MihoN:20210209194704p:plain

調子にのってきたので、smbus2 を使って、データシートの コマンドを実行させてみよう!(次回 RasPi編②の弐 に続く)

とりあえず、これをやって分かったこと!
「ちゃんとコマンド実行されてるのかなぁ...」と思う時には、こうやって波形を見たらいいんですね!
My オシロを持ってたり、「波形!波形!」と言って、なにかあるとすぐに波形を見る方たちの気持ちが、ちょっとわかった瞬間でした(笑)

波形は信号の『素顔』💛