約1万円の測定器OpenScope MZ (4) ディジタル

電子工作でI2CやSPIはよく使われる

 電子工作ではArduinoやラズパイなどのマイコンを使います。OpenScope MZは2現象オシロスコープなので、アナログは2か所同時に観測できます。ディジタル入出力は、同時に複数個所を観測したいことがあります。

 I2CだとSDAとSCLの信号、SPIならCS、SCLK、MOSI、MISOの4か所です。SPIはデータ転送速度が高速です。OpenScope MZのディジタル入出力は10チャネルあり、サンプリング・レートは10MS/sです。

 各ポートは、流れ出すのが最大7mA、吸い込みが12mA、3.3Vのロジック・レベルに対応しています。マイコンのポートには200Ωの抵抗が直列に入っています。

 10個のポートをON/OFFさせる用途を思いつかなかったので、ANALYZERの機能を実験しました。

I2Cの信号をアナログとディジタルで見る

 I2C LCD表示器のAQM0802をつなぎ、信号を見ます。右下にあるDigitalのANALYZERを選び、3番と4番の端子をSDAとSCLにつなぎました。アナログ信号も見たいので、オシロスコープのCh1とCh2もSDAとSCLにつなぎました。つまり、ディジタルとアナログで、同じ信号を見ています。

 Pythonのプログラムで、繰り返しLCDへ文字を表示するプログラムを動かします。

 上の二つがディジタル信号で、下の二つがアナログ入力です。ラズパイのI2Cのデータ転送速度はデフォルトで100kHzです。アナログ入力でも十分きれいに波形が観測できます。中途半端な電圧が出ているのはACK信号です。

 ディジタル信号をデコードした値は表示されていません。将来、プロトコルに従ってデコードされた値が16進数などで表示できるようになると、デバッグ効率が飛躍的に高まります(コラム参照)。

SPI信号を見る

 ラズパイにSPIインターフェースの温度センサのADT7310をつなぎました。

 SPIのデータ転送は高速です。Digitalの5、6、7、8ピンに、ADT7310のCS(CE0)、MOSI(Din)、MISO(Dout)、CLK(SCLK)をつなぎ、10us/divの時間軸で観測しました。アナログ入力Ch1は8番(CLK)にトリガをかけています。画面から読み取ると、クロックは333kHzです。

 MISOは温度センサが送ってくる13ビットのデータです。手動でデコードしました。

 参考用;PicoScopeの結果です。

 SPIのクロックを1MHzにしました。CE0信号をトリガにし、立ち下がりに変更すると、信号をとらえれました。クロックを徐々に上げて観測しましたが、5MHzでは波形が方形波になりにくく、安定に観測できるのは2MHz程度かもしれません。

コラム ディジタル信号の1と0

 ラズパイのように電子工作で利用するマイコンの多くは3.3Vの電源で動きます。I/OもHighは3.3VでLowは0Vです。I2Cでは信号のレベルが規定されています(http://www.nxp.com/documents/user_manual/UM10204_JA.pdf)。

  • VIL(Low Level Input Voltage) :-0.5V~0.99V(1.5V固定の例外もある)
  • VIH(High Level Input Voltage):最小2.31V(3V固定の例外もある)

 データシートには、次のようなタイムチャートが出ています。

 実際の波形では、Highは3.3V前後、Lowは瞬間的にマイナス・レベルにもなっています(I2Cの4MHz)。

 USBオシロスコープのPicoScopeは、アナログ信号でもI2Cプロトコルをデコードできます。Highのレベルを判断するのにスレッショルド電圧を設定します。ラズパイのI2C信号で、スタート・コンディションが始まるとき、SCLが2.5V付近まで下がる瞬間があります。スレッショルドを3Vとすると、スタート・コンディションを間違ってデコードしてしまいます。