(日々の記録)デジタルオシロを買った。(日)STM32F107でTFT液晶基板が動くまでAitendoの生STM32基板は、STM32F107VCT6を載せ、USBの仮想UARTモニターが動くところまで来た。このプロジェクトの最終目標は、この基板にTFT液晶をつけ、グラフィック気圧計を作ることだが、スランプから抜け出せていないので、どうも歩みがのろい。色んなところで道草を食いながらの電子工作である。仮想UART端末のUSBストリームをロジアナでプローブする(2/7/2012)ダブルバッファーを採用してSTM32F107の仮想シリアル端末(VCOM)は、無事、大量のデータをPCに送ることに成功した。実は気がかりなことが残っている。送信の最初に必ず1バイト無駄なデータを送ってしまっているのだ。送信ストリームが始まれば送られないし、送っているデータは、0X00という無効(端末に表示されない)データなので表面上は見えない。シリアル端末で操作している限り問題は出てこないが、気分は良くない。1バイトだけとはいえ、ゴミはゴミである。成功したといえるレベルではない。なったかというと、最初0バイトのデータを送ったところ、新しいUSBライブラリのエンドバッファー書き込み関数SIL_WRITE()が、割り込みルーチンの中では終了割り込みが入るのに、ユーザー側で0バイトを書くと終了割り込みが起きないのである。このままだと永遠に送信が開始されない。それで仕方なく、1バイトのNULLデータを送って割り込みを開始するようにした。何とか大量のデータ送出は問題なくなったが、前の記事をアップした後も、これが気になっていろいろと考えていた。ダミーデータを送らなくても送信を開始できるロジックは、考え出してみると、何故、これに気がつかなかったのかと思うくらい簡単なロジックになった。やりかたは簡単で、最初の送信要求1バイトは、バッファーに書かず、直接SIL_WRITE()でエンドバッファーに書き込み、この終了を待って、次の送信要求をバッファーに書いていく。すれば、最初の1バイトを送ったあとの割り込みが割り込みルーチンに入り、バッファーに入っていたデータが送られていく。最初から有効データなのでゴミは送られない。このあとの送出は、バッファーに書き込まれるだけなので、データの送り込みと、SIL_WRITE()の書き込みは分離される。よし、これで良い筈だ。機嫌よくテストに入る。これが反対に頻繁にデータの欠落が起きるようになってしまった。データが入るはずなのに何故だ。実は、この仮想端末には極くまれにしか起きないが、まだ不具合が残っている。SIL_WRITE()が少量データを書いたときに限って(リターンキイのみなど)、前のデータを一部重複して出力することがある。USBのハード割り込みがデータ処理時に入ってしまうからかもしれない。今度の改良は、この不具合に巻き込まれたのだろうか。良い機会なので、トラブルシューティングのために、ロジアナで、実際にUSBにデータを送り出しているところまで徹底的に詳しく調べることにした。ストロベリーリナックスで大枚4万をはたいて買ったロジアナである。200Mhzの分解能を持っている。プロトコルアナライザーにもそこそこ使える。現在のUSBの主流2.0はサポートしていない(USB1.1はサポートしているが)。ウェブを探して事情が良くわかった。2.0のUSBを見るには、本格的には50万円以上する測定器が必要なのだ。2.0には480Mbpsのハイスピードモードがある。4万足らずのロジアナで見られるわけがない。それでも、中には10万クラスのアナライザーもあるようだが、いずれにしても業務用でアマチュアの手の出せる世界ではない。今使っているフルスピードクラスは12Mbpsなので、どんな信号か調べるだけならこのクラスのロジアナでも十分把握可能だ。リチウム電池の充電用に作ったUSBのAプラグ、Bプラグ、5Vアダプターコンセントの基板に、ピンソケットを追加して、USBの信号線を途中で取り出せるようにした。よーし、USBのデータも見えるようになった。USBがアイドルのときのほうがホストとのやりとりが頻繁で、一旦データ送信モードになるとパケット通信的にデータをひとまとめにして送っているのが良くわかる。SIL_WRITE()が少量のデータ送出で極くまれにデータを被って送出する時があるのは、USB本体の割り込みと重なっているからと考えていたが、USBへの送出はかなり時間がたってからであり、それが原因ではなさそうだ。それにしてもおかしい。データが欠落するのは最初だけではない。ロジアナでは中身のデータまで調べ切れない。LEDのプローブをあちこちかけて調べる。調べて、原因はやっぱりこっちの基本的ミスとわかる。修正のときにバッファーの順番を間違えてしまっていた。ユーザーが書き込んでいる最中のバッファーをエンドポイントバッファーに書き込めば、おかしくなるのは当然である。順番を換えて(というより元に戻して)、無事、前のような正確な送出に戻った。これでみなさんに自信を持ってソースコードを使ってもらえる。以下にEclipseのプロジェクトとして入ったソースコード一式をzipファイルの形で置きます。前記事同様、libフォルダーが削除されていますので注意してください。前回のコードは破棄してください。「pub20712_STM32_VCOM3.zip」をダウンロード秋月の¥1000のステッピングモーターを試す(2/8/2012)プロジェクトが進まない時は、気分転換が一番である。秋葉原にもご無沙汰だったので、仕事の帰りに久しぶりに秋月電子に寄った。最近売り出したステッピングモーターを買うためである。秋月には、このところマイクロマウスなどに使えそうな適当なステッピングモーターがなかったが、最近、手頃な大きさのものが売り出された。価格も¥1000と安く種類も多い。マイクロマウスは、中級者まではステッピングモーターが良く使われるようで(上級者は強力なDCモーター)、前から欲しかったのだが、ウェブに紹介される定番のモーターはどれもひとつ¥5000近くし、ちょっと手が出しにくかった。マウスにするなら少なくとも2台はいるので一回の投資額は1万を超える。どこまで本気でやるか決めかねているときに、この額は大きすぎる。一個¥1000なら気楽だ。5Vのユニポーラにする(前の回路がそのまま使える)[ST-42BYG0506H]。テストのためだけなので1台だけである。これまでのFETドライバーに、いそいそとつける。ありゃあ、全く動かない。シャフトをさわると電源を入れるたびにピクピク動いているので配線間違いの可能性が高い。