FT232HボードでI2C接続を試す。 ドライバー、ライブラリー等を Adafruitのページの説明に従い インストール。 SSD1336使用のOLEDに表示できる。 1000回繰り返してもエラーは出ない。 安定している。
FT232Hボード動かす電子工作
2020年5月15日金曜日
プログラムを以下に示す。
import os os.environ['BLINKA_FT232H'] = '1' import time from random import randrange import adafruit_ssd1306 import busio from board import SCL, SDA i2c = busio.I2C(SCL, SDA) t0 = time.time() w,h = 128,64 oled = adafruit_ssd1306.SSD1306_I2C(w, h, i2c) oled.fill(0) for i in range(1000): x0 = randrange(w) y0 = randrange(h) x1 = randrange(w) y1 = randrange(h) oled.line(x0, y0, x1, y1, 1) t1 = time.time() oled.show() t2 = time.time() print("%4d %.0fms" % (i, 1000*(t2-t1)))
しかし、表示が遅い。 計測するとが128x64dotの 画面更新に 250mSぐらいかかっている。 FT232Hは Hispeed (480Mbps)接続。 4KのFifoを持ち、 MPSSE(Multi-Protocol Synchronous Serial Engine)という専用ハードウェアを搭載しているので、 I2Cの 400Kbpsなんて楽勝だろうと思っていたのだが そうではなかったようだ。
I2Cの波形をオシロスコープで確認する。 確かに 400Kbpsで通信しているが、 バイトが連続しない。 300us毎に1byte通信している感じ。
通信の全体像、上SCL,下SDA。 | 通信密集部分で見ても、バイトの送信が連続しない。300uSに1byteぐらい。 | 1byteの通信を詳しく見ると、400KHzで動いている。 |
MPSSEについて調べると、 I2CやSPI,JTAGのプロトコルを 直接扱えるのかと思っていたが そうではなく、データをコマンドとして 解釈実行することで、さまざまなシリアル 通信を行えるというハードウェアらしい。 I2Cで1byte送信するにも数byteのコマンド+データを 送る必要があるようだ。
それでも,もっとI2Cを高速化できるのでは ないかという思いはあるのだが、 I2Cは、速度を追求するようなプロトコルではないし、 自分の用途的にも速度はいらないので、 動作が安定しているこの FT232Hを使って行こうかと思う。
調べていてわかったのだが、 このボードはI2Cのclock stretchingには対応していない。 FT232H自体は対応可能なのだが、それには追加の配線が 必要で、このボードでは行われていない。 自分としてはclock strechingは必要ないので問題ない。