USB接続型フラッシュメモリーライター


 この機械の作成目的としては大きく2つあります。まず一つ目が、USBというインターフェイスの理解と、実際のシステム(ハードウェア、およびファームウェア、WindowsのWDMタイプのデバイスドライバ)の試作によるノウハウの取得。もう一つが、今後の開発でROMプログラマとして使えるものを作ろう、というのがあります。

1.設計仕様

 書き込みターゲットとしてはNOR型のフラッシュメモリ(AMD系のライトシーケンス互換)です。対応デバイスは4Mビット〜32Mビット単一電源書き込み動作、3.3V/5.0Vデバイス対応、バス幅8ビット、および16ビットのものとしますが、書き込みはすべて8ビットで行うものとします。また、対象デバイスの電圧切り替えはダイナミックに行わず、システム全体の電圧を直接切り替えることにしました(^^;<回路規模が大きくなるので。途中まで回路は考えたのですが・・・。まぁ、頻繁に切り替えるわけでもありませんしね。

2.使用したLSI

 今回使用した主要部分のLSIは以下の通り。USBコントローラが入手難なのですが、ちょっとした関係でもらってしまいました(^^;

 ●USBコントローラ  沖電気  MSM60851B(Bバージョンは虫ありらしいのでなるべくCにしましょう(^^;

  このコントローラはマイコンとの接続が大変簡単なUSBコントローラです。なんかMSJにもこれを使ったボードが紹介されているみたいですね(^^; で、主な特徴は以下の通り。

  1. USB1.0準拠
  2. USBバストランシーバ内蔵
  3. フルスピード(12Mbps)に対応
  4. コントロール転送、バルク転送、インタラプト転送に対応
  5. エンドポイント4本。各FIFOメモリ有り。EP0=8バイト、EP1=64バイト、EP2=64バイト、EP3=8バイト。
  6. DMA対応
  7. I/O電源のみ3V〜5.5Vまで変更可能。

 今回は書き込み電圧を直接全体のシステムを切り替えているため、I/O電圧の幅が広いところは都合がよいです。DMAに対応はしていますが、今回はAT90S4414というハーバードアーキテクチュアの8ビットRISC CPUを使用するため、ちょっとDMAを使うにはいろいろと面倒なのと、入れてもその際に必要なバスの調停動作などによりあまり性能が上がりそうにないので止めました(^^;

 あと、このコントローラは実際には沖電気としてはバスパワーで使うことが推奨されていない(保証されていない)という話を聞いているので、注意したほうがよいかもしれません。自分が使っている分には特に問題はおきてませんが(^^;

 ●コントロールCPU  ATMEL  AT90S4414−8PC

 このCPUは1チップのハーバードアーキテクチュアの8ビットRISCマイコンで、ATMEL社ではAVRマイコンという名称で販売しています。基本的には、有名なPICと似た部類のものです。しかし、PICマイコンに比べ、実行速度が遙かに高速、かつ命令体系がPICに比べて非常にシンプルである(68系に近い感じ)という特徴を持ちます。今回は、このAVRマイコンの中でも外部SRAMインターフェイス機能を持つAT90S4414/AT90S8815を選び、取り敢えず内部プログラム用フラッシュROMが4Kバイト、内蔵SRAMが256バイトの4414を選択しました。4Kバイトは8086系しか使ったことのない方には少なく見えますが、実際にはAVRマイコンでは1命令がほとんど全て1ワード(2バイト)で構成されますので、2000命令程度は書けます。また、SRAMモードを使用することで、USBコントローラを簡単にアクセスすることができます。なお、内蔵フラッシュROMにはISP(In-System-Programming)が可能ですので(右の写真のようにプローブを接続してプログラムします)、適切に回路を設計しておけば、マイコンを基板に実装したまま、ファームウェアの開発が可能です。この部分についてはChaNさんのISP回路と書き込みプログラムを利用させていただきました。
 このAT90S4414-8は4〜6Vで8MHz動作ですが、今回は3.3Vでも動作させますので、中間をとって6.14Mhzで動作させることにしてます。

3.ハードウェア構成と作成

 回路図についてはこれをみてください。構成としては比較的簡単です。AT90S4414(以下AVRと略します)はSRAMモードで動作でさせるためPA0〜PA7はアドレスA0〜A7とDB0〜DB7のマルチプレクスですので、USBコントローラとは直結し、USBコントローラのADSEL端子をHにプルアップしておき、そのCSはA15(PC7)を使い反転をかけていれます(A8〜15はアクセス中の全ステートできちんと反映されます)。

 フラッシュROMにアクセスするには、このままではアドレス線が少なすぎますので、74HC374をアドレスラッチに使用します。ラッチ用のクロックはAVRのALEを使い、選択はアドレスA9,A10,A11を使います。こうすることで、一度に複数のラッチに同一データをラッチできますので、フラッシュメモリにコマンドを発行するのが簡単になります(フラッシュメモリは アドレス AAAA データ55、アドレス5555データAAなどというコマンドパターンとなっている)。

 あとはデバッグようにLCDを付けています。これは一般的な日立のHD44780というLCDCを使ったLCDモジュールを付けています。実際に作成するときにはコネクタのVccとVssの位置が逆だったり、全体の接続が逆というのもありますので、そこは注意してください。

主要部品表
種類 メーカー 型番
USBコントローラ 沖電気 MSM60851
CPU ATMEL AT90S4414
CMOS汎用 各社 74HC374
CMOS汎用 各社 74HC04
CMOS汎用 各社 74HC125
CMOS汎用 各社 74HC32
CMOS汎用 各社 74HC541
CMOS汎用 各社 74HC00
CMOS汎用 各社 4066
レギュレータ(3.3V・150mA) TOREX XC62AP3302
トランジスタ ローム DTC124
トランジスタ ローム DTA114
トランジスタ 東芝 2SA1015-Y
ダイオード 東芝 1S1588
ツェナーダイオード NEC NNCD5.6LG
セラミック発振子 ムラタ CSTCW4800CW
セラミック発振子 ムラタ CST6.14MT

 実際の作成では、とにかくバス線が多いのでその結線がたいへんです(^^; ビニール線ではつらいので、フッ素被膜線などのお手軽に使えるものを使った方がよいでしょう(^^; まぁ、USB部分しか作らない場合には必要はありませんが。
 上記の部品では、レギュレータはTOREXのものを使っていますが、他のメーカーのものでも構いません。USBのバスパワーは5Vですので、特に問題は出ないはずです。ただし、なるべくある程度電流がとれてロスの小さいものにしましょう(最低100mAは取れること)。サスペンドをサポートする場合には、サスペンド時に500μA以下が要求されますので、レギュレータの消費電流は10μA以下に抑えたいところです。
 ツェナーダイオードでは、NECのNNCD5.6LGを使っていますが、これは静電気破壊防止用ですので、寄生容量が小さければどこのものでも構いません(USBのデータ線には大きな容量を挿入してはいけませんので注意してください)。セラミック振動子ではUSBコントローラに繋いでいるCSTCW4800が特殊で普通は手に入りません(^^; MSM60851の発振回路はたいへんデリケートで、使用の際にはきちんと特性を合わせる必要があります。そのため、OSCからXINにクロックを入れてしまう方が楽かもしれません(^^;
 あとはトランジスタですが、デジタルトランジスタでロームのDTC系やDTA系を使っていますが、別に東芝のRN系を使ってもおっけーです。

4.ソフトウェアの設計

 今回作成するのは3つあって、1つがATMEL側のファームウェアです。これで、パソコンから指令された処理を実行します。基本的には以下のようになります。エンドポイントとはUSBでは転送経路の名称にあたり、今回の機器では以下のように使用するように定義しました。

 コントロール転送 : エンドポイント0 = コマンド発行、および現在処理中のもののステータス取得

 バルク転送: エンドポイント1 = 書き込みデータの転送(PC→マイコン)

          エンドポイント2 = 読み込みデータの転送(マイコン→PC)

 USBではコントロール転送は、セットアップ−データ−ステータスの3つのステートに分かれており、少ないデータの送受信を行うことができます。これにより一般的にはターゲットとなる機器の制御を行うことになります。バルク転送は、データをひたすら送受信するものです。バルク転送では、送受信は半二重ですので、きちんと設定をセットアップする際にPC側とすりあわせする必要があります。このような設定の他に、実際に機器がどの程度の電流を使うかなどをPCに知らせるものがあり、これをデバイスデスクリプタといいます。

 コントロール転送よりデバイスデスクリプタの要求があると、機器側では自分のデスクリプタを返します。このときにデスクリプタにはベンダIDとプロダクトIDを入れます。このIDにより、どの機器が接続されたかをPC側が認識し、そのIDでデバイスドライバの組み込みを実行します。もし、すでにドライバがあればそれをロードし、なければインストールを要求することになります。右の写真は、はじめてデバイスを差したときに出るものです。一回ドライバをインストールすれば、このようなメッセージを出すことなしに静かにドライバがenableされます。

 デバイスデスクリプタを送信すると、次にPC側はその機器のアドレス(SCSIでいうSCSI-IDに当たるもの)を設定し、PC側はコンフィグレーションデスクリプタを要求します。ここで各エンドポイントの送信方向、受信方向、使用・不使用を設定します。これを設定すればセットアップ完了です。あとは、指定されたコマンドを機器側が実行するだけです。

 さて、詳細は実際のマイコンのファームウェアを読んでいただくとして、次は機器を動かす為のWDMドライバです。WDMドライバを作るには、MicrosoftからWin98DDKをダウンロードする必要がありますので、まずはそれを行って下さい(あと、コンパイルにVC++が必要です)。

 しかし、これを1から作るのは結構しんどいのです。が、幸いなことにWin98DDKの中に豊富なサンプルがあり、今回作るようなものはそのサンプルをちょっと変更するだけで作ることができます(EULAライセンスに従えば、流用は特に問題ありません)。変更部分としては、IOCTLリクエストを解釈する部分と、作成するデバイスドライバのGUIDの値です。GUIDはGENGUID.EXEで作ってincludeファイルを書き直すだけです(^^; これはサンプルを読めばすぐにわかるでしょう。なお、このプログラムで参考にしたのはBULKUSBというものです。これはDelphi側でも参考にしていますので、これと照らし合わせてみて下さい。一応WDMのドライバのソースコードは自分が理解するためにコメントをすべて日本語に翻訳していますので、その点でも役にたつと思います。

 最後に実際に書き込みを行うソフトです。こちらはDelphiで書きました。ただし、DelphiにはUSBの制御に必要なAPI定義がまるごと抜けてしまっているため(SetuDi*系のもの)全部定義しなおします(^^; 実際に機器を制御するには製作し組み込んだデバイスドライバに対してDeviceIOControl APIを使用し、IOCTLで制御します。データのフラッシュメモリへの書き込み、読み込みには、CreateFileでパイプを作り、ReadFile,WriteFileを使ってデータの転送を行います。

 プログラムアーカイブ(ファームウェア、デバイスドライバ、Delphi用ソースコードセット)

5.実際の能力

 実際の書き込み能力です。基本的には純粋な書き込み時間を考えると300Kバイト/秒程度の能力があるようです(右写真:書き込み中の写真)

 書き込み対象フラッシュメモリ
 富士通MBM29DL324B(32Mビット 3.3V単一電源)  1分2秒(ブランク−プログラム−チェックサム)

 これでチップイレースすると+1分30秒ぐらいかかるので、、消すよりも書き込みの方が遙かに早いことがわかります。実は会社に富士通謹製のパラレル接続のライターがあるのですが、これが死ぬほど遅くて、1時間とかそういうレベルになってしまうのです(^^;それと比べると遙かによいかなと思います。あと、大きいのが電源。電源レスなのは大きいです。USBバスパワードですので、USBケーブルをつなげるだけで使えるのはよいですね。

 上: 書き込みプログラムのウィンドウ

6.製作を終えて。

 また、ATMELのフラッシュメモリに対応していないので、完全にできてはいないのですが作った感想としては、USBはそう難しいものではないということでしょうか。特に今回使用したMSM60851では特にそうで、ほとんどのUSBの面倒なプロトコルは考慮しなくてもよいので(無論、基本的な部分は実装しなきゃいけませんが)自作で作るにも楽なものです。ただ、ある程度Windowsアプリケーションも書けなければいけないので、そっち方面の知識も持っていることは前提となりますが(^^; しかしながら、この石は個人で手に入れるのが難しいものですので、秋月などで扱ってくれるとUSBも身近になるんじゃないかとは思います。




もくじに戻る