FT232R の CBUS 制御

[戻る]

FT232R とは USB-シリアルの変換チップです. 私も これこれなどで 活用していました. 通常シリアル変換以外の機能は使わない主義なのですが, あるとき緊急に CBUS を I/O ピンとして使う必要があったのでやり方を調べてみました. 結果,

  1. まず FT-Prog というツールで CBUS を使うと宣言し
  2. 適当なプログラムを書けば
いいことが分かりました. ドライバは最近は VCP (シリアルポートとして見える奴) と共通化されているため, VCP を入れなおす必要はありません. ただし, プログラムを書くにはヘッダファイルとライブラリが必要なため CDM のドライバを ダウンロードし, ftd2xx.h と ftd2xx.lib を手に入れておく必要があります.

プログラムの以下のような感じです (ビルドには ftd2xx.lib をリンクする必要があります).

#include "stdio.h"
#include <windows.h>
#include <stdio.h>
#include "FTD2XX.H"

int main(){
 HANDLE hc;
 int res;
 char Buf[64];

 Buf[0] = 0;
 res = FT_ListDevices(0, Buf, FT_LIST_BY_INDEX | FT_OPEN_BY_DESCRIPTION );
 hc = FT_W32_CreateFile( Buf, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
       FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FT_OPEN_BY_DESCRIPTION, NULL);
 if (hc==INVALID_HANDLE_VALUE){
  fprintf(stderr, "Error\n"); //デバイスが見つからない
  return -1;
 }

〜〜〜処理〜〜〜

 FT_W32_CloseHandle(hc);
 return 0;
}
この黄色い部分でやりたいことを行います.

CBUS0〜3 の入出力の向きと出力時の H/L は FT_SetBitMode() の第二引数で指定します. たとえば CBUS0〜2 を出力にして, CBUS1 だけを H にしようとすると

BYTE data=0x72; // 0111-0010
res = FT_SetBitMode(hc, data, 0x20);
if(res != FT_OK)
 fprintf(stderr, "Error\n"); // 失敗
とします. 一方, ピンの H/L を読み取るときは
BYTE data;
res = FT_GetBitMode (hc, &data);
if(res != FT_OK)
 fprintf(stderr, "Error\n"); // 失敗
とします.

なお, 各ピンの H/L/Hi-z はプログラムが終了しても, デバイスを抜かないかぎり持続します.

ところで, 上述したようにこのプログラムはあらかじめ FT-Prog で CBUS の機能を I/O モードにしておく必要があります. ところがこの FT-Prog は .Net Framework 4 を要求してくるため動かすまでの道のりが長いです.

設定したいのは Cbus の機能とシリアルナンバだけだったら上記「処理」の部分にて

FT_PROGRAM_DATA ftData;

char ManufactureBuf[32];
char ManufactureIDBuf[16];
char DescriptionBuf[64];
char SerialNumberBuf[16];

ftData.Signature1=0x00000000;
ftData.Signature2=0xffffffff;
ftData.Version = 2;

ftData.Manufacturer = ManufactureBuf;
ftData.ManufacturerId = ManufactureIDBuf;
ftData.Description = DescriptionBuf;
ftData.SerialNumber = SerialNumberBuf;

res= FT_EE_Read(hc, &ftData);
if (res== FT_OK){
 strcpy(ftData.SerialNumber, SERIAL_NUMBER);
 ftData.Cbus0 = XX;
 ftData.Cbus1 = XX;
 ftData.Cbus2 = XX;
 ftData.Cbus3 = XX;
 ftData.Cbus4 = XX; // CBUS4 は I/O モードにできない

 printf("Setting...");
 FT_EE_Program(hc, &ftData);
 printf("Done\n");
}
といったプログラムを書き, 実行するだけで済みます. ここで XX は Sleep だったら 0x05, I/O モードだったら 0x0a です. その他の値だとどんな設定になるかは ftd2xx.h ででも調べてください.

一方 SERIAL_NUMBER は 15 文字以内の適当な文字列です. FT232R を積んだボードを量産した際, それらに同じシリアル番号を振っておくと, 別の固体を接続する度にドライバのインストールが始まったり, 別のシリアルポート番号が割り振られることがなくなります. ただしそれらの機器を同時に一つの PC に繋いだらどうなるかは分かりません.

せっかくなので設定を行う プログラムを作ってみました.

ft232rconf -r
とすると現在の設定が表示されます. CBus の設定は数値で出しています. 05 が Sleep, 0a は I/O モードです.
ft232rconf -c 0a 05 05 05 05
とすると, CBus0 が I/O モード, CBus 1〜4 は Sleep モードになります. 05 や 0a 以外の数値も指定できますがそれが意味のある数値かどうかは チェックしていません.

ft232rconf -s ABCDEFG
とするとシリアル番号が ABCDEFG に指定されます. -c と -s は同時に指定することができます.

しかしこの I/O 機能なかなかいいかもしれません. 今までは CP2102 や PL2303 等の同等品でも使えるようにとシリアル変換機能しか 使ってきませんでしたが, 便利なものは便利だと活用していった方がいいのかもしれません. 最後に使わなくなったシリアル番号の情報は こちらの Tipsで 消し去ることが可能です.


[追記] 上記 ft232rconf は ft234x ではうまく動きません FT_Prog だと設定できます. 最近の FT_Prog はインストールが簡単になったのでそっちを使うのがいいでしょう. (2016.9)
2012.4