「Bit-Bangモードを使うための条件と準備」の誤りを訂正。バージョン表記の統一。新規作成はじめに誰でも手軽にUSBデバイスを作ることができるFTDI社のFT8U232/245AMですが、最近は次バージョンにあたるFT8U232/245BMが入手できるようになってきました。AMからBMになって、いくつかの改良と新機能が追加されていますが、その中にBit-Bangモードという何やら気になる機能があります。このBit-Bangモード、残念ながら使い方に関する資料が皆無なのです。このページでは、私が試行錯誤で調べたBit-Bangモードの使い方について解説しています。BMシリーズの特徴まずは簡単に、BMシリーズの特徴で主なものを解説します。Bit-Bangモードのサポート今回解説する機能です。外付け部品点数が減少AMシリーズと比べて、動作に必要な外付け部品が減少しました。リセット回路が不要になったのはありがたいところです。EEPROM、数個の抵抗とコンデンサのみで構成することができます。(→FT8U245BM基板回路図)別電圧I/Oに対応AMシリーズでは、外部との信号レベルは5V単一でしたが、BMシリーズではI/O端子の電圧を決定するVCCIO端子が追加されたことにより、任意の電圧を使うことが出来るようになりました。Bit-Bangモードとは?Bit-Bangモードとは、FT8U232/245BMのデータ端子を8bitの双方向I/Oポートとして使う事が出来るモードのことです。このモードの有効・無効の切り替え及び入出力の設定は、専用のAPIであるFT_SetBitModeにて行います。Bit-Bangモードが有効になっている間、FT_SetBaudRateにてあらかじめ設定された周期に従い、データ端子からの入出力が行われます。この機能を利用して、汎用のI/Oポートとして使ったり、FPGAのコンフィグレーションを行うことが出来ます。困ったことに、ハードを組んですぐ使える!と言うわけではありません。事前の準備が必要です。Bit-Bangモードを使えるのはダイレクトドライバのみFTDIから提供されるドライバには、「ダイレクトドライバ」と「仮想COMポートドライバ」の2種類がありますが、仮想COMポートドライバを使っている場合はBit-Bangモードは使えません。Bit-Bangモードに移行するためには、ダイレクトドライバの提供するAPIを呼ばなければなりません、そのため必然的にダイレクトドライバが必要となるのです。シリアライザを使ってBMシリーズの機能を有効にするこれは、ハマりどころです。初期状態のFT8U232/245BMは、そのままではAMシリーズまでの機能しか使えません。ユーザが手動でBMシリーズの機能を有効にさせる必要があります。BMシリーズの機能を有効にするには、FTDIの提供するユーティリティソフト(シリアライザ)を使う方法と、ダイレクトドライバAPIを使い、外付けEEPROMの設定を変更する方法の2種類があります。実は、やっていることは同じで、それをユーザ側がAPIを呼んでEEPROMを書き換えるか、ユーティリティソフトを使って書き換えるかの違いでしかありません。下図は、シリアライザ(FTD2XXST.EXE)を使ってBMシリーズの機能を有効にしているところです。シリアライザは、FTDIのサイトからダウンロード出来ます。現在公開されているダイレクトドライバ(1.05.04)では、外付けEEPROM無し、すなわち設定する事無くBit-Bangモードを使えました。古いドライバ(1.04.01)では外付けEEPROMが必要です。訂正)外付けEEPROMが必須AMシリーズまでは、外付けのEEPROM無しでも使用出来ましたが、BMシリーズの機能を使うには外付けEEPROMが必要です。EEPROMが無い場合は、AMシリーズまでの機能しか使うことが出来ません。上記「シリアライザを使ってBMシリーズの機能を有効にする」を参照して下さい。(初期化編)まずは、初期化部分についての解説です。FT_Openでデバイスをオープンまずはオープンから。これはBit-Bangでなくても同じです。FT_SetBaudRateで入出力間隔を設定Bit-Bangが有効になっている間は、FT_SetBaudRateで設定した時間間隔で入出力が行われます。9600と指定したら1/9600=104us周期で入出力が行われるのではなく、指定値×16となります。9600と指定した場合、1/(9600×16)=6.51us周期となります。実際に測ったところ、指定値×4付近をふらついています。標準外の周期を指定したい場合は、FT_SetDiviserを使います。FT_SetBitModeでBit-Bangモードを有効にするFT_SetBitModeにて、Bit-Bangモードの有効・無効、どのビットを入力にするか、出力にするかを設定します。第2引数が入出力設定(該当するビットが0なら入力、1なら出力)、第3引数がBit-Bangモードの有効(=1)・無効(=0)設定です。Bit-Bangモードが有効になると、FT8U232/245BM問わず、入力設定の端子はハイ・インピーダンス、出力設定の端子は直前のFT_Write出力値(電源投入時は0x00)になります。FT_SetBaudRateにて設定された周期で入出力端子がサンプリングされ、端子状態が受信バッファに逐次格納、送信バッファのデータが入出力端子より逐次出力されます。送信バッファが空の場合は、直前の送信データが出力され続けます。(読み書き編)実際に読み書きする部分の解説です。ここはFT_GetBitModeを使う箇所以外は、従来のAMシリーズでのデータ送受信方法と同様です。出力はFT_Writeで出力設定された端子にデータを出力するには、FT_Writeを使って送信バッファに出力データを設定します。送信バッファに蓄えられたデータは、FT_SetBaudRateにより設定された周期で出力設定された端子より出力されます。入出力端子の"その時点で"の状態取得はFT_GetBitModeでFT_GetBitModeを使うと、入出力端子のその時点での状態を取得することが出来ます。それなりの時間が掛かるので、端子状態のポーリング等には不向きです。実測値では、1回のAPI呼び出しにつき約4ms掛かりました。連続した入出力端子の状態取得はFT_Readで入出力端子の状態取得を連続して行う場合は、FT_Readを使い、受信バッファから一括してデータを取得します。受信バッファを溢れさせないために、受信データの取得は別スレッドにした方が良いでしょう。実例1:汎用I/Oポートとして使う最も簡単な例として、スイッチの入力をそのままLEDへ出力する例を示します。FT8U245BMのデータ端子にスイッチとLEDを付けただけの簡単な回路です。FT8U245BM基板と接続するのは、右側の回路図のとおり、D0〜D7、GND、プルアップ用のVCC(+5V)のみです。基板から他の信号線も出ていますが、接続する必要はありません。FT8U245BM基板の部分は、アプリケーションノートの基本回路を基に汎用で使えるようにしたものです。具体的にはこのような回路になります。(→FT8U245BM基板回路図)写真の方が部品が多かったり、上位下位が逆だったりしますが、とりあえず気にしないで下さい。104KBytes)ソースリストは最低限必要な部分だけ書いています。実際はこれにエラー処理等が入ります。&dwWritten);}実例2:AVRマイコンプログラマATMEL社のワンチップマイコンであるAVRマイコンに、プログラムを書き込むためのライタを製作しました。AVRマイコンのISP端子(RESET,MISO,MOSI,SCK)を、FT8U245BMのデータ端子に過電流保護用抵抗を介して接続しているだけという単純な構造です。データの受信部にFT_Readを使い、高速に読み出すことで、他のAVRプログラマに比べ遜色ない読み書き速度が実現できました。このAVRプログラマは作成途中なので、完成次第別ページにて紹介します。実例3:LCD操作HD44780互換のキャラクタLCDモジュールを制御してみました。AVRマイコンプログラマと同じく、ほとんど配線のみで実装出来ます。Bit-Bangモードの変なクセ?ここでは、Bit-Bangモードを調べて気づいた点を説明しています。テストに使用したドライバのバージョンは、1.05.04です。ボーレート設定値は×16にならない?FTDIの提供する資料には、Bit-Bangモード時の転送速度はボーレート設定値×16と書かれていますが、実際に測定したところ×4くらいでした。98とXPにて、ボーレート設定値を600、1024バイトのデータをFT_Writeし実行が終わるまでに掛かった時間を集計したものです。XPも約4倍ですが、かなりふらつきがあることが分かります。2000でもほぼ同様の傾向となりました。2,769高速転送は無理?FT_SetBitModeで指定するボーレートを大きくすると、その分だけ高速にデータを転送できますが、受信データを取りこぼすとそれ以降のデータ受信が出来なくなる現象が発生しました。一度こうなってしまうと、FT8U側の電源を再投入しなければ復旧しません。XPの場合だと、設定値57,600(×4≒230,000bytes/s)位が限界でした。受信スレッドのプライオリティを上げれば多少改善されました。極端なはなし、下記のようなコードでもダメなのです。以下の状態は、デバイスの電源が入っているあいだ、直前に指定された値が保持されるようです。これらの状態は、ソフトウェアリセット(FT_ResetDevice)や、キューのクリア(FT_Purge)を行っても保持されます。(未確認ですが、電源再投入以外にハードウェアリセットでも初期化されるかもしれません)Bit-Bangモードの有効・無効設定(FT_SetBitModeで指定)FT_Writeにて直前に出力された値(電源投入時は0x00)他にも保持される値がありそうですが、まだ未確認です。有用なリンクFT8Uシリーズを活用する上で欠かせないリンク集です。DevicesFT8Uシリーズの製造元。各種データシート、ドライバ、ユーティリティはここで入手しましょう。アイ・ピイ・アイFT8U232/245BMはこちらで購入しました。発送も早くていい感じ、Webで注文すれば翌日or翌々日には届きます。ヒューマンデータUSBコーナーでは、FT8Uシリーズの導入から開発まで非常に丁寧に解説されているので、一読をおすすめします。「完成しているUSBモジュール基板が欲しい!」という人はUSB-004を買うといいかも。西日本常盤商行FT8UシリーズAPIリファレンスの邦訳版があります。FT8U232/245AMのモジュールが何気に安い!?[BACK]。