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

Visual C#とFT2232DとH8でLoopTest


 Visual C#とFT2232DとH8でLoopTestしました。

 FTDI社のFT2232Dは、FT2232Hのフルスピード版で、シリアルUART機能で一文字送信して、H8で折り返し、同期FIFO機能が無いのでFT245FIFO機能で10文字をPCに返送しました。
 FT2232Dは秋月電子のモジュールを、H8はトラ技2004年4月号付録のH8/3694をYellowSoft社のCコンパイラを使いました。

●Visual C#とFT2232DとH8でのLoopTestの構成と回路

 LoopTestの構成と構成写真と回路図を下記します。

 LoopTestの構成は、ホストのパソコンにFT2232D用ドライバ D2XX とVisual C#で作成したプログラムと通信ソフトTeraTerm を搭載します。
 FT2232Dは、チャンネルAをFT245FIFO機能に、チャンネルBをシリアルUART機能に設定しました。チャンネルAとチャンネルBの設定は、秋月電子のボードにEEPROM 93LC56 を実装してEEPROM書き込みソフト FT-Prog でしました。同時に、バスパワーの電流を500mAに設定しました。
 H8/3694は、トラ技2004年4月号付録のH8/3694をYellowSoft社のCコンパイラを使い、シリアルUART機能で一文字送信したらFT245FIFO機能に受信文字に連続した10文字を返送します。




 LoopTestの構成写真です。 実装してないICソケットは、FT245用でデバッグで使用しました。








●FT2232D の内部構造

  USB View と USBアナライザ でFT2232D の内部構造を調べた内容を示します。

 フルスピードバルク転送のエンドポイントを4つ使い2つのチャンネルに対応しています。又、バスパワーが500mAになっています。




 




●LoopTestの概要と結果

 上左は、 TeraTerm の画面で送信文字を入力します。
  上中央は、FT2232DとH8 の処理概要です。
  上右は、Visual C# で作った画面で、FT2232DのFT245FIFO機能からデータを受信して表示しました。
  下は、USBアナライザで捕らえた転送の状況です。OUT転送で文字’A’を送り、IN転送で10文字PCに返送しています。








●困ったこと

 LoopTestの途中で困ったことが起きました。
 
 H8のプログラムをそれなりにデバッグした後、FT2232DとH8 を接続して動作させると動きません。
  TeraTerm からFT2232Dのシリアル通信機能を経てデータをH8に送っても H8で検出出来ないのです。
 シンクロスコープでシリアル通信の信号を見ても、コード、タイミング、レベルは正常です。
 FT2232Dの代わりにパソコンのシリアルポートからレベル変換してH8に接続すると動きます。困りました。

 FT2232Dのシリアル通信機能からH8に何回も何回もデータを送っていると、数十回に一度程度検出してそうです。
 ナンやカンやとやっていると、時々検出するのが見えてきました。
 又、H8のシリアル通信機能の送信を起動していないのにH8のTxD から信号が出ています。

 信号やプログラムは調べ尽くした、残りはノイズしかないので特効薬の注入です。
 10uFと1uFのコンデンサーを+5V周辺に接続しました。

 結果は、良好です。正常に動作するようになりました。

 FT2232DもH8もモジュールなので安心していたのですが、対策は必要なのですね。

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


 Visual C# で作ったプログラムの一部を記録します。



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);


public Form1()
{
InitializeComponent();
}

unsafe private void button1_Click(object sender, EventArgs e)
{
const uint FT_OK = 0;
uint ftHandle;
uint ftStatus;
uint writesize;
Byte t;
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, Mask, Mode);

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

if (ftStatus == FT_OK)
{
ftStatus = FT_SetLatencyTimer(ftHandle, LatencyTimer);
ftStatus = FT_SetUSBParameters(ftHandle, 0x10000, 0x10000);
ftStatus = FT_SetFlowControl(ftHandle, 0x0100, 0, 0);
//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] = 0x36;
InOut_data[7] = 0x37;
InOut_data[8] = 0x38;
InOut_data[9] = 0x39;
InOut_data[10] = 0x3A;
InOut_data[11] = 0x3B;

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

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


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

PhyInDataNum = 0;

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

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

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

}
FT_Close(ftHandle);
}

}
}


ホームへ戻る