カメラモジュール奮闘記-USBデバイスFT232HでCPLDからPCへデータを送ってみた-
最終的には、カメラ→CPLD→USB→PCの予定ですが、とりあえずCPLDから正確にデータが送れるのか?!ということで、CPLD→USB→PCで通信ができるか試してみました。
前回も紹介しましたがCPLDはMAXII、USBデバイスはFT232H、両者は同期FIFOで通信をします。
接続様子
データシートより、同期FIFOモードにおいて、FT232HとCPLDは以下のタイミングで通信をする必要があります。
今回はPCへ書き込むだけなのでWrite Timingをみます。
TXEはFT232Hの状態を示す信号、'1'の時はビジー、'0'の時はWrite可能な状態です。
WRはFT232Hへ書き込みを命令する信号、'0'にすると同時にデータも送ります。
図より、TXEが'0'になったあと1クロック空けてWRを'0'にしなければならないようです。
これを実現するロジックを設計し、CPLDへ書き込みました。
今回は、送信毎にカウントアップされるデータ"CNT"を送信してみました。
データの受信側(PC)のソフトです。適当に作りました。
FTDIのドライバFTD2XXを使っています。
カメラから画像を30枚送ったと仮定して、それと同じ量のデータ約18[Mbyte]を送信。
約0.5秒で受信できました。平均約36[Mbyte/s]で、USBメモリ並みです。
2[byte]を1[pixel]として、受信データを画像に起こしてみました。
”CNT"は0,1,2...255,0,1,2...255...と256回で1周期、1[pixel]は2[byte]、画像の横幅は640[pixel]なので
640/256*2=5、パターンは5回繰り返されることになります。
どうやらちゃんと受信できているようです。バイナリエディタでも確認しました。
さて、次はカメラからのデータをCPLDを通してFT232Hへ渡すことになるのですが、ここがなかなか難しかったです。
課題は2つありました。
1. カメラのデータ送信クロック24[MHz]から、FT232Hのデータ受信クロック60[MHz]への変換
2. カメラからはひっきり無にデータが送られてくるから、FT232Hがビジーの時にデータを退避する場所の確保
1.については、カメラからデータを受け取るごとにフラグを立てて、次のFT232Hのクロックでデータを送信してみたり。リングバッファを構成してみたり・・・10種類近くの手を打ってみましたが思うようにいかず。。。
受信はできるんですけどデータが壊れてしまうんです。。。
調べてみるとかなり難易度が高い技だということがわかりました。
2.についてですが、実験からFT232Hは256byte受け取るごとにビジー状態になることがわかりました。
ビジー状態の長さは毎回変わります。
その間にカメラからのデータをRAM等に退避するのですが、長さが予想できない程ばらついているのでRAMの大きさを安易に決められません。
(そして、非同期FIFOや別のモードにすれば解決はできるけど、今回欲しい転送速度は同期FIFO以外では得られないという厳しい現実・・・)
以上より、クロック周波数の変換ができない。退避データの大きさが予測でないということになりました・・・
色々考えましたが、カメラのデータを一度全部RAM等に保存して、あとからPCに送ろうと思います。
たぶんそれが最もシンプルです。
RAMはPCのメモリに使われているSDRAMが安くて高速なので使いたいです。
(まだ、SDRAMがどんなものかもしらないのでなんとも言えませんが)
これからそのデータシートを読もうと思っていますが・・・
そういえば、未だにカメラからちゃんとしたデータが送られてくるのか確認していませんよね・・・w
というころで、ひとまず同期FIFOではなく、非同期FIFOで先ほどの2つの問題を解決して、それでデータをPCに送り、ちゃんとカメラが動くかどうか確認しようと考えています。
(ただし、その場合十分な転送速度が得られないので、カメラの動作クロックを遅くしなければいけません)
被写体が止まっているのなら、非同期FIFOでのんびりデータを送ればいいんですけどね・・・
引きこもり機と人間がバトってるワンシーンは動きが大きいので、30fpsで撮影して、データを同期FIFOで高速に送りたいのです・・・