[BACK]

Bit-Bangモードの使い方

2003.09.09 「Bit-Bangモードを使うための条件と準備」の誤りを訂正。バージョン表記の統一。
2003.07.08 「実例3:LCD操作」を追加
2003.05.08 「実例1:汎用I/Oポートとして使う」に、ダウンロード可能なソース一式を追加
2003.05.06 文章を若干修正
2003.05.03 文章を若干修正
2003.04.30 新規作成


はじめに

FT8U245BM

誰でも手軽に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モードを使うための条件と準備

困ったことに、ハードを組んですぐ使える!と言うわけではありません。事前の準備が必要です。

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が必要です。(2003/09/09 訂正)
外付けEEPROMが必須
AMシリーズまでは、外付けのEEPROM無しでも使用出来ましたが、BMシリーズの機能を使うには外付けEEPROMが必要です。
EEPROMが無い場合は、AMシリーズまでの機能しか使うことが出来ません。


この説明は誤りです。上記「シリアライザを使ってBMシリーズの機能を有効にする」を参照して下さい。(2003/09/09 訂正)

具体的な使い方 (初期化編)

まずは、初期化部分についての解説です。
順番があります。

1. FT_Openでデバイスをオープン
まずはオープンから。これはBit-Bangでなくても同じです。
2. FT_SetBaudRateで入出力間隔を設定
Bit-Bangが有効になっている間は、FT_SetBaudRateで設定した時間間隔で入出力が行われます。
9600と指定したら1/9600=104us周期で入出力が行われるのではなく、指定値×16となります。すなわち、9600と指定した場合、1/(9600×16)=6.51us周期となります。
…そのような事がFTDIの資料に書いているのですが、
実際に測ったところ、指定値×4付近をふらついています。
標準外の周期を指定したい場合は、FT_SetDiviserを使います。
3. 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にて設定された周期で入出力端子がサンプリングされ、端子状態が受信バッファに逐次格納、送信バッファのデータが入出力端子より逐次出力されます。送信バッファが空の場合は、直前の送信データが出力され続けます。

例1) Bit-Bangモード無効

FT_SetBitMode(handle, 0x00, 0);


例2) Bit-Bangモード有効・D0〜D7を入力に設定

FT_SetBitMode(handle, 0x00, 1);


例3) Bit-Bangモード有効・D0〜D3を入力、D4〜D7を出力に設定

FT_SetBitMode(handle, 0xf0, 1);


具体的な使い方 (読み書き編)

実際に読み書きする部分の解説です。
ここはFT_GetBitModeを使う箇所以外は、従来のAMシリーズでのデータ送受信方法と同様です。

出力はFT_Writeで
出力設定された端子にデータを出力するには、FT_Writeを使って送信バッファに出力データを設定します。
送信バッファに蓄えられたデータは、FT_SetBaudRateにより設定された周期で出力設定された端子より出力されます。
入出力端子の"その時点で"の状態取得はFT_GetBitModeで
FT_GetBitModeを使うと、入出力端子のその時点での状態を取得することが出来ます。
ただし、USBの仕様上でしょうか? それなりの時間が掛かるので、端子状態のポーリング等には不向きです。
実測値では、1回のAPI呼び出しにつき約4ms掛かりました。
連続した入出力端子の状態取得はFT_Readで
入出力端子の状態取得を連続して行う場合は、FT_Readを使い、受信バッファから一括してデータを取得します。
受信バッファを溢れさせないために、受信データの取得は別スレッドにした方が良いでしょう。

実例1:汎用I/Oポートとして使う

回路図

最も簡単な例として、スイッチの入力をそのままLEDへ出力する例を示します。
FT8U245BMのデータ端子にスイッチとLEDを付けただけの簡単な回路です。
FT8U245BM基板と接続するのは、右側の回路図のとおり、D0〜D7、GND、プルアップ用のVCC(+5V)のみです。基板から他の信号線も出ていますが、接続する必要はありません。

FT8U245BM基板の部分は、アプリケーションノートの基本回路を基に汎用で使えるようにしたものです。具体的にはこのような回路になります。(→FT8U245BM基板回路図)

写真の方が部品が多かったり、上位下位が逆だったりしますが、とりあえず気にしないで下さい。

(→ Visual C++6.0用サンプルプログラム・ソース一式 / 104KBytes)

入出力テスト

ソースリストは最低限必要な部分だけ書いています。実際はこれにエラー処理等が入ります。

BYTE        bInData;    // 入力データ
BYTE        bOutData;   // 出力データ
DWORD       dwWritten;  // 書き込んだバイト数
FT_HANDLE   hFt;        // デバイスのハンドル

// デバイス(1番目)をオープン
FT_Open(0, &hFt);

// Bit-Bangモード有効・D0〜D3を入力、D4〜D7を出力に設定
FT_SetBitMode(fTt, 0xf0, 1);

while(1)
{
    // スイッチの状態を取得
    FT_GetBitMode(fTt, &bInData);

    // 取得した状態を4bitずらす
    bOutData    = bInData << 4;

    // スイッチの状態を出力
    FT_Write(hFt, &bOutData, 1, &dwWritten);
}

実例2:AVRマイコンプログラマ

AVRプログラマソフト

ATMEL社のワンチップマイコンであるAVRマイコンに、プログラムを書き込むためのライタを製作しました。
AVRマイコンのISP端子(RESET,MISO,MOSI,SCK)を、FT8U245BMのデータ端子に過電流保護用抵抗を介して接続しているだけという単純な構造です。

データの受信部にFT_Readを使い、高速に読み出すことで、他のAVRプログラマに比べ遜色ない読み書き速度が実現できました。

このAVRプログラマは作成途中なので、完成次第別ページにて紹介します。

AVRプログラマ基板

実例3:LCD操作

LCD制御

HD44780互換のキャラクタLCDモジュールを制御してみました。
AVRマイコンプログラマと同じく、ほとんど配線のみで実装出来ます。

詳細はこちらへ。


Bit-Bangモードの変なクセ?

ここでは、Bit-Bangモードを調べて気づいた点を説明しています。
テストに使用したドライバのバージョンは、1.05.04です。

ボーレート設定値は×16にならない?
FTDIの提供する資料には、Bit-Bangモード時の転送速度はボーレート設定値×16と書かれていますが、実際に測定したところ×4くらいでした。しかも、以下の結果は、Windows 98とXPにて、ボーレート設定値を600、1024バイトのデータをFT_Writeし実行が終わるまでに掛かった時間を集計したものです。
Windows 98SEではボーレート設定値の約4倍、Windows XPも約4倍ですが、かなりふらつきがあることが分かります。
結果はXPですが、Windows 2000でもほぼ同様の傾向となりました。

Windows 98SE
 時間(sec)bytes/sec
1回目0.4192,444
2回目0.4192,444
3回目0.4192,444
4回目0.4192,444
5回目0.4192,444
平均値0.4192,444
Windows XP
 時間(sec)bytes/sec
1回目0.3592,786
2回目0.3612,770
3回目0.3652,740
4回目0.3532,833
5回目0.3682,717
平均値0.3612,769
高速転送は無理?
FT_SetBitModeで指定するボーレートを大きくすると、その分だけ高速にデータを転送できますが、受信データを取りこぼすとそれ以降のデータ受信が出来なくなる現象が発生しました。一度こうなってしまうと、FT8U側の電源を再投入しなければ復旧しません。(FT_ResetDeviceでのソフトウェアリセットや、再オープンでも不可)
PIII-600+Windows XPの場合だと、設定値57,600(×4≒230,000bytes/s)位が限界でした。受信スレッドのプライオリティを上げれば多少改善されました。

極端なはなし、下記のようなコードでもダメなのです。謎です。
HANDLE  hEvent = CreateEvent(NULL, FALSE, FALSE);
DWORD   dwReceived;
DWORD   dwRead;
BYTE    bBuf[256];

FT_SetBaudRate(handle, 大きな値);
FT_SetEventNotification(handle, &hEvent, FT_EVENT_RXCHAR);
FT_SetBitMode(handle, 0x00, 1);
WaitForSingleObject(handle, hEvent, INFINITE);
FT_GetQueueStatus(handle, &dwRead);
FT_Read(handle, bBuf, min(sizeof(bBuf), dwRead), &dwReceived);
各設定値はデバイスの電源を切るまで有効
以下の状態は、デバイスの電源が入っているあいだ、直前に指定された値が保持されるようです。
これらの状態は、ソフトウェアリセット(FT_ResetDevice)や、キューのクリア(FT_Purge)を行っても保持されます。 (未確認ですが、電源再投入以外にハードウェアリセットでも初期化されるかもしれません)


他にも保持される値がありそうですが、まだ未確認です。

有用なリンク

FT8Uシリーズを活用する上で欠かせないリンク集です。

Future Technology Devices
FT8Uシリーズの製造元。
各種データシート、ドライバ、ユーティリティはここで入手しましょう。
株式会社 アイ・ピイ・アイ
FT8U232/245BMはこちらで購入しました。
発送も早くていい感じ、Webで注文すれば翌日or翌々日には届きます。
有限会社 ヒューマンデータ
USBコーナーでは、FT8Uシリーズの導入から開発まで非常に丁寧に解説されているので、一読をおすすめします。
「完成しているUSBモジュール基板が欲しい!」という人はUSB-004を買うといいかも。
株式会社 西日本常盤商行
FT8UシリーズAPIリファレンスの邦訳版があります。
FT8U232/245AMのモジュールが何気に安い!?


[BACK]