
FT232RL CBUSの実験 2008.02.26(火)〜![]()
2008.02.29(金) EEPROMデータを読出しました。追加分のプログラムソースコード(Form1.cs) [DllImport("ftd2xx.dll")] unsafe private static extern UInt32 FT_EE_Read(UInt32 lngHandle, FT_PROGRAM_DATA* pData); unsafe public struct FT_PROGRAM_DATA { public UInt32 Signature1; // Header - must be 0x00000000 public UInt32 Signature2; // Header - must be 0xffffffff public UInt32 Version; // Header - FT_PROGRAM_DATA version // 0 = original // 1 = FT2232C extensions public UInt16 VendorId; // 0x0403 public UInt16 ProductId; // 0x6001 public char* Manufacturer; // "FTDI" public char* ManufacturerId; // "FT" public char* Description; // "USB HS Serial Converter" public char* SerialNumber; // "FT000001" if fixed, or NULL public UInt16 MaxPower; // 0 < MaxPower <= 500 public UInt16 PnP; // 0 = disabled, 1 = enabled public UInt16 SelfPowered; // 0 = bus powered, 1 = self powered public UInt16 RemoteWakeup; // 0 = not capable, 1 = capable // // Rev4 extensions // public Byte Rev4; // non-zero if Rev4 chip, zero otherwise public Byte IsoIn; // non-zero if in endpoint is isochronous public Byte IsoOut; // non-zero if out endpoint is isochronous public Byte PullDownEnable; // non-zero if pull down enabled public Byte SerNumEnable; // non-zero if serial number to be used public Byte USBVersionEnable; // non-zero if chip uses USBVersion public Byte USBVersion; // BCD (0x0200 => USB2) // // FT2232C extensions // public Byte Rev5; // non-zero if Rev5 chip, zero otherwise public Byte IsoInA; // non-zero if in endpoint is isochronous public Byte IsoInB; // non-zero if in endpoint is isochronous public Byte IsoOutA; // non-zero if out endpoint is isochronous public Byte IsoOutB; // non-zero if out endpoint is isochronous public Byte PullDownEnable5; // non-zero if pull down enabled public Byte SerNumEnable5; // non-zero if serial number to be used public Byte USBVersionEnable5; // non-zero if chip uses USBVersion public UInt16 USBVersion5; // BCD (0x0200 => USB2) public Byte AIsHighCurrent; // non-zero if interface is high current public Byte BIsHighCurrent; // non-zero if interface is high current public Byte IFAIsFifo; // non-zero if interface is 245 FIFO public Byte IFAIsFifoTar; // non-zero if interface is 245 FIFO CPU target public Byte IFAIsFastSer; // non-zero if interface is Fast serial public Byte AIsVCP; // non-zero if interface is to use VCP drivers public Byte IFBIsFifo; // non-zero if interface is 245 FIFO public Byte IFBIsFifoTar; // non-zero if interface is 245 FIFO CPU target public Byte IFBIsFastSer; // non-zero if interface is Fast serial public Byte BIsVCP; // non-zero if interface is to use VCP drivers }; public FT_PROGRAM_DATA[] ftData = new FT_PROGRAM_DATA[16]; //---------------------------------------------------- // EEPROM読出し釦クリックイベント //---------------------------------------------------- unsafe private void button6_Click(object sender, EventArgs e) { int i; UInt32 ftHandle; // FT232RLモジュールとの通信を開始 ftStatus = FT_Open(0, &ftHandle); if (ftStatus != FT_OK) return; char[] ManufacturerBuf = new char[64]; char[] ManufacturerIdBuf = new char[16]; char[] DescriptionBuf = new char[64]; char[] SerialNumberBuf = new char[16]; fixed (char* MPtr = &ManufacturerBuf[0], MIDPtr = &ManufacturerIdBuf[0], DPtr = &DescriptionBuf[0], SPtr = &SerialNumberBuf[0]) { fixed (FT_PROGRAM_DATA* APtr = &ftData[0]) { ftData[0].Manufacturer = MPtr; ftData[0].ManufacturerId = MIDPtr; ftData[0].Description = DPtr; ftData[0].SerialNumber = SPtr; // EEPROMデータ読出し ftStatus = FT_EE_Read(ftHandle, APtr); } // ベンダーIDを表示 listBox1.Items.Add("VID=" + ftData[0].VendorId.ToString("X4")); // プロダクトIDを表示 listBox1.Items.Add("PID=" + ftData[0].ProductId.ToString("X4")); string tmp = "SerialNumber="; for (i = 0; ; i++) { if ((int)(ftData[0].SerialNumber[i]) == 0) break; tmp += byte2chr((Byte)((int)(ftData[0].SerialNumber[i]) & 0xFF)); tmp += byte2chr((Byte)((ftData[0].SerialNumber[i] >> 8) & 0xFF)); } // シリアルNoを表示 listBox1.Items.Add(tmp); tmp = "Manufacturer="; for (i = 0; ; i++) { if ((int)((ftData[0].Manufacturer[i]) & 0xFF) == 0) break; tmp += byte2chr((Byte)((int)(ftData[0].Manufacturer[i]) & 0xFF)); if ((int)(((ftData[0].Manufacturer[i]) >> 8) & 0xFF) == 0) break; tmp += byte2chr((Byte)((ftData[0].Manufacturer[i] >> 8) & 0xFF)); } // メーカーを表示 listBox1.Items.Add(tmp); tmp = "Description="; for (i = 0; ; i++) { if ((int)((ftData[0].Description[i]) & 0xFF) == 0) break; tmp += byte2chr((Byte)((int)(ftData[0].Description[i]) & 0xFF)); if ((int)(((ftData[0].Description[i]) >> 8) & 0xFF) == 0) break; tmp += byte2chr((Byte)((ftData[0].Description[i] >> 8) & 0xFF)); } // デバイスディスクリプションを表示 listBox1.Items.Add(tmp); // USBバージョンを表示 listBox1.Items.Add("USBVersion=" + ftData[0].USBVersion.ToString("X2")); // Max Powerを表示 listBox1.Items.Add("MaxPower=" + ftData[0].MaxPower.ToString("D")); } // FT232RLモジュールとの通信を終了 ftStatus = FT_Close(ftHandle); } //------------------------------------------------------------------ // 数値を半角文字に変換 //------------------------------------------------------------------ private char byte2chr(Byte n) { char[] chr_table = { '_','_','_','_','_','_','_','_','_','_','_','_','_','_','_','_', '_','_','_','_','_','_','_','_','_','_','_','_','_','_','_','_', ' ','!','"','#','$','%','&','\'','(',')','*','+',',','-','.','/', '0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?', '@','A','B','C','D','E','F','G','H','I','G','K','L','M','N','O', 'P','Q','R','S','T','U','V','W','X','Y','Z','[','/',']','^','_', '_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o', 'p','q','r','s','t','u','v','w','x','y','z','[','\\',']','^','_', '_','_','_','_','_','_','_','_','_','_','_','_','_','_','_','_', '_','_','_','_','_','_','_','_','_','_','_','_','_','_','_','_', '_','。','「','」','、','_','ヲ','ァ','ィ','ゥ','ェ','ォ','ャ','ュ','ョ','ッ', 'ー','ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ','サ','シ','ス','セ','ソ', 'タ','チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ','ハ','ヒ','フ','ヘ','ホ','マ', 'ミ','ム','メ','モ','ヤ','ユ','ヨ','ラ','リ','ル','レ','ロ','ワ','ン','゙','゚', '_','_','_','_','_','_','_','_','_','_','_','_','_','_','_','_', '_','_','_','_','_','_','_','_','_','_','_','_','_','_','_','_', }; return chr_table[n]; } 2008.02.28(木) CBUSからの入力を確認しました。
入力したCBUS0-3の4ビットを2進数で表示します。 入力の記述例: // CBUSポートを入力に設定 ftStatus = FT_SetBitMode(ftHandle, 0x00, 0x20); // CBUS0-3から入力し、input_data[0]に格納 ftStatus = FT_GetBitMode(ftHandle, input_data); 追加分のプログラムソースコード(Form1.cs) // FT_GetBitMode [DllImport("ftd2xx.dll")] unsafe private static extern UInt32 FT_GetBitMode(UInt32 lngHandle, [MarshalAs(UnmanagedType.LPArray)] byte[] bdata); //---------------------------------------------------- // 入力開始釦クリックイベント //---------------------------------------------------- private void button5_Click(object sender, EventArgs e) { Byte[] input_data = new Byte[1]; if (button5.Text == "入力開始") { // FT232モジュールとの通信を開始 if (FT232_Open() == false) return; // CBUSポートを入力に設定 ftStatus = FT_SetBitMode(ftHandle, 0x00, 0x20); button5.Text = "入力終了"; while (true) { // CBUS0-3から入力 ftStatus = FT_GetBitMode(ftHandle, input_data); // 2進数文字列に変換し表示 textBox1.Text = hex2bin((byte)(input_data[0] & 0x0F)); Application.DoEvents(); if (button5.Text == "入力開始") { break; } } // FT232モジュールとの通信を終了 FT_Close(ftHandle); } else { button5.Text = "入力開始"; } } //---------------------------------------------------- // 1バイトの下位4ビットを2進数文字列に変換 //---------------------------------------------------- private string hex2bin(Byte data) { int n; string tmp = null; for (n = 3; n >= 0; n--) { if ((data & (Byte)(Math.Pow(2, n))) > 0) { tmp = tmp + "1"; } else { tmp = tmp + "0"; } } return tmp; } 2008.02.27(水) VC#で釦に対応したポートに1が出力されることを確認しました。
出力の記述例: ftStatus = FT_SetBitMode(ftHandle, 0x1F, 0x20); ↓ 上位4ビットがCBUS0-3に出力されます。 下位4ビットでCBUS0-3の入出力方向を設定します。 1で出力、0で入力です。 プログラムソースコード(Form1.cs) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; // [DllImport("ftd2xx.dll")]呼び出し用 namespace FT232_CBUS_TEST { public partial class Form1 : Form { public UInt32 ftStatus = 0; public UInt32 ftHandle = 0; public const UInt32 FT_OK = 0; //------------------------------------------ // FTD2XX.DLL呼び出し //------------------------------------------ // FT Open [DllImport("ftd2xx.dll")] unsafe private static extern UInt32 FT_Open(Int16 intDeviceNumber, UInt32* lngHandle); // FT Close [DllImport("ftd2xx.dll")] private static extern UInt32 FT_Close(UInt32 lngHandle); // FT_SetBitMode [DllImport("ftd2xx.dll")] private static extern UInt32 FT_SetBitMode(UInt32 lngHandle, Byte bytMask, Byte bytMode); public Form1() { InitializeComponent(); } //---------------------------------------------------- // b0釦クリックイベント //---------------------------------------------------- unsafe private void button1_Click(object sender, EventArgs e) { // FT232モジュールとの通信を開く if (FT232_Open() == false) return; // b0=1,b1=0,b2=0,b3=0を出力 ftStatus = FT_SetBitMode(ftHandle, 0x1F, 0x20); // FT232モジュールとの通信を閉じる ftStatus = FT_Close(ftHandle); } //---------------------------------------------------- // b1釦クリックイベント //---------------------------------------------------- unsafe private void button2_Click(object sender, EventArgs e) { // FT232モジュールとの通信を開く if (FT232_Open() == false) return; // b0=0,b1=1,b2=0,b3=0を出力 ftStatus = FT_SetBitMode(ftHandle, 0x2F, 0x20); // FT232モジュールとの通信を閉じる ftStatus = FT_Close(ftHandle); } //---------------------------------------------------- // b2釦クリックイベント //---------------------------------------------------- private void button3_Click(object sender, EventArgs e) { // FT232モジュールとの通信を開く if (FT232_Open() == false) return; // b0=0,b1=0,b2=1,b3=0を出力 ftStatus = FT_SetBitMode(ftHandle, 0x4F, 0x20); // FT232モジュールとの通信を閉じる ftStatus = FT_Close(ftHandle); } //---------------------------------------------------- // b3釦クリックイベント //---------------------------------------------------- private void button4_Click(object sender, EventArgs e) { // FT232モジュールとの通信を開く if (FT232_Open() == false) return; // b0=0,b1=0,b2=0,b3=1を出力 ftStatus = FT_SetBitMode(ftHandle, 0x8F, 0x20); // FT232モジュールとの通信を閉じる ftStatus = FT_Close(ftHandle); } //---------------------------------------------------- // FT232RLモジュールとの通信を開く //---------------------------------------------------- unsafe private bool FT232_Open() { UInt32 ftH; // FT232モジュールとの通信を開く ftStatus = FT_Open(0, &ftH); if (ftStatus != FT_OK) { return false; } // ハンドルをコピー ftHandle = ftH; return true; } } } 2008.02.26(火) FT232RLのEEPROMデータのI/O Controlsを書き換えます。 1) FTDI社のサイト Resources Utilities MProg3.0a-EEPROM-Prog Utility からMProg3.0_Steup.exeをダウンロードします。 2) MProg3.0_Steup.exeをダブルクリックしてインストールします。 3) FT232RLモジュールにUSBケーブルを接続します。 4) 「スタート」「プログラム」からMprog3.0を起動します。 [Tools]-[Read and Parse]メニューをクリックします。
5) I/O Controlsを変更します。
6) ファイルに保存します。 7) Program All Exiting Devices釦をクリックします。
FT232RLモジュールのEEPROMにデータが書き込まれます。 シリアルNoが自動的に変更されます。 8) FT232RLモジュールからUSBケーブルを外し、OSが取り外しを認識するまで 待ちます。(数秒から数十秒) 9) 再度FT232RLモジュールにUSBケーブルを接続します。 "新しいハードウェアーが見つかりました。" "デバイスのインストールが完了しました。" と表示されます。
ページのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合に複製が可能です。