マイコン工作実験日記

Microcontroller を用いての工作、実験記録

High Speedを確かめる - その4

2017-06-11 13:21:40 | Weblog
USB High speedへの挑戦シリーズの4回目。アイソクロナス転送を使ってのUVCでカラーバーの表示は一応できたので、Full speedの時と同じように文字表示の実験をしてみました。今回はVGA解像度(640x480)を使っているので、YUV形式でのデータ量は1フレームあたり 640*480*2 = 600KB必要になります。STM32F446にはRAMは128KBしかありませんので、1画面分のフレームバッファーを用意することはできません。そこでRAM内には画面に表示される文字のコードと色情報だけを保持しておき、UVCのデータを送信する際に必要なラスタのビットイメージを生成してやることにしました。

処理を簡単にするために、1マイクロフレーム(125us)で1ラスタ送ることにすれば、毎秒 8000/480 = 16.66フレーム送れることになります。1ラスタには 640*2 = 1280バイトのデータが必要なので、1マイクロフレームで2トランザクションパケットを送信すればいいことになります。試しに、これをやってみたのでうが、ちっともMacの画面に画像が表示されません。試行錯誤しながらUSB PHYをつなげているコネクタのあたりをいじっていたら画面に表示ができました。




文字の表示が鏡文字になってしまっていますが、これは使用しているアプリ Photo Boothがもともと自撮り用のアプリになっているためです。それはいいとしても、なぜか意図したのとは表示されている色が違っています。コネクタをグリグリしてみても、色が代わることはありません。何度試してみても、コネクタ周りをいじらないとうまく表示しないし、色も違っています。テストバーの表示だけだったら、こんなことはなかったのですが。。。

どうも送信が安定していないようなので、1マイクロフレームで送信するパケットをひとつだけに変更してみました。それでもなかなかうまく表示ができません。やはり、コネクタをいじっていると何かの拍子に突然表示が現れます。

今度は意図した色で表示ができているようです。撮影ボタンを押して画面の表示をキャプチャすれば、文字の表示方向が正しくなった画像を取得できました。



どうにか文字は表示できたものの、全然動作が安定していません。コネクタの接触の問題なのかもしれませんが、カラーバーの表示であればいつも安定して表示できます。送信するデータの内容によってデータ化けがが生じてしまっているのではないでしょうか。PHYをつなぐワイヤ上にノイズが載っており、その影響で正しくデータが送られていないのではないかと想像しています。ユニバーサル基板でUSBハイスピードを実験するのは厳しいかな?



J-Link EDU-mini

2017-06-09 15:18:41 | Weblog
今日見たらSEGGERのホームページが模様替えしていました。

このSEGGERが、新製品としてJ-Link EDU Miniを発表しています。機能的にはEDUと同じですが、小さくてケース無しです。お値段 $18と EDUの 1/3になったけど、ダウンロード速度が 1/5に制限されてしまっているのが、ちょっと残念なところ。JTAGも作るよりも買った方が安いものになりましたね。

使っているのはNXPのMK22あたりでしょうか。コネクタはハーフピッチの10ピンのようですが、製品付属のケーブルは20ピンらしい。なんでやねん。

High Speedを確かめる - その3

2017-06-03 16:31:49 | Weblog
なかなか進まないHigh Speedでのアイソクロナス転送の動作確認。前回の記事で書き忘れていたことがあったので、書き加えておきます。

そもそもCubeMXの吐いたコードでは、USB FiFoへの転送にDMAを使うように設定するとちゃんと動いてくれませんでした。STM32 Forumを探したら同じような人を発見。どうも最近のHALのアップデートでおかしくなっているらしい。そしてもう少し探していたら、パッチを出してくれている人を発見。このパッチを入れたら、DMAでマイクロフレームあたり2つのパケットを出すことができるようになったのですが、3つ出そうとするとやはりうまく動いてくれません。ステータスレジスタを読んでIN endpointの動作状況を調べてみると...



どうやら3つ目のパケットを送信しようとした時点で、送信FIFOにまだデータの準備が整っていないようです。DMAでFIFOにデータ送っているハズなんですが、DMA転送が間に合っていないってことなんでしょうか?USBの内部DMAについてはマニュアルを読んでもほとんど説明がありません。そもそもOTG_HSの説明すらあまり充実しているとは言えないのですが、その背景にはUSB OTG部分そのものがSynopsisから買ってきたIPを使っているからという大人の事情があるのかもしれません。

どうすればDMAが正しく動くようになるのか見当もつかなかったので、試しにDMAを使わずにソフトでTx FIFOに書き込むようにしてみたら、なんと1マイクロフレームに3パケット送れるようになりました。とりあえず、3パケット送れることは確認できましたが、どれだけ実用的に使えるのは不安ですね。

STM32のHigh SpeedってSTM32F2の時代からあるのでとっくに枯れているのだと思っていましたが、実際にCubeMXのアイソクロナス転送を使ってみるとドライバのコードは1マイクロフレームで1パケットしか送れないコードになっていました。デバイス側だけでなく、ホスト側の処理も同じようです。その程度の使われ方しか想定していないんでしょうかね。