はじめての 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個)です。
プルアップ抵抗は I2C FRAM が正しく通信するために必要です。これは、I2Cプロトコルが、SCLおよびSDAバスラインがオープンドレインまたはオープンコレクタであることを前提としているためです。
■ I2C通信の波形からI2C通信を理解する
LabTool を使って波形を見てみます。
まず、LabTool を パソコンに接続し、LabToolの画面を立ち上げます。
立ち上がったら
” Sample Rate を 50MHz ” にし、” Add Signal ” を行います。設定は以下の図を参考に。
OK押下で以下の画面が出てきます。
SCL が D0 ってのと、 SDA が D1 ってのを覚えてOK押下。
最後に、D0 と D1 の トリガは立下りにします。
団子みたいな絵の Continuous capture を有効にします。
なお、D0 D1 I2C ってやつの順番は上下入れ替えできます。
掴んで動かしてみて ^^
次は、LabTool と FRAM を接続します。
前回の『はじめての F (⋈◍>◡<◍)。✧♡ ~ RasPi編① ~』を参考に、SCL、SDA、GNDの足を確認してね。
こんな感じ。
前回の『はじめての 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メモリへのデータ書き込みの様子が波形で確認できました!
最初の波形を取り上げて
波形について少し見てみましょう!
波形のアタマは...
続きからオシリは...
データシートの説明とも重ねてみましょう。
データシートの Byte Write コマンドだ!
Byte Writeコマンドは、I2Cfram1.py の #w1 の1文が実行されたときの波形になります。
実行結果を載せときます これ ↓↓
■ Byte Writeコマンド
つづけて # r1 , # r2 が実行されたときの波形をみてみましょう。
実行結果を載せときます これ ↓↓
■ Random Readコマンド
調子にのってきたので、smbus2 を使って、データシートの コマンドを実行させてみよう!(次回 RasPi編②の弐 に続く)
とりあえず、これをやって分かったこと!
「ちゃんとコマンド実行されてるのかなぁ...」と思う時には、こうやって波形を見たらいいんですね!
My オシロを持ってたり、「波形!波形!」と言って、なにかあるとすぐに波形を見る方たちの気持ちが、ちょっとわかった瞬間でした(笑)
波形は信号の『素顔』💛