マイコン工作実験日記

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パケットしか送れないコードになっていました。デバイス側だけでなく、ホスト側の処理も同じようです。その程度の使われ方しか想定していないんでしょうかね。


コメント
この記事をはてなブックマークに追加

ワイアレスデータ転送

2017-05-30 15:19:25 | Weblog


今さならながら10代工学の動画でPO-32を知りました。ワイヤレスデータ転送が新機能のひとつの売りのようです。懐かしい音に感激しちゃいますが、WiFiとかBluetoothじゃなくてマイクで拾うというのが、かえって新鮮に見えるのかもしれません。
コメント
この記事をはてなブックマークに追加

High Speedを確かめる - その2

2017-05-27 20:55:52 | Weblog
STM32F446を使ったUSB High SpeedのUVCの続きです。VGAの画面をUVCの非圧縮 YUV形式で送ろうとすると 640*480*2 = 61440バイト/フレームのデータ送信が必要となります。High speedのアイソクロナス転送ではトランザクションあたり1024バイトを送ることができますので、1フレームを送るには614400/1024 = 600トランザクションが必要です。1マイクロフレームに1トランザクションしか使わなければ 8000/600 = 13.3フレーム/秒までしか送れません。これ以上のフレームレートで送るためには、1マイクロフレームで複数回の転送が必要になります。

High speedでは1マイクロフレームで3回までのアイソクロナス転送が可能ですが、まずは2回での動作確認をしてみます。準備としてはCofnig Descriptorを変更してやります。High speed対応のエンドポイントでは、次のようにwMaxPacketSizeで1回あたりの転送量とマイクロフレームあたりの転送回数を指定します。



これでDataInのハンドラが呼ばれた時に最大2048バイトを転送してみたのですが... 画面は真っ黒なままで何も表示されません。前回と同じようにDataInのハンドラが呼び出された回数を確認してみると...



ダメダメです。マイクロフレームに2回どころか、2マイクロフレームに1回も送れてないじゃないですかぁ。そこで送信のコードを追いかけててみたところ、stm32f4xx_ll_usb.c の USB_EPStartXfer()に次のコードを見つけました。
      if (ep->type == EP_TYPE_ISOC)
      {
        USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_MULCNT);
        USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & (1 <

DIEPTSIZレジスタのMULフィールドには1マイクロフレームで送る転送数をセットしなければいけないのですが、これでは常に1回しか送らないことになってしまいます。この部分を修正したとろろ、ちゃんと2倍の速度で動くようになりました。

続いて3倍に挑戦してみたのですが、今度は全く動かず。DataInが1回しか呼び出されません。転送終了の割り込みがかからないということでしょうか?FIFOのサイズ設定を変更してみたりとかもしてみたのですが、やはり3パケットを送ることができません。もともと1パケットしか送れないコードだったくらいですから、これまでアイソクロナス転送で複数パケットを送るような使い方をされておらず、全くバグ取りができていないということでしょうか?
コメント
この記事をはてなブックマークに追加