FTDIのSYNC-245-FIFOモードでのPCとの通信
FT2232HのEEPROM設定変更
10Mbpsの通信治具を作る必要があり、FT2232HでのUSBダイレクト接続&アプリケーション開発を試みる。基板から起こすのは大変なので、ストロベリーリナックスの「 FT2232H(2ch)高速USBシリアル変換モジュールキット」を購入した(込み込みで\4000)。
通常、FT2232Hは仮想COM 2chとして認識されるが、COMポートだとオーバーヘッドのため、10Mbpsを実現できない。
FTDIのEEPROM設定には、通常「
MProg 」というユーティリティを使用する。この辺はトラ技のUSB特集を参考にするといい。MProgで設定書き込みを試みるがデバイスがFT2232Cしかない。上位互換かと思い、FT2232Cのデバイス設定で、COM portからD2XXの設定をEEPROMに書き込んだところ、認識しなくなったorz。
EEPROMがないとデフォルトのCOMとして認識するので、EEPROMを外してPCに接続し、デバイスとして認識された後、EEPROMをソケットに差した(通電してる)。その後、MProgを用いてEEPROMをクリアしたところ、初期の設定に戻すことができた。
MProgでは、FT2232Hを上手くD2XXモードにすることができなかったので、
FT_Prog を使用した。FT_Progは直感的に使いやすい。D2XXモードとして、正常に認識されればデバイスマネージャ上ではCOMポートがなく、USBコントローラ上に2ch分「USB Serial Converter AまたはB」が表示される(表示名はデフォのまま、変えることもできる)。
D2XX接続のアプリケーション
開発は、VC++2005/MFCにて行った。
FT2232Hのドライバについてくる「ftd2xx.h」を#includeする。ソースコードは、
ここ を参考にするとよい。
カレントディレクトリに*.hや*.libなどはすべてコピーする。
#include "ftd2xx.h"
#pragma comment(lib,"ftd2xx.lib")
USB情報の取得
手始めにUSB情報をD2XXライブラリ経由から取得する。上手くゆけばデバイスマネージャやFT_ProgでみることができたUSB情報を得ることができる。
FT_HANDLE ftHandle;
FT_STATUS ftStatus;
DWORD numDevs;
DWORD Flags;
DWORD ID;
DWORD Type;
DWORD LocId;
char SerialNumber[16];
char Description[64];
// create the device information list
ftStatus = FT_CreateDeviceInfoList(&numDevs);
if (ftStatus == FT_OK)
{
printf("Number of devices is %d\n",numDevs);
}
if (numDevs > 0)
{
// get information for device 0
ftStatus = FT_GetDeviceInfoDetail(0, &Flags, &Type, &ID, &LocId, SerialNumber, Description, &ftHandle);
if (ftStatus == FT_OK)
{
//printf("Dev 0:\n");
m_Flags.Format(_T("0x%x"),Flags);
m_Type.Format(_T("0x%x"),Type);
m_ID.Format(_T("0x%x"),ID);
m_LocId.Format(_T("0x%x"),LocId);
m_SN = SerialNumber;
m_Description = Description;
m_ftHandle.Format(_T("0x%x"),ftHandle);
UpdateData(FALSE);
}
}
こんか感じになる。参考にする場合は、変数などは適当に合わせる。
Bit-Bangモード(簡易Write)
まず手始めにBit-Bangモードを用いた簡単なLED制御を行う。Bit-Bangモードの設定はFT_SetBitModeを使う。FT_SetBitModeではいくつかのモードを指定することができる。モードの関する詳しい説明はD2XXの
説明書 を参考のこと。
UCHAR Mask = 0xff;
UCHAR Mode = 1; // Set asynchronous bit-bang mode
ftStatus = FT_SetBitMode(ftHandle, Mask, Mode);
if (ftStatus == FT_OK)
{
// 0xff written to device
m_Msg = _T("set Bit-Bang mode");
UpdateData(FALSE);
}
else
{
// FT_SetBitMode FAILED!
}
実際の出力はFT_Writeを使用する。回路図は省略するが、出力端にLED->抵抗->GNDを接続すると、出力を確認できる。
DWORD BytesWritten;
CString str;
unsigned char TxBuffer[1]; // Contains data to write to device
// 値取り込み
UpdateData(TRUE);
char *s = new char[m_hex.GetLength()+1];
strcpy(s, (CT2A)m_hex);
TxBuffer[0] = (unsigned char)strtol(s, NULL, 16);
ftStatus = FT_Write(ftHandle, TxBuffer, sizeof(TxBuffer), &BytesWritten);
if (ftStatus == FT_OK)
{
// FT_Write OK
m_Msg.Format(_T("send command 0x%02x"),TxBuffer[0]);
UpdateData(FALSE);
}
else
{
// FT_Write Failed
}
次にReadをやってみたがFT_Readでは上手くいかない。FT_GetBitModeで上手くいった。
最終更新:2016年09月13日 01:07