かつかれーのメモ帳

実験ノートか勉強記録

CY7C68013Aボードで簡易USBロジアナ

Cypress社のマイコン、CY7C68013Aが乗ったボード(いわゆるEZ-USB FX2LPボード)を簡単にロジアナ化できるということなのでやってみました。
具体的な手順は先人達が良くまとめて下さっているのですが、古い情報も混在しているので補足と共にリンク集的に書き留めておきます。

環境構築

そもそもこのボードはSaleae社のLogicというロジアナのクローンを作るために利用されていたようで、同社の公式ドライバと公式アプリを組み合わせて使う方法について書かれた記事も多く見つかりますが、現在は対策されていて出来なくなっているようです。
したがって、PC側のソフトはSigrok一択と思われます。

PulseView・Sigrok-cli

Sigrokのクライアントです。PulseViewはGUIで、Sigrok-cliCLI。本記事の最後に書いたPython連携なんかが不要ならCLIは入れなくてもOKです。インストールは以下のリンクから。
Windows - sigrok

マイコンの開発環境

以下のリンクにもある通り、cy3684kit_RC8をhttp://www.cypress.com/file/135301から入手してインストールします。適当に進めていたらCドライブ直下に複数のツールが入ってしまい、サブPCにインストールすれば良かったという気持ちに…
EZ-USB開発環境設定メモ - neko Java Home Page

ボード

下のリンクに記載のある、Geeetech版のボードが良さそうです。
Lcsoft Mini Board - sigrok
CY7C68013AでAmazonを検索するといくつかヒットしますが、例えばこれとかはトップの画像が同じもののようです。
Amazon.co.jp: EZ-USB FX2LP CY7C68013A USB 開発コアボードのロジックアナライザ: 産業・研究開発用品
ジャンパ2つとスイッチ2つを備えたボードです。

ボードの説明

回路図が見つからなかったのでざっと触って調べた程度ですが、簡単にボードの解説を入れておきます。論理が逆になっているボードなども普通に流通していそうなので、以下の情報を使う際は自己責任で。

J1

LEDを使用するか否か決めるもののようですね。PA0とPA1にはLED(D1,D2)のカソードが繋がっているのですが、アノード側はJ1経由でVCCから電流が供給されているため、J1を抜くと光らなくなります。
Sigrokは、当ボードがロジアナとしての動作している間LEDを点滅させてお知らせしてくれるみたいなので、刺したままにしておくのが良さそうです。

J2

AVRで言うところのHWBボタンみたいなものですね。普段は抜いたままにしておきます。差し込んだ状態で電源を供給すると素のCY7C68013Aとして認識され(マイコンからEEPROMが見えなくなるためROMを読みに行ってブートすることがなくなる)、開発ツールから各種書き込みができます。当然、開発ツールからEEPROMの内容を書き換えるときはジャンパを抜いてEEPROMにアクセス可能にする必要があることに注意です。マイコンを起動したらすぐジャンパを抜きましょう。

青い大きなスイッチ

USBのバスパワーを基板に供給するか決めるためのもので、どうしてもセルフパワーで使いたいというのでない限り供給するようにしておけばいいと思います(USBケーブルを刺した状態で「POWER LEDが光る側」にしておけば良いです)。

表面実装のタクトスイッチ

マイコンのリセットボタンです。J2刺して再起動するときとかに使えます。

VID/PIDの書き換え

J2を抜いた状態でUSBケーブルを刺すと、素のCY7C68013Aボードとして認識されると思います。ドライバが当たっていなければ、C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.1\Drivers以下を指定して読み込みます。
あとはEZ-USBロジックアナライザー - neko Java Home Pageの通り、

  • C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.1\Windows Applications\Application Source files\c_sharp\controlcenter\bin\Release\CyControl.exe を使って、VID/PIDを1D50/608Cに書き換え。EEPROM容量は16kBあるので、Req codeは0xA9です。
  • PulseView同梱のZadigを使って、VID/PID=1D50/608CのデバイスにWinUSBドライバを割り当て

の手順を済ませれば、デバイスとプリンターメニューでは"Unknown Device #1"という名前で見えるようになるはず(ドライバは当たっている)。

完成!

この状態でPulseViewを起動すると、ファームウエアがボードに流し込まれます。USBデバイスのデタッチ・アタッチが自動的に行われたあとfx2lafwというデバイス名で認識され、無事波形が取れるようになります。

f:id:DSKK:20210514024327p:plain
波形の観測例

ちなみに、マイコンのPB0~PB7がロジアナのch0~7にそれぞれ対応します。信号名をつけられたり解析機能があったりいろいろと便利な感じで、普通の用途だとこれで十分なんじゃないでしょうか?

長時間測定とPython連携

C:\Program Files\sigrok\sigrok-cliにパスが通っている前提で、

sigrok-cli --config samplerate=4M --driver=fx2lafw --continuous

のようにすると標準出力にデータが出てきます。リダイレクトによってテキストで保存するとこんな感じ。

f:id:DSKK:20210509042950p:plain
連続測定の結果

samplerateは4Mまで安定していました。PulseViewだと24Mまで動くのにSigrok-cliだと割とすぐダメになるっぽい?
これをPythonで受けるにはsubprocessモジュールを使えばよくて、基本のコードは大体以下のような感じ。

import subprocess
cmd=[
"C:/Program Files/sigrok/sigrok-cli/sigrok-cli",
"--config",
"samplerate=4M",
"--driver=fx2lafw",
"--continuous"
]
proc = subprocess.Popen(cmd,stdout=subprocess.PIPE,text=True)
proc.stdout.readline() #useless line
proc.stdout.readline() #useless line
l=[]
try:
    while True:
        out = proc.stdout.readline()
        if out=="": #通信がダメになると空文字列が返ってくるので測定終了
            proc.kill()
            break
        l.append(out)
except KeyboardInterrupt: #手動で止める際の処理
    proc.kill()

lの各要素は

"D0:11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111\n"

みたいな感じなので、適宜成型して解釈すれば良いでしょう。
ちなみに、readline()はブロッキング実行で、USBのFIFOが空の間は待ちになります。実測してみたら16ms周期で5000~10000行くらいドバっと送られてきているみたい。timeモジュールで時間を実測しても意味ないので、samplerateが正しいと信じてlistのindexから時間を割り出してプロットなどするのが良いです。1MSpsを指定して5分くらい測ってみましたが、99.9914%くらいの精度で時間は正しかったです(=データが上がってくる周期が1 usよりもほんのわずかに短い)。
ここまで書いて気付いたのですが、これPulseViewでサンプル数を1Tとかすごく大きな数にして測定すればよくない…?