FTDI

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