歩き遍路 平成19年春(J1) 記録の準備

Visual C#で
   FT-2232HのSyncFIFOでIN転送


 Visual C#を使ってSyncFIFOでIN転送しました。

 以前に記録した「Visual C#でFT2232HのSyncFIFOでOUT転送」に続きIN転送の実験をしました。
 Visual C#のコードは、
前に記録した「Visual C#とFT2232DとH8でLoopTest」がベースです。

●FT2232H 同期FIFOの実験の構成

 実験の構成と構成写真を下記します。

 実験の構成は、ホストのパソコンにFT2232H用ドライバ D2XX とVisual C#で作成したプログラムを搭載します。
 FT2232Hは、FPGAボードの上に実装しました。IN転送のデータを発生するためのスイッチを追加しました。



 実験の構成写真です。 




●FT2232H 同期FIFOの送信制御と結果

 データの流れは、FPGAのシーケンサでデータを発生させてFT2232Hに送ります。FT2232Hはパソコンからのリクエストに応じてデータを送信します。
 次のバブルチャートは、FPGAのシーケンサでデータを発生させてFT2232Hに送る動きを示します。S0からS2は、スイッチ押下を検出します。S20からS22は、FT2232HのFtTxFを監視して送信FIFOに空きが有ればデータをFIFOに書き込みます。送信データと発生と書き込みは S22 で行います。





 パソコンで受信してVisual C#で表示した結果です。
 表示のラベルに、受信した 00 01 02 03 04 05 06 07 08 09 0A が表示されました。






 次のロジックスコープの波形は、FPGAのシーケンサでデータを発生させてFT2232Hに送る波形を示します。
 0_InClk60はFT2232Hからのクロックで、データはこのクロックに同期して送信します。
 6_FtTxE が「1」になることを検出して、8_HifOutData に送信データをセットして 7_FtWr を1にしてFT2232Hに送ります。
 送信データは、カウンタで作っているので 01から0aです。
 16_HifSeqCntr はFPGAのシーケンサのアドレスです。





●Visual C# で作ったプログラム

 Visual C# で作ったプログラムの一部を記録します。
 受信は下の方の FT_Read でしています。



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//??? using System.Threading.Thread; //???
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
[DllImport("kernel32.dll")]
extern static short QueryPerformanceCounter(ref long x);
[DllImport("kernel32.dll")]
extern static short QueryPerformanceFrequency(ref long x);


[DllImport("ftd2xx.dll")] // FT Open
unsafe private static extern uint FT_Open(Int16 DeviceNumber, uint* ftHandle);

[DllImport("ftd2xx.dll")] // FT Close
private static extern uint FT_Close(uint ftHandle);


[DllImport("ftd2xx.dll")] // FT_Write
unsafe private static extern uint FT_Write(uint ftHandle,
[MarshalAs(UnmanagedType.LPArray)] byte[] bdata,
uint BufferSize, uint* BytesWriten);

[DllImport("ftd2xx.dll")] // FT_Read
unsafe private static extern uint FT_Read(uint ftHandle,
[MarshalAs(UnmanagedType.LPArray)] byte[] bdata,
uint BufferSize, uint* BytesReturned);


[DllImport("ftd2xx.dll")] // FT_SetBitMode
private static extern uint FT_SetBitMode(uint ftHandle, Byte Mask, Byte Mode);

[DllImport("ftd2xx.dll")] // FT_GetBitMode
unsafe private static extern uint FT_GetBitMode(uint ftHandle,
[MarshalAs(UnmanagedType.LPArray)] byte[] bdata);

[DllImport("ftd2xx.dll")] // FT_SetBaudRate
private static extern uint FT_SetBaudRate(uint ftHandle, uint BaudRate);

[DllImport("ftd2xx.dll")] // FT_SetLatencyTimer
private static extern uint FT_SetLatencyTimer(uint ftHandle, Byte Timer);

[DllImport("ftd2xx.dll")] // FT_SetUSBParameters
private static extern uint FT_SetUSBParameters(uint ftHandle, uint InTransferSize, uint OutTransferSize);

[DllImport("ftd2xx.dll")] // FT_SetFlowControl
private static extern uint FT_SetFlowControl(uint ftHandle, ushort FlowControl, Byte Xon, Byte Xoff);

[DllImport("ftd2xx.dll")] // FT_Purge
private static extern uint FT_Purge(uint ftHandle, uint Mask);

public Form1()
{
InitializeComponent();
}

unsafe private void button1_Click(object sender, EventArgs e)
{
const uint FT_OK = 0;
uint ftHandle;
uint ftStatus;
uint writesize;
Byte Mask = 0xff;
Byte Mode;
Byte LatencyTimer = 16; //our default setting is 16

Byte data = 0x00;
Byte[] InOut_data = new Byte[30];
Byte[] In_data = new Byte[30];

Byte[] PhyInData = new Byte[100];
uint PhyInDataNum;


// FT2232を開く
ftStatus = FT_Open(0, &ftHandle);
if (ftStatus != FT_OK) {
return; // 通信開始失敗ならリターン
}
// FT2232をリセット
Mode = 0x00; //reset mode
ftStatus = FT_SetBitMode(ftHandle, 0, Mode);

System.Threading.Thread.Sleep(10); // 時間遅延:単位は1msec
// FT2232をSync FIFO modeに設定
Mode = 0x40; //Sync FIFO mode
ftStatus = FT_SetBitMode(ftHandle, 0, Mode);

if (ftStatus == FT_OK) {
ftStatus = FT_SetLatencyTimer(ftHandle, 2);
ftStatus = FT_SetUSBParameters(ftHandle,0x10000,0x10000);
ftStatus = FT_SetFlowControl(ftHandle, 0x0100, 0, 0);
ftStatus = FT_Purge(ftHandle, 3);
//access data from here

InOut_data[0] = 0x30;
InOut_data[1] = 0x31;
InOut_data[2] = 0x32;
InOut_data[3] = 0x33;
InOut_data[4] = 0x34;
InOut_data[5] = 0x35;
InOut_data[6] = 0x3A;
InOut_data[7] = 0x36;
InOut_data[8] = 0x37;
InOut_data[9] = 0x38;
InOut_data[10] = 0x39;
InOut_data[11] = 0x3A;

// ftStatus = FT_Write(ftHandle, InOut_data, 10, &writesize); // データ出力

System.Threading.Thread.Sleep(10); // 時間遅延:単位は1msec

textBox1.Text = "Kaisi";
label1.Text = "表示";

PhyInDataNum = 0;

for (int i = 0; i < 1; i++)
{
ftStatus = FT_Read(ftHandle, InOut_data, 11, &writesize); // USBデータ入力

for (int j = 0; j < 11; j++)
{
PhyInData[PhyInDataNum] = InOut_data[j];
PhyInDataNum++;

String s = String.Format("{0:X2} ", InOut_data[j]);
textBox1.Text = s;
label1.Text += s;
}
}

}
else {
// FT_SetBitMode FAILED!
return; // 通信開始失敗ならリターン
}
FT_Close(ftHandle);
}
}
}


ホームへ戻る