USB-Blasterもどきの製作 e-ub
==更新履歴== 2009/03/12 Ver.0.2公開(初版) 2009/06/12 ソースコード更新(プログラム変更なし) 2009/06/18 回路図修正 2009/06/20 (有)ヒューマンデータさまに紹介していただきました 2009/07/20 Ver.0.4公開 高速化及び安定化(バッファオーバラン防止) 2009/08/07 Ver.0.5公開、DDT#1付録LaticceXP2-5E書き込みソフト公開 2009/10/16 XP2Write Ver.0.54に更新 2010/12/12 Ver.0.6公開、Windows7でHUB経由時動作しない問題を解決 2011/03/01 Ver.0.7公開、より安価なPIC18F14k50に移植 2012/11/03 XP2Write Ver.0.60に更新 |
Ver.0.4標準回路製作例(クリックで拡大) |
Ver.0.7応用製作例(クリックで拡大) |
品名 | 購入店 | 価格 |
USB搭載マイコン PIC18F14k50 | 秋月電子 | \200 |
セラロック 12MHz | 秋月電子 | \20 |
ピンヘッダ 2x5(2x25を割る) | 秋月電子 | \10 (5台分50円) |
カーボン抵抗1/6W型 100Ω x9 | 秋月電子 | \9 (100本100円) |
カーボン抵抗1/6W型 200Ω x5 | 秋月電子 | \5 (100本100円) |
カーボン抵抗1/6W型 1kΩ x1 | 秋月電子 | \1 (100本100円) |
カーボン抵抗1/6W型 10kΩ x1 | 秋月電子 | \1 (100本100円) |
チップ積層セラミックコンデンサ 1uF | 秋月電子 | \2 (100個200円) |
チップ積層セラミックコンデンサ 0.1uF x2 | 秋月電子 | \0.9 (4000個1800円) |
基板 適当 (価格は秋月C基板) | --- | \60 |
USBコネクタ | 秋月電子 | \50 |
お好みのLED | ---- | ---- |
※2011/03/01公開:Ver.0.7では使用するPICが変更になっています。高速化のためピン配置は固定です。
信号電圧変換が下りは分圧、上りは直結というところがチープでいいですね。
出力電圧はこの定数で約2.8Vとなりました。ターゲットの耐圧に注意。
PICはTTL入力なので2.5V CMOSレベル以上なら判別可能です。
入力ポートの100Ωは所謂ダンピング抵抗というやつです。保護も兼ねていますが。
※ライセンスについて
基本的に自由に使っていただいてかまいませんが、応用したものを公開される場合、可能であれば当サイトにリンク等していただけると幸いです。
・接続例
Ver.0.2接続例(クリックで拡大) |
Ver.0.7接続例(クリックで拡大) |
・処理速度
計測環境はWindows XP SP3、ICH7、Core2Duo 800MHz動作でUSB2.0HUBを経由しています。
→PC買い替えに付き、Windows7 SP1、QM57、Core i7 1.3GHz動作、USB2.0HUB経由に変更になりました。
直接USBポートに接続すると若干遅くなります。これは純正品でも同様のようです。
Altera MAXII EPM570T100C5N | もどきVer0.2 | Ver0.4(PIO) | Ver0.4(SPI) | Ver0.7 | USB-Blaster |
---|---|---|---|---|---|
Erase->Blank-check | 4.5秒 | 3.2秒 | 3.1秒 | 2.8秒 | 2.9秒 |
Examine | 3.1秒 | 1.7秒 | 1.7秒 | 1.3秒 | 1.3秒 |
Erase->Write->Verify | 10秒 | 7.5秒 | 7.1秒 | 6.5秒 | 7.5秒 |
IDCODE Test 9999回 | 未測定 | 未測定 | 7.6秒 | 7.0秒 | 20秒 |
Altera Cyclone III EP3C10E144C8N | もどきVer0.6 | もどきVer0.7 | USB-Blaster |
---|---|---|---|
JIC Erase->BlankCheck | 14.0秒 | 14.2秒 | 11.5秒 |
JIC Program->Verify | 28.4秒 | 24.3秒 | 16.1秒 |
SRAM Config | 1.3秒 | 1.4秒 | 1.0秒 |
IDCODE Test 9999回 | 7.6秒 | 7.5秒 | 20.6秒 |
・Cyclone FPGAで使っている方からの報告
Altera Cyclone EP1C12Q240C6N | もどきVer0.2 | Ver0.4(SPI) | USB-Blaster |
---|---|---|---|
AS直接ConfigROM書き込み | 20秒 | 15秒 | 15秒 |
・(有)ヒューマンデータさまからの報告
Altera Cyclone III | もどきVer0.2 | USB-Blaster |
---|---|---|
SRAM書き込み | 6秒 | 1秒 |
JTAG経由ConfigROM書き込み | 75秒 | 24秒 |
AS直接ConfigROM書き込み | 20秒 | 15秒 |
・極力、関数の使用を避ける
関数呼び出しは引数をスタックに積んで、引き出すといった作業が伴うので非常に高コストです。
C18にはインライン関数がないようなのでマクロ関数を使って実装しました。
幸いにも18F2550はROMが大量にあるので、インライン展開してもまったく困りません。
//マクロ関数の定義の例 //複数行にわたる場合は行末にバックスラッシュを置く //注意:マクロ関数中にはコメントが書けない //返り値は持てないので、変数を渡して値を受け取るようにする #define sum(ans,p1,p2) {\ ans=p1+p2;\ } |
・高速でアクセスしたい変数はACCESS領域に配置する
通常の変数のアクセスにはバンク切り替えが必要で、これが速度低下をもたらしています。
ACCESS領域はレジスタ同様、バンク切り替えが必要ない領域なので、ここに変数を置くと高速になります。
ただしACCESS領域は96バイトしかないので、バッファや大きなテーブル等は置けません。
//ACCESS領域にBYTE(unsigned char)型変数tmpを宣言する #pragma udata access accessram near BYTE tmp; //以降の変数を通常の領域に配置するように戻す #pragma udata |
・繰り返しはfor文ではなくdo-while文を使う
//一般的な繰り返し文 for(i=0; i<10; i++){ /* functions */ } | //オーバーヘッドの少ない繰り返し文 i=10; do{ /* functions */ }while(--i); |
・SPIモジュールの利用
当初からSPIモジュールに目はつけていたのですが、JTAGはLSBファーストでビットオーダーが逆なのでそのままでは使えません。
ビットを逆に並び替える(ビットリバーサルと呼ぶらしいです)操作は、単純にプログラムで行うと16命令サイクル必要です。
本プログラムでは、パワーオン時にRAM上に256通りのビット並び替えテーブルを作成し、プログラム中で呼び出すことで8命令サイクルでビット並び替えを済ませます。
ちなみにROM上のテーブルだと10命令サイクルかかりました。RAMが少ないPICに実装する際はROM上でも良いでしょう。
また、SPIモジュールを使うと、送受信中に他事が出来るので、その隙に次のデータのプリフェッチを行うことで時間短縮しています。
SPIモジュールをENABLEにする時、クロックラインにグリッチが出て1bitずれてしまうので、TRISレジスタを操作してマスクしています。
//MSSPをONにする際のクロック漏れを防ぐ TRISBbits.TRISB1=1; SSPCON1bits.SSPEN=1; TRISBbits.TRISB1=0; |
PIC18F2550 | PIC14k50 | |||
---|---|---|---|---|
Hardware | Used | Hardware | Used | |
RAM (USB以外) | 1024 | 737 | 512 | 417 |
USB通信用RAM | 1024 | 587 | 256 | 256 |
・Windows7のタスクバーの新機能に対応(XP2Write Ver.0.52以降)
|
|
緑色のバーで進捗、赤のバーでエラーを表示 | サムネイルボタンから操作可能 |
・非公式・代替ドライバの使用(XP2Write Ver.0.53以降)
USB-Blasterの純正ドライバは、Alteraの開発環境QuartuusIIをインストールしなければ使えません。
LatticeXP2を使いたいだけなのにAlteraの開発環境をインストールするのは億劫だと思います。ライセンスの問題もあると思います。
Ver.0.53から、PICのUSB開発ツールのドライバをカスタマイズしたものを同梱し、XP2Writeで使用できるようにしました。
Lattice XP2のみで使用する場合は、純正ドライバは不要となりました。
もちろんこの非公式ドライバを適用した場合は、QuartusIIからは認識されません。
XP2Writeでは、非公式・代替ドライバを使用しているUSB-Blaster→純正ドライバを使用しているUSB-Blasterの順に探します。
そのため、純正ドライバを当てたUSB-BlasterをAltera用に、非公式ドライバを当てたUSB-BlasterをLattice用に、と使い分けることが可能です。
純正ドライバと非公式ドライバで、速度差はありませんでした。
・処理時間
計測環境はWindows XP SP3、ICH7、Core2Duo 800MHz動作でUSB2.0HUBを経由しています。
Lattice LFXP2-5E | もどきVer0.5(SPI) | Ver0.5(PIO) | USB-Blaster |
---|---|---|---|
Erase only | 1.7秒 | 1.7秒 | 1.9秒 |
Program(Erace,Write,Verify) | 5.7秒 | 7.8秒 | 11.4秒 |
・ソースコードについて
基本的には自由にお使いいただいてかまいませんが、商用利用は禁止させていただきます。
利用された場合は、リンクや事後報告をしていただけるとうれしいです。
USB-Blasterを使ったJTAG通信部分のみ別ファイル(jtag.cpp / jtag.h)に分けてあります。
自作ソフトからUBS-BlasterをJTAGインタフェースとして利用するためのライブラリとして使うことが可能です。
コードを差し替えることで、違うJTAGインターフェースを利用してLFXP2-5Eに書き込むことも可能です。
・PIC18F2550用プログラム
USB-Blasterもどき ソース・HEX一式(Ver.0.2.090312)
※2009/06/11追記:ヘッダファイルが抜けていましたので直したアーカイブに差し替えました。
※2009/06/12追記:Firmware2.4でコンパイルが通らないので2.1を同梱しました。
USB-Blasterもどき ソース・HEX一式(Ver.0.4.090720)
前バージョン比:高速化、安定化
USB-Blasterもどき ソース・HEX一式(Ver.0.5.090806)
前バージョン比:IOタイミングの微調整、MCHPFSUSBブートローダとHIDブートローダを使った書き込みに対応
USB-Blasterもどき ソース・HEX一式(Ver.0.6.101212)
前バージョン比:MCHPFSUSB2.5使用。Windows7でHUB経由時に動作しない問題を解決。
・Lattice XP2書き込みソフトウェア「XP2Write」
※Ver.0.51以前では環境によってはVisualC++2005再頒布可能ランタイムパッケージのインストールが必要になる場合があります。
XP2Write ソース・バイナリ一式(Ver.0.50.090807)
この版ではSED_CRCの書き込みを省いていますが、問題なく動作するようです。
XP2Write ソース・バイナリ一式(Ver.0.51.090808)
SED_CRCの書き込みを行うようにしました。
XP2Write ソース・バイナリ一式(Ver.0.52.090810)
Win7のタスクバー拡張に対応、コマンドライン対応、ランタイムをスタティックリンクにしました。
XP2Write ソース・バイナリ一式(Ver.0.53.090813)
USB-Blaster純正ドライバなしでも使えるように非公式・代替ドライバのサポートを追加。
XP2Write ソース・バイナリ一式(Ver.0.54.091016)
書き込み後にロジックが動作するように修正。ウィンドウへのドラッグに対応。