マイコン工作実験日記

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

ワイアレスデータ転送

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パケットしか送れないコードだったくらいですから、これまでアイソクロナス転送で複数パケットを送るような使い方をされておらず、全くバグ取りができていないということでしょうか?

High Speedを確かめる

2017-05-26 22:31:26 | Weblog


ようやくMacとUVC接続できるようになったものの、表示させたカラーバーのスクロール速度がとても遅くて、1ラスタずつスクロールしていると縦方向480ラスタを移動するのに1分ちょっとかかってしまっています。1秒間に8フレームも送れていない計算になります。

確かにFull speedには出せない転送速度は出てはいるものの、High speedにしては遅すぎるので、ちょっと調べて見ました。具体的にはSOF割り込みの回数(sof_total) と アイソクロナス転送要求の回数 (datain_total)、そして1秒あたりの転送要求回数 (datain_sec)を数えてみました。High speedでは マイクロフレーム(125usec)毎にSOFと転送がかかるので、1秒間に8000回のSOF/転送が発生するはずなのですが、10秒ほどカメラを動かすと次のような結果となりました。



どうやら半分しか転送処理が走っていないようです。アイソクロナス転送で送るラスターデータを、その度に作成してから送信していたので、どうやら1回あたりのデータ作成とその送信処理が125usec以内に間に合わなかったために、2回に1回しか送信ができていなかったようです。そこで、あらかじめRGBのデータを用意しておきて、それにUVCのヘッダ情報を加えるだけに処理を簡略化してみました。



今度は、毎秒8000回の送信が回るようになり、画面のスクロール速度も倍になりました。現在はアイソクロナス転送で使用するエンドポイントのサイズを1024バイトにしているので、これで想定通り64Mbpsで送れていることになります。さて、High speedでは1マイクロフレームで、アイソクロナス転送を3回送ることが可能な仕様になっていますので、今度はこれに挑戦してみることにします。

MacOSで再挑戦

2017-05-23 23:52:23 | Weblog


昨年UVCを使ってSTM32L476をMacOSとつなげようとした際には、Config descriptorの読み取りはするものの、その後MacOS側から何のアクセスもないために接続できずにいました。今回 STM32F446 と USB3300を使って再挑戦して、試行錯誤しておりましたが、何とか動作確認のためのカラーバー画面を出すことができました。

動作確認に使っているソフトはPhoto Boothです。



画面サイズは VGAサイズ(640x480)を使っています。今回の実験でわかったのですが、どうやらPhoto Boothは VGAよりも小さい画面サイズだとカメラとして使ってくれないようです。これでUSBハイスピードで画像データを送れることを確認できたのですが、何だかスクロール表示速度が遅いようなので、もう少しちゃんと転送速度を確認した方が良さそうです。

USB3300をつなげた

2017-05-14 10:40:51 | Weblog


eBayで購入してあったUSB3300 PHYをようやくとNucleo-F466REに接続。
PHY用のULPIに割り当てた端子と直結するだけでですが、Nucleoボード上で使用されている端子が2つあるのでこれらについてはジャンパ変更が必要です。
  • PA3 (ULPI_D0)は ST-LinkのVCOM用UARTとして使われているのでSB13を取り外して、切り離し。
  • PA5(ULPI_CLK)はボード上の緑LEDとつながっているので、念の為SB21を取り外して切り離し。

これでUSB High Speedを試す準備は整ったので、あとはソフトの作成です。とりあえず、CubeMXを使ってCDCデバイスのドライバを組み込んで動かして見たところ、アプリケーションは何も書かなくても、CDCデバイスとしての認識はできたのでハードウェアとしては機能している様です。デバイス側のドライバは基本的に割り込みで動作する様に作られているので、アプリケーションが無くてもUSBデバイスのエニュメレーションまでは動いてくれるのでした。

今後の予定としてはSTM32L476で中途半端な状態で断念したUVCに、このSTM32F466でHigh speedで再挑戦して見るつもりです。カメラをつなげてUVCカメラとすべくカメラ接続用のコネクタも用意しておきました。