概要
オープンソースの信号分析ソフトウエアのsigrokを利用して、一番手頃に手に入るCypress EZ-USB® FX2LPを使っての、ロジックアナライザーを試してみました。
sigrokとは?
オープンソースで開発されている信号分析で、ロジックアナライザーとして使われることが多いですがオシロスコープなど、アナログデータの測定も可能です。
実際にはPulusViewというGUIで動くアプリを使い、内部でsigrokが呼ばれる形となります。
Cypress EZ-USB® FX2LPとは?
USBコントローラーで、USBをかんたんに利用するための開発用モジュールです。趣味レベルでUSBデバイスを作りたいときに便利に使えます。最近はArduino Pro MicroでもUSBキーボードなどをかんたんに作ることができましたが、昔は気軽に使えるのはこれでした。
USBからそれなりの速度で自由に利用できるGPIOがありますので、ロジックアナライザーとしても利用することができます。
利用した商品
Cypress EZ-USB® FX2LP
先程の、一番標準的な開発ボードです。特徴として安いですが、ロジックアナライザー用ではなく汎用開発ボードなので、ケースには入っていません。16チャンネルのロジックアナライザーとして利用できますが、mini端子のUSBケーブルや接続用のケーブルは付属しません。また、プライムの商品はなかったので、届くまで非常に時間がかかると思います。
ロジックアナライザー
中身はFX2LPなのですが、若干ロジックアナライザー用の回路になっています。FX2LP単品に比べるとケーブルが付属されています。クリップ付きのが便利そうですが、付属品が必要ないのであればFX2LP単体の方が安く手に入ると思います。ただし、こちらの商品は8チャンネルです。
Hantek 6022BL
こちらのオシロスコープにも、FX2LPが入っています。ただし、オシロスコープと同時に利用することはできません。本体のスイッチをPにしてから接続することでFX2LPのロジックアナライザーとして認識します。ケーブルなどの付属品は充実しています。
上記にオシロスコープの使い方はまとめてあります。
おそらく同等品を別で購入したほうが安いです。ものを増やしたくない場合にはセットのBLをおすすめですが、価格的にはBEとロジックアナライザーは別に買ったほうがおすすめです。
sigrokのセットアップ
上記ページから、環境に合わせてセットアップしてください。セットアップは特に問題ないと思います。
ドライバーのセットアップ
ロジックアナライザーを接続すると、通常ドライバーがないのでそのままだと利用することができません。
Windows環境の場合にはZadigを利用します。sigrokのではなくZadigを直接利用しても大丈夫でした。
こんな感じでUnknown DeviceのドライバーをWinUSBに書換えます。USB IDが04B4と8613になっていますが、これはFX2LPの開発ボードのIDになります。FX2LPは青いボタンが電源ボタンなので、押し込んでLEDが光っている状態でないと認識しないので注意しましょう。
ロジックアナライザーやHantek 6022BLの場合には以下の画面でした。
0925と3881ですね。このUSBのベンダーIDは本来Saleae Logicと呼ばれる製品のものになります。
上記の製品の、古い型のものになります。これの中身もFX2LPだったんですね。そして安いロジックアナライザーは、USBのベンダーIDとプロダクトID、設定などを書換えて初代のSaleae Logicと同じ動きをするクローンとなります。
この商品なんかは、なんとSaleaeのアプリも同梱しています!
中身は少し古いバージョンで、クローンのロジックアナライザーでも動くソフトウエアだと思いますが、完全にダメなやつなので使わないでください。ちなみにこれのロジックアナライザーがないタイプは秋月電子で取り扱っていますが、こちらのバージョンは取り扱っていません。つまりそういうことだと思います、、、
sigrok(PulseView)の起動
起動時には上記のような画面がでて、対応機種が接続されているかスキャンしています。
なにも接続されていない場合には、上記のようなデモ用デバイスが表示されます。左上にあるRUNを押すとデータを取り込みます。
マウスのスクロールで拡大ができるので、拡大してみました。アナログとデジタルの波形が表示されていますね。
FX2LPを接続して実行
上記の画面で立ち上がりました。デバイスはCypress FX2と認識されています。デジタルの16チャンネルとして認識されています。
チャンネル設定
左から説明しますが、チャンネル設定は下にあるような画面がでて、名前の他に色と高さとトリガーを設定することができます。
トリガーは後で説明しますが、一番左はトリガーなし、LOWレベル、HIGHレベル、LOWからHIGHになった場合、HIGHからLOWになった場合、信号レベルが変わった場合の設定です。
デバイス設定
上記のような画面でデバイスを選択できます。自動認識している場合にはスキャンしてもデバイスが表示されません。基本的にはこの画面を利用せずに、起動時に自動認識させたほうがいいと思います。
プリトリガー割合
上記のような画面で、トリガーの前のデータをどれぐらいキャプチャーするのかを指定します。10%にすると、トリガーがかかる前のデータが全体の10%で、90%がトリガー後のデータになります。
チャンネル設定
画面に表示するチャンネルを指定します。基本的に利用しないチャンネルは非表示にしたほうが描画は軽くなります。データは全チャンネルで取得しているので、画面に表示するかの選択みたいです。
サンプリング数とサンプリングレート
この2つは組み合わせで指定します。まずは必要なサンプリングレートを指定します。対象の信号よりも高いサンプリングレートを指定します。たとえば100kHzのI2Cを測定するのは4倍以上の500kHzなどを選択します。500kHzのサンプリングレートの場合、サンプリング数を500kに設定すると1秒分のデータをキャプチャすることになります。5Mにすると10秒分ですね。サンプリングレートとサンプリング数を同じ数字にすると1秒になると覚えて、必要な長さを指定します。
プロトコル分析
ボタンを押すと右側に上記のような画面が表示されます。信号のプロトコルを分析する場合に利用します。のちほどI2Cの分析を実際にしてみたいと思います。
Saleae Logicクローンを接続した場合
Saleae Logicとして、8チャンネルが認識されました。チャンネル数が少ない以外はFX2LPとできることは同じです。
I2Cを分析してみる
とりあえず、I2C信号を取得するためにATOM Mtrixを利用しました。なんでもいいのですが、内蔵I2Cデバイスがあって、かんたんに信号取り出せるものとして便利でした。
動いているスケッチは100ミリ秒間隔で、内蔵IMUからデータを取得するものになります。今回は実際のデータが正しいかまでは確認していません。
sigrok | FX2LP | ATOM | I2C |
D0 | PB0 | GPIO21 | SCL |
D1 | PB1 | GPIO25 | SDA |
D2 | PB2 | ||
D3 | PB3 | ||
D4 | PB4 | ||
D5 | PB5 | ||
D6 | PB6 | ||
D7 | PB7 | ||
D8 | PD0 | ||
D9 | PD1 | ||
D10 | PD2 | ||
D11 | PD3 | ||
D12 | PD4 | ||
D13 | PD5 | ||
D14 | PD6 | ||
D15 | PD7 |
ピンの対応は上位の通りです。PBは隣り合っていますが、PDはずれているのでちょっと使いにくいですね。I2Cなので2ピンしか接続していません。
とりあえず500kHzで500kサンプリングしてみました。信号の間隔が約100ミリ秒なので、1秒間に7回データ取得と通信の分ずれていますね。本来はちゃんとタイマーなどで100ミリ秒間隔にしたほうが加速度などの精度がでないと思います。
わかりにくいですが、D0はクロック信号なので、きれいな矩形波で定期的に動いています。D1はデータ通信なので、がたがたしている信号になります。
拡大した画面になります。100kHzのI2Cを500kHzのサンプリング周波数でキャプチャーしているので、きれいに取れていますね。
サンプリング周波数を変えてみます。
250kHzに落としてみました。一番短い信号が3ポイントしかなくなったので、ちょっと不安ですね。
200kHzです。2ポイントに減りました。
100kHzです。1ポイントになりました。これだとデータ取りこぼしている可能性がありますね。
ちなみにサンプリング周波数を上げていくと、6MHzぐらいでたまに取り込みに失敗するようになります。8MHzだとほとんど失敗してデータ取得できません。
これはびろーんと伸びたプローブの線も原因なのですが、ケースがあったほうがノイズが乗りにくいのかもしれません。ただなんどか試していると12MHzぐらいでも安定して成功する場合もあります。Saleae Logicクローンだと8チャンネルしかないので、もう少し安定している印象がありますが実際にはそれほど変わらないかもしれません。
チャンネル数の制限
2チャンネルに表示を減らしたところです。データ取得は全チャンネルで行っていますので、非表示で取得したあとにチェックを入れると、非表示だったチャンネルの信号も画面には表示されます。
プロトコル分析
I2Cを選択すると、一番下にI2Cが追加されます。追加した直後の場合にはエラーで赤くなっているはずです。ちなみにI2Cは他に2つありますが、複数のI2Cを切り替えて利用する機材用のI2C demuxと、対象アドレスなどでフィルターをする場合のI2C filterがありますが、通常はあまり使わないと思います。
おそらく、上記のようなユニットがI2C demuxなのかな?
I2Cをクリックすると設定画面が表示されます。SCLとSDAがどのチャンネルかを指定します。すると信号の下に解析結果が表示されるようになります。
拡大してみました。あの短い信号はACKの応答でしたね。
トリガーについて
トリガーなしの場合には、通信していない部分もすべてキャプチャしています。RUNを押してから最初に通信が発生するまでもタイミング次第なので、キャプターによってばらつきがでます。この場合トリガーを利用することで、もう少し賢く取得することが可能になります。
上記がATOMのリセットボタンを押しながら、キャプチャを開始して、その後リセットボタンを離したときのキャプチャです。キャプチャ開始までの時間が無駄ですよね。。。一番最初の通信がIMUの初期化で、それ以降は100ミリ秒ウエイトしながらデータを取得しています。
そこでD0のトリガーをLOWに信号が落ちた時に設定してみます。
すると最初にあった通信していない時間がなくなりました。
プレトリガーを10%にしてみました。この場合トリガーの前に信号がないので意味がないのですが、500kHzサンプリング周波数で1Mサンプリング数なので2秒間のキャプチャを行っています。その10%がプレトリガーなのでトリガーの前の200ミリ秒のデータも記録されています。
SPIとかでCSがある場合には、CSをトリガーにすることでデータが取得しやすいと思います。面倒な場合には長めに取得して、自分で波形みて確認すればトリガーは必要ありません。
まとめ
I2Cであれば、かなりかんたんにプロトコル分析まで行えると思います。24MHzですが、安定的に使えるのは12MHzぐらいまでになります。その場合には3MHzぐらいまでの信号であれば安心して分析できそうですね。
SPI通信を本格的に分析するのにはちょっと物足りないスペックだと思います。ただSPIは自由に速度を設定できる場合があるので、速度を落として動かすことで解析できる場合もあると思います。
8チャンネルか16チャンネルかは好みですが、8チャンネル以上必要はのはおそらくパラレル接続のLCDなどだと思います。
上記などは画面自体はパラレル接続なので、8チャンネル以上の端子が必要になります。ただし一般的には付属しているI2C変換などを使うので2チャンネルでも大丈夫なことが多いです。
あとは上記のようなLCDですね。SPI接続のものを使えばいいのですが、パラレルのものも多少あります。パラレルの場合にはデータが8本で、制御がさらに複数本あるので16チャンネルは必要になります。あまり使わないデバイスですが、まあ人によりますね。大抵はI2Cなので2チャンネルで足りるとは思います。
コメント