FTDI社の FT232BM / 245BM 以降の FT232R / 245R 、FT2232H などの USB–UART、USB–FIFO デバイスには、Bit Bang モード が備わっています。
この Bit–Bang モード とは、パソコンから USBケーブルを介して、これらのデバイスの I/Oポートを直接操作できるものです。つまり、特別なファームウェアやマイコンの助けを借りなくても、少ない部品でポートに接続した LED を点灯させたり、リレーを操作したり、スイッチの状態を取得することが可能になります。
Bit–Bang モードを利用するためには、D2XX.DLL という、ダイレクトドライバー ソフト が必要になりますが、このドライバー ソフト は FTDI社のサイトから無料でダウンロードし、使用することができますし、現在では、Windows Update サイトから最新版を自動的にダウンロードしてインストールすることもできます。
セットアップ ソフト(2011-11-01 時点の WHQL 承認の最新版は、CDM20814_Setup.exe) は、ダイレクト ドライバ ソフト と 仮想シリアルポート(VCP) ドライバ と一本化されたものです。
この Bit Bang Test は、Bit Bang モード をかんたんに試してみるためのソフトウェアです。
バージョン1.0.0
画面は Synchronous Bit Bang モード使用時
動作環境:
.NET Framework 2.0 がインストールされている Windows パソコン
D2XX.DLL ダイレクトドライバー ソフト (CDM20814_Setup.exe もしくはそれ以降のWHQLバージョン)
Windows 7 .NET Framework は標準で OS に含まれています。
Windows Vista .NET Framework は標準で OS に含まれています。
Windows XP .NET Framework 2.0 以上が必要です。
動作確認は Windows7/XP でおこないました。
ダウンロード:
Bit Bang Test 1.0.0 のダウンロード(2011年11月02日、ZIPファイル、49.6KB)
使用方法:
ダウンロードしたファイルを適当なフォルダに解凍してください。アンインストールする場合は、フォルダごと削除してください。
プログラムを起動すると、お使いのパソコンに接続されている FTDIデバイスを自動的に探し、一覧表示しますので、使用するデバイスをコンボボックスの一覧から選択します。デバイスが1つだけの場合は、「Bit モードの選択」で Bit Bang モード を選択します。
複数のデバイスが接続されている場合の起動直後の画面
接続されているデバイスが1つだけの場合の起動直後の画面
[ 検出されたデバイスのインデックスと説明 ]
接続されているデバイスが1つだけの場合の起動直後の画面
Bit Bang Test の起動時と [ 検索 ] ボタンを押したときに、パソコンに接続されている FTDIデバイスを探します。
[ 検索 ]
USB機器を挿入または抜去したときは、 [ 検索 ] ボタンを再度押して、情報を更新してください。
' **************************************************
' コードの一例
' **************************************************' デバイスの数を取得する(第3引数でデバイスの数を取得するフラグを指定する)
' 使用している関数Public Declare Function FT_ListDevices Lib "FTD2XX.DLL" _
(ByRef pvArg1 As Integer, ByVal pvArg2 As String, ByVal dwFlags As Integer) As IntegerPublic FT_Status As Integer ' 関数の戻り値。成功すれば ‘0’、その他の場合はエラーコードを返す。
Public Const FT_OK As Integer = 0 '
Public FT_Handle As Integer
Public Const FT_LIST_NUMBER_ONLY As Integer = Cint(&H80000000)
Public nDeviceCount As IntegerTry
FT_Status = FT_ListDevices(nDeviceCount, vbNullChar, FT_LIST_NUMBER_ONLY)
If FT_Status <> FT_OK Then
' 失敗した場合の処理を記述する
End If
Catch ex As Exception
' その他の例外エラーを捕捉する
End Try
' デバイスの情報を取得する(上記とおなじ関数を使用するが、第3引数は上記とは異なる)
' 使用している関数Public Declare Function FT_ListDevices Lib "FTD2XX.DLL" _
(ByRef pvArg1 As Integer, ByVal pvArg2 As String, ByVal dwFlags As Integer) As IntegerPublic FT_Description As String
Public Const FT_LIST_BY_INDEX As Integer = &H40000000
Public Const FT_LIST_ALL As Integer = &H20000000If nDeviceCount > 0 Then
Dim strDescription As String = Space(64)
Dim nIndex As IntegerFor nIndex = 0 To nDeviceCount - 1
FT_Status = FT_ListDevices(nDeviceCount, strDescription, _
FT_LIST_BY_INDEX Or FT_LIST_ALL)' strDescription から必要な情報を取り出して ListBox と ComboBox の リストに追加する
Next
Else
' デバイスが見つからなかった場合の処理を記述する
End If
[ デバイスの選択 ]
デバイスの選択は、リストボックスからではなく、コンボボックスの一覧から選択します。
[ Bit Bang モード の選択 ]
使用する Bit Bang モード をコンボボックスの一覧から選択します。
' **************************************************
' コードの一例
' **************************************************' Bit Bang モードを設定する(第2引数は Bit モード、第3引数は Bit Bang モード)
' 使用している関数Public Declare Function FT_SetBitMode Lib "FTD2XX.DLL" _
(ByVal ftHandle As Integer, ByVal ucMask As Byte, ByVal ucMode As Byte) As IntegerPublic FT_Status As Integer
Dim MyBitModeMask As Byte ' Bit モードのマスク、I/Oポートの入出力方向
Dim MyBitBangMode As Byte ' Bit Bangモード、01h = Asynchronous、04h = SynchronousFT_Status = FT_SetBitMode(FT_Handle, MyBitModeMask, MyBitBangMode)
If FT_Status <> FT_OK Then
' 失敗した場合の処理を記述する
End If
[ Baud rate の選択 ]
Baud rate をコンボボックスの一覧から選択します。通常は規定値のままでOKです。必要があればあれば変更してください。
' **************************************************
' コードの一例
' **************************************************' Baud Rate を設定する
' 使用している関数Public Declare Function FT_SetBaudRate Lib "FTD2XX.DLL" _
(ByVal ftHandle As Integer, ByVal dwBaudRate As Integer) As IntegerPublic FT_Status As Integer
Dim MyBaudRate As Integer ' Bit モードのマスク、I/Oポートの入出力方向MyBaudRate =115200
FT_Status = FT_SetBitMode(FT_Handle, MyBaudRate)
If FT_Status <> FT_OK Then
' 失敗した場合の処理を記述する
End If
[ Latency Timer 値 の選択 ]
割り込み要求の遅延時間 を選択します。単位はミリ秒です。通常は規定値のままでOKです。遅延時間を最小に設定したからといっても、設定した時間どおり Windows が要求に応えるとはかぎりません(実際の最小の応答時間は、Windows のバージョンによって異なるようです)。しかし、値を大きくすると、応答時間は確実に遅くなります。
' **************************************************
' コードの一例
' **************************************************' Latency Timer 値を設定する(第2引数は、1~255)
' 使用している関数Public Declare Function FT_SetLatencyTimer Lib "FTD2XX.DLL" _
(ByVal ftHandle As Integer, ByVal ucTimer As Byte) As IntegerPublic FT_Status As Integer
Dim MyLatency As Integer 'MyLatency =1
FT_Status = FT_SetLatencyTimer(FT_Handle, MyLatency)
If FT_Status <> FT_OK Then
' 失敗した場合の処理を記述する
End If
[ 入出力信号線の設定 ]
入出力ポートの8本のピンの入出力方向の設定と(Asynchronous Bit Bang モード、Synchronous Bit Bang モード)、出力に設定した場合の High、Low 出力を設定します(Asynchronous Bit Bang モードのみ)します。
入力信号には、受信操作をしたときの8本のピンの状態が表示されます。赤色は High、灰色はLow の状態にあることを示します(あなたがピンに接続したLEDの点灯状態ではありません)。
「入出力」には、ポートの入出力方向が表示されます。
「出力」には、ポートに出力するバイトデータが表示されます( [ 送信 ] ボタンを押さないとデータは送信されません)。
「入力」には、ポートの入力状態がバイトデータで表示されます( [ 受信 ] ボタンを押さないとデータは更新されません)。
Asynchronous Bit Bang モード 専用です。「出力信号」で指定した値をポートに書き込みます。
' **************************************************
' コードの一例
' **************************************************' Bit Bang モードを設定する(第2引数は Bit モード、第3引数は Bit Bang モード)
' 使用している関数Public Declare Function FT_SetBitMode Lib "FTD2XX.DLL" _
(ByVal ftHandle As Integer, ByVal ucMask as Byte, ByVal ucMode As Byte) As IntegerPublic FT_Status As Integer
Dim MyBitModeMask As Byte ' Bit モードのマスク、I/Oポートの入出力方向
Dim MyBitBangMode As Byte ' Bit Bangモード、01h = Asynchronous、04h = SynchronousFT_Status = FT_SetBitMode(FT_Handle, MyBitModeMask, MyBitBangMode)
If FT_Status <> FT_OK Then
' 失敗した場合の処理を記述する
End If
Asynchronous Bit Bang モード 専用です。現在のポートの値を読み取ります。
' **************************************************
' コードの一例
' **************************************************' 現時点のデータバスの値を取得する
' 使用している関数Public Declare Function FT_GetBitMode Lib "FTD2XX.DLL" _
(ByVal ftHandle As Integer, ByRef pucMode As Byte) As IntegerPublic FT_Status As Integer
Dim MyPortValue As Byte ' Bit モードのマスク、I/Oポートの入出力方向FT_Status = FT_GetBitMode(FT_Handle, MyPortValue)
[ 接続する / 切断する ]
デバイスを開きます。また、開いたデバイスを閉じます。Asynchronous Bit Bang モード、Synchronous Bit Bang モード
' **************************************************
' コードの一例
' **************************************************' デバイスを開く(第1引数は デバイスのインデックス)
' 使用している関数Public Declare Function FT_Open Lib "FTD2XX.DLL" _
(ByVal iDevice As Integer, ByRef ftHandle As Integer) As IntegerPublic FT_Status As Integer
Dim MyDeviceIndex As IntegerFT_Status = FT_Open(MyDeviceIndex, FT_Handle)
If FT_Status <> FT_OK Then
' 失敗した場合の処理を記述する
End If
' デバイスを閉じる
' 使用している関数Public Declare Function FT_Close Lib "FTD2XX.DLL" _
(ByVal ftHandle As Integer) As IntegerPublic FT_Status As Integer
FT_Status = FT_Close(FT_Handle)
If FT_Status <> FT_OK Then
' 失敗した場合の処理を記述する
End If
[ チャート表示 ]
[ 区切り文字 ]
送信用のテキストボックスへのデータの入力と、受信用のテキストボックスに表示されるデータの形式を指定します。送信用のテキストボックスに入力されたデータのプレフィックスは自動的に削除されます。
- なし データの区切り文字を使用しません(送受信で個別設定可能)。例: 728FF3FFF3FFF3FA0000308A1002108C
- スペース データの区切り文字にスペースを使用します(送受信で個別設定可能)。例: E0 90 08 00 10 83 0A 20 08 51 D7 A2
- コンマ データの区切り文字にコンマを使用します(送受信で個別設定可能)。例: 0A,60,B6,A2,80,03,48,20,75,73,45
- "" データの区切り文字にダブルクォートとコンマを使用します(受信のみ設定可能)。例: "0A","60","B6","A2"
[ プレフィックス ]
16進数をしめす接頭辞です。受信用のテキストボックスに適用されます。区切り文字とあわせて指定します。
- なし プレフィックスを付加しません。例: BF
- 0x プレフィックスとして「0x」を付加します。例: 0xE0
- &H プレフィックスとして「&H」を付加します。例: &HE0
- "" と 0x を組み合わせた例: "0x0A","0x60","0xB6","0xA2"
[ 送信 ]
送信用のテキストボックスに入力されたデータをデバイスに書き込みます。Synchronous Bit Bang モード時は、送信と受信をおこないます。Asynchronous Bit Bang モード時は、上のほうで説明した方法とおなじです。
' **************************************************
' コードの一例
' **************************************************' Synchronous Bit Bang モードでの送受信
' 使用している関数Public Declare Function FT_Write Lib "FTD2XX.DLL" _
(ByVal ftHandle As Integer, ByRef lpBuffer As Byte, ByVal dwBytesToWrite As Integer, ByVal lpdwBytesWritten As Integer) As IntegerPublic Declare Function FT_Read Lib "FTD2XX.DLL" _
(ByVal ftHandle As Integer, ByRef lpBuffer As Byte, ByVal dwBytesToRead As Integer, ByVal lpdwBytesReturned As Integer) As IntegerPublic FT_Status As Integer
Public Const TxSize As Integer = &H100000 '
Public TxBuffer(TxSize -1) As Byte
Public Const RxSize As Integer = &H10000
Public RxBuffer(RxSize - 1) As ByteDim TxCount As Integer
Dim TxResult As Integer
Dim RxCount As Integer
Dim RxResult As Integer' 送信用テキストボックスのデータを送信用バッファに格納して書き込む
' いちどに送信できるのは、最大63,448バイトFT_Status = FT_Write(FT_Handle, TxBuffer(0), TxCount, TxResult)
If FT_Status <> FT_OK Then
' 失敗した場合の処理を記述する
End If
FT_Status = FT_Read(FT_Handle, RxBuffer(0), RxCount, RxResult)
If FT_Status <> FT_OK Then
' 失敗した場合の処理を記述する
End If
' 受信用バッファに格納されたデータを受信用テキストボックスに表示する
' バッファサイズを超えるデータを受信すると、データは消失する
[ 受信 ]
[ 描画・再描画 ]
ウインドウが開いただけでは描画されません。[ 描画・再描画 ] ボタンを押すと、描画が開始されます。表示が消えた場合も[ 描画・再描画 ] ボタンを押してください。
[ 背景色 ][ DB0 ]...[ DB7 ][ 格子 ]
背景色や線色などの配色を変更します。Bit Bang Test は現時点では、配色の変更を保存しません。
注意
デバイスのポートの状態は、電源を切るまで保持されます。
著作権と免責事項:
このソフトウェアはフリーウェアとして提供されますが、使用にあたっては下記に同意する必要があります。
このソフトウェアの著作権は、法律で保護されています。このソフトウェアの使用、配布、複製は著作権者の許可なく無料でおこなえますが、商行為には著作権者の許可なく利用できません。
このソフトウェアにはバグがあるかもしれませんし、著作権者はこのソフトウェアがあなたの期待通りに動作することを保証するものではありません。このソフトウェアは無保証であり、このソフトウェアの使用により生じた直接間接の損害にたいし、著作権者は責任を負いませんし、補償もしません。あくまで自己責任において使用してください。
2011年11月03日作成