goo blog サービス終了のお知らせ 

-・-・ --・-  -・-・ --・-  -・-・ --・- 

不定期更新。電子工作オタクのメモなので、おもしろくないですよ。

FM3でUSBホストと仮想COMポートを動かす

2015-08-23 20:42:32 | smartSDR
久しぶりの投稿になってしまいました。

というのも、FM3のUSBホスト(CN7、標準Aソケット)とデバイス(CN6、mini-B)の両方を同時に動かすことができず、迷路に入っておりましたが、なんとかUSBメモリの読み出し、書き込みなどのファイル操作がUSBの仮想COMポートからできるようになりましたので、以下そのメモです。

CQ誌2012年7月号付録のDVDに入っている仮想COMポートのソースに、elm-chanさんの組み込み用printfモジュールを使うことで、デバッグがやりやすくなりました。
追加関数として、putc、gets関数を作成しました。
void init_xprint(void)
{
xdev_out(usb_cdc_putc);
xdev_in(usb_cdc_gets);
}

void usb_cdc_putc(unsigned char c)
{
*pUSB0_EP2DTH = c;
}

unsigned char usb_cdc_gets(void)
{
unsigned char c;

databuflen = USB0_EP1S_bit.bSIZE;
for (c=0; c<databuflen; c++) {
if (!(c & 1)) // ここはちょっとあやしい
databuf[c] = *pUSB0_EP1DTL;
else
databuf[c] = *pUSB0_EP1DTH;
}
return *databuf;
}

USB0F_Handlerはエコーバックしている部分をコメントアウトしました。
void USB0F_Handler(void)
{
// unsigned char c;
unsigned int dummy;
if (USB0_EP1S_bit.bDRQ) { // 何か到達した
// databuflen = USB0_EP1S_bit.bSIZE; // サイズを引き受けて
// for (c=0; c<databuflen; c++) {
// if (!(c & 1))
// databuf[c] = *pUSB0_EP1DTL;
// else databuf[c] = *pUSB0_EP1DTH;
// }
usb_cdc_gets();
USB0_EP1S_bit.bDRQ = 0;
dummy = USB0_EP1C;
}
if (USB0_EP2S_bit.bDRQ) {
// databuflen = StrLength(xfunc_out);
// if (databuflen) {
// for (c=0; c<databuflen; c++) {
// if (!(c & 1))
// *pUSB0_EP2DTL = databuf[c];
// else
// *pUSB0_EP2DTH = databuf[c];
// }
// databuflen = 0;
// xputc(0x42); // debug
// }
USB0_EP2S_bit.bDRQ = 0;
dummy = USB0_EP2C;
}
}

これで、仮想COMポートは動くようになりましたが、CQ誌のDVDのベンダ純正USBホストプログラムと同時に動かすことができず、CQ誌のコードを使うことを断念しました。

何か手掛かりはないかと、spansionのサイトを調べているうちに<a href="http://www.spansion.com/Products/microcontrollers/Pages/tool-detail-spansion_usb_wizard.aspx">SPANSION USB WIZARDというツールがあることがわかり、結果的にこのツールが吐いたコードを使うことで、USBホストと仮想COMポートの両方を同時に動かすことができました。

このUSB WIZARDには、CQ FM3のボードに指定もあり、CPUの種類、タイプなどもコードに反映してくれます。また、ファイルシステムとして、elm-chanさんのFatFsも簡単にインプリメントしてくれます。
ただ、最初はSpansion CMSIS / L3 – Low Level Libraryを使ったコードにしていましたが、なぜか動きませんでした。L3をあきらめて、使わないコードにしたところ、無事USBメモリのアクセスLEDが点滅、ホットしました。

さらに、Fujitsu Microelectronics Europeが公開している
F²MC-16LX FAMILY 16-BIT MICROCONTROLLER MB96330のアプリケーションノートのmenu.cを参考にして、メニュー形式でUSBメモリのフォルダ操作、ファイルの読み書きができるようになりました。


ここまで、FM3をいじってきましたが、smartSDRのコントローラとしてラズベリー・パイのようなCPUボードの方が楽なのかなとも思えてきました。

Eclipseで以下のようなエラーが出たときの対処のメモ(正解かどうかはわかりませんが、GDBもちゃんと使えます)


FM3を動かす

2015-04-18 12:12:11 | smartSDR
CQ社のフルデジタル無線機TRX-305ではSH-2を使って、TRX-305全体の制御やFPGAのコンフィギュレーションとDSPのコードをロードしています。
SmartSDRでも制御用に、以前Interface誌の付録についていたSH-2を使おうかなとも考えましたが、TRX-305のソースコードは公開されないだろうなと思い、フラッシュROM容量の大きい(1Mbyte)I誌2012年6月号付録のFM3(MB9BF618T)を使ってみることにしました。

まずは、開発環境の構築からです。
I誌付録のDVDに入っている環境は使用期限とか開発サイズに制限があるので、対象から外し、制限のないフリーの開発ツールを使うことにしました。

次に開発環境とするベースのOSの選択です。
以前、Windowsのeclipse環境でクロスコンパイルをした際、それより前に使っていたLinux環境に比べて使いにくい記憶がありましたので、今回はLinux環境にしたいところでしたが、移動先でもいじるためには、この非力なノートPC(i3)に入れる選択肢しかなく、さらに今インストールしているVirtualBox上で動かすには重いことがわかっているので、しかたなくWindows環境にすることにしました。

eclipseは以前入れていたHeliosを削除して、最新版のLunaの日本語版を使いました。
Arm系のクロス開発ツールはいくつかあるようですが、GNU Tools for ARM Embedded Processorsから最新バージョンをインストールしました。

FM3も富士通からSpansion社に譲渡されたようですが、ARM系のプロセッサですから、しばらくは入手の問題はないでしょうと勝手に想像しています。
しかし、さすがに3年も立つと、FM3に関する新しい書き込みは少ないようですが、ねむいさんのぶろぐからLEDチカのソースとOpenOCDのコンフィグファイルをいただきました。(感謝です)
ただ、makefileはLinux版(Cygwin)なので、Windows用に書き換える必要があり、エラーを確認しながらの作業となってしまい、けっこう時間がかかりました。(最初からMakefileの勉強をしろってか)
I誌に載っているFLASH USB DIRECT Programmerで書き込むと、Lチカ、長かった。

次はOpenOCDとJTAGアダプターの接続です。
JTAGアダプターはBlackfinの時に使っていたHJ-LINK/USBです。このアダプターは販売中止となっていますが、後継機は値段が同じで、FPGAの書き込みはできなくなっているようです。
このOpenOCDとJTAGアダプターの接続には、大変な時間を費やしてしまいました。
OpenOCDのバイナリーの0.4から0.8までのバージョンとさらに、いろんな方が作成して公開されている勝手バージョンとUSBドライバのlibusb、ftd2xxの組み合わせを試して、やっと0.8とftd2xxの組み合わせでFM3とJTAGアダプターの通信ができるようになりました。

最後にeclipse上でのデバッグ環境構築です。
Windowsのコマンドプロンプト上では、JTAGアダプター経由でFlashROM書き込みとGDBの動作は確認できていましたが、eclipseでの設定にけっこう手間取りました。
FM3をhalt状態にする方法は、Todotaniのはやり物Logプログが大変参考になりました。

ということで、時間はかかりましたが、FM3の開発環境が整いました。
無事デバッグ画面が出ました
FM3とHJ-LINK/USB

FusionPCBから基板が届く

2014-03-29 15:32:40 | smartSDR
20日かかって、基板が届いた。
シルクの文字のかすれ、ずれがあるものの試作基板としては十分のようだ。
電源コネクタのピンも、長穴がちゃんと開いている。
品質で比較すると、OLIMEX < FusionPCB < P板 かな(あくまで個人の感想)。
コストは、間違いなく P板 << OLIMEX < FusionPCB。 早い便を使ってもFusionPCBは安い。

届いた基板


FusionPCBへ発注

2014-03-09 08:10:42 | smartSDR
前回から、次の2点を修正した。
1.LTC2208からの出力タイプをCMOSからLVDSに変更
LTC2208からFPGAまで、数センチ以上は離れているため、信号の伝送方式をノイズに強いLVDSに変更した。
配線長にバラツキはあるが、FPGAとしては低速なので、大丈夫とは思うが、、。
LTC2208から固定パターンを出力するモードがあれば、エラーの確認が楽なのだが、どうもなさそうだ。

2.クロックを同軸で接続
クロック信号(122.88MHz、10MHz)もLVDSにしようと考えたが、SP601には外部クロック入力にSMAコネクタが付いているので、同軸で供給することにした。

OLIMEXに発注しようとDRCをかけながらパターンの調整をしていたが、あまりにも修正点が多く、少々割高でも別のところに頼む気になった。
以前から気になっていたFusionPCBの情報収集をすると、配線の制約も最小線/via/pad 間隔 : 6milとかなり柔軟に描ける。大事な金額もかなり安い。
ということで、FusionPCBのデザインルールでDRCをかけると、シルクを除き、一発OKとなった。

シルクの文字サイズを小さくしたり、位置を修正しても、コンデンサの+表示など、いくつかはエラーが出たままだが、そのままFusionPCBへ発注した。
FusionPCBは、Seeed Studio BazaarというWebショップの中のメニューのひとつのようだ。
ユーザ登録などをして、ファイルをアップロードし、クレジット支払いをすると、自動受付完了のメールがきたが、基板5枚で送料込みTotal: $30.75とOLIMEXに比べると3分の1位の安さである。
支払いはクレジットで便利なのだが、常に大丈夫かなと心配がつきまとう。


修正したパターン図


SDR front-endのパターン図ができた

2014-02-18 22:47:16 | smartSDR
なかなか集中してSmartSDRに取り組めないが、やっとfront-endのパターンができた。
パーツも秋月とチップワンに発注したが、扱っていないものがあったので、別の通販を探しても入手できないものがあれば、回路図を変更する必要があるかもしれない。
回路図としては、LTC6400-20、LTC2208の標準的な組み合わせであるが、感度不足の場合を考慮して、プリアンプをジャンパで切り替えて入れることができるにした。LTC2208からの出力パターンを極力短くするために、コネクタの収容を変更した方が良さそうだ。
手直しを終えたら、久しぶりにOlimexに注文しよう。

front-endのパターン