Raspberry PiのI2Cデータ転送速度と波形を見る その2

 前回、I2Cのデータ転送を10kHzに設定して動作を確認しました。ラズパイのデフォルトは100kHzですが、低速でも温度センサからの読み出しができました。100kHz(100kビット/秒)はI2C規格のスタンダード・モードです。

よく使われる50kHz

 キャラクタLCDモジュールのACM1602を利用するときに、多くの方がこの50kHzの設定をされています。安定に温度を読み取っています。

中途半端な96kHzを設定しても問題なかった

 キャラクタLCDモジュールのACM1602ではSCLのクロックが0.2usほど早すぎるようなので、クロックをちょっとだけ下げて96kHzを設定をしました。

 微妙な周波数ですが、しっかり設定できることがわかります。

スタンダード・モードの100kHz

 省略します。

200kHz

 ちょっとだけ高速にします。

 SCLの波形がすごくなまっています。この後400kHzにすると、3.3Vまで波形が伸びません。垂直軸を19ビットと高精度にして表示をしているため、USBオシロスコープの演算速度が足りなくなったようです。

ファースト・モードの400kHz

 温度センサMCP9808は400kHzをサポートしています。PicoScope 5242Bの高精細度の表示をあきらめて8ビットに戻しました。

 I2Cのスタート・コンディションは、SCLがHIGHのときSDAがHIGHからLOWになるタイミングと規定されています。SCLが最初にLOWになるとき1クロック分のノイズが入るので、デコードに失敗します。そこで、SCLの見ている電圧とスレッショルドを変更して、正常にデコードできるようにしました。

 プログラムは正常に温度データを読みだしています。

ファースト・モード・プラスの1MHz

 温度センサMCP9808のサポート外の速度ですが、正常に温度データを送ってきます。

2MHzまではコンスタントに温度データを送ってくる

 PicoScope 5242Bではデコードがクリチカルになりました。KeysightのオシロスコープDSOX3012Tの観測結果です。

High-speed (Hs-mode) に挑戦したが

 3.4MHzではコンスタントに通信できていません。プログラムは途中で読めないとあきらめましたが、数十秒温度データを送っていました。