【MEMSマイクアレイ】FT232H用C++コード(1)

FPGA

コードの全体

コード全体は以下のようになります。

#include <windows.h>
#include <stdio.h> 
#include "ftd2xx.h" //ftd2xxドライバを使うためのヘッダファイル

// MEMSマイクを接続したFPGAからFT232Hを介してデータ転送(動作確認用)
int main(int argc, char* argv[])
{
// FT232Hを使う準備 ///////////////////////////////////////////////
	FT_HANDLE fthandle1;	// FT232Hデバイスのハンドル変数
	FT_STATUS status;		// ドライバ関数実行時のステータス変数
	// FT232H基板上のFT232HデバイスのIDを設定
	// 対応するデバイスに応じてコメントを外す
		//PVOID id = (PVOID)"FT63ZE1L"; // 田村のシステム
		//PVOID id = (PVOID)"FT6MVP8N"; // 工藤君のシステム
	PVOID id = (PVOID)"FT723GDQ"; // 田村のシステム 小林君用

	// デバイスをオープンしハンドルfthandle1を取得
	// ハンドルというのは,プログラム内でのデバイスのアドレスみたいなもの
	status = FT_OpenEx(id, FT_OPEN_BY_SERIAL_NUMBER, &fthandle1);
		// デバイス固有のIDを使わない場合は次のコマンドでOK
		//status = FT_Open(0, &fthandle1)	;// 変数fthandleにハンドルの値が入る 
		
	// ハンドル取得に失敗した場合は,プログラム終了  
		if (status != FT_OK)
		{
			printf("open device status not ok %d\n", status);
			return 0;
		}

	// readとwriteのタイムアウト時間をmsec単位で設定
		status = FT_SetTimeouts(fthandle1, 10000, 500);
		if (status != FT_OK)
			printf("timeout device status not ok %d\n", status);

	// デバイスのモードを設定(入力,Synchronous FIFOモード)
		UCHAR MaskA = 0x00; // Set data bus to inputs
		UCHAR modeA = 0x40; // Configure FT232H into 0x40 Sync FIFO Mode
		status = FT_SetBitMode(fthandle1, MaskA, modeA);
		if (status != FT_OK)
			printf("mode A status not ok %d\n", status);

		Sleep(500);  // 500msだけスリープ

// パラメータの設定 /////////////////////////////////////////////////////
	const int N_CH = 8;		// VHDLコードの「チャンネル数」
	const int N_BYTE = 1;	// VHDLコードの「チャンネル当たりのバイト数」
	DWORD RxBytes;// 読み出しバイト数を格納する変数
	DWORD TxBytes;// 書き込みバイト数を格納する変数
	DWORD EventDword;// FT232Hのイベントを表現する変数
	setvbuf(stdout, (char*)NULL, _IONBF, 0); //現在,未使用
	int num;	// 読み込むデータの総バイト数
	// 1回の読み込みの総バイト数をUSBパケットの最大に設定
	num = 1024*64; // USBパケットの最大長
	int loop_n = 4; // 繰り返し数,変更して総データ数を調節
	int nTime = num * loop_n/N_CH/N_BYTE;// 総時間サンプル数
	
	// 入力バッファ用配列を宣言
	UCHAR* data_in = new UCHAR[num]; // 1回の転送データ用の配列
	UCHAR* data_buf = new UCHAR[num*loop_n];// 全データ用の配列
	//getchar();

	// 受信および送信のFIFOバッファを空にする
	status = FT_Purge(fthandle1, FT_PURGE_RX | FT_PURGE_TX);
	if (status != FT_OK)
		printf("status not ok %d\n", status);

	// レイテンシタイマを設定 この値が適切かどうかは不明
	status = FT_SetLatencyTimer(fthandle1, 2);
	if (status != FT_OK)
		printf("status not ok %d\n", status);
		
	// USBパラメータのセット
	  // 転送サイズは64バイトの整数倍(64~64Kバイト)
	  status = FT_SetUSBParameters(fthandle1, 0x10000, 0x10000);
	  // 送受信とも最大値0x10000 = 2^16 = 65536(64K)に設定
		if (status != FT_OK)
			printf("status not ok %d\n", status);

		UCHAR* data_out = new UCHAR[nTime]; //波形の出力配列を確保
		int* bytes_read = new int[loop_n];// 読込バイト数の確認用
		DWORD data_read, r_data_len ;

//  ここからデータ読み込み ///////////////////////////////////////////////////////////
	// START用タクトスイッチを押せというプロンプトを表示しスイッチを押させる
	 printf("Please press the START button\n");
	 getchar(); //breakpoint ユーザはタクトスイッチを押し,リターンキーを押す

	for (int i = 0; i < loop_n; i++)
	{
		// FT232Hのステータスを取得
		 status = FT_GetStatus(fthandle1, &RxBytes, &TxBytes, &EventDword);
		// 読み込んだデータのバイト数がRxBytesに格納される
		
		memset(data_in, 0, num);
		r_data_len = RxBytes;
		// FT232Hから配列data_inにデータを読み込む 
		// data_readに実際に読み込まれたデータ数が格納される
		 status = FT_Read(fthandle1, data_in, r_data_len, &data_read);
		 if (status != FT_OK)
			 printf("status not ok %d\n", status);
		 else
		 {
			bytes_read[i] = data_read; // 確認用にバイト数を記録
			// データを配列data_bufに追加	
			int nbias = i * num; // 追加データの先頭インデックス
			for (int j = 0; j < num; j++)
			{
				data_buf[nbias + j] = data_in[j];
			}
		 } // end of else
	} // end of i-loop
	 // 経過を確認
	 for (int i = 0; i < loop_n; i++)
	 {
		printf("bytes read %d\n", bytes_read[i]);// 読み込んだデータ数
	 } 
	// デバイスを閉じる
	status = FT_Close(fthandle1);

// データの保存 /////////////////////////////////////////////////////
	// 特定のマイクからの信号を抽出
	int i_ch; // マイクのチャンネル番号
	int i_bit;// マイクのビット番号
	UCHAR mask;
	UCHAR mic_data;
	i_ch = 0;
	i_bit = 0;
	mask = 1 << i_bit; // 右からi_bit番目のみ1にしたビットマスク
	  // でもこのマスクは使っていない

	/*
	// フレームを検出 96以上の値を持つデータの1つ前がスタート
	i = 0;
	int iStart, iTime = 0;
	while (iTime < nTime) {
		//if (data_in[i] >= 96) {
			iStart = i - 1;
			mic_data = data_buf[iStart];
			//printf("%d,%d\n", iStart, mic_data);
			// mic_dataのi_bit番目のビットを取り出す
			data_out[iTime] =  (mic_data >> i_bit) & 1;
			iTime += 1;
		//} 
		i += 1;
	}
	*/
	// 配列data_outに指定されたマイクの波形データを書き込む
	for (int i = 0; i < nTime; i++)
	{
		// iサンプル目のデータの先頭インデックスはN_CH * N_BYTE * i
		// そこからi_chバイト目が目的のチャンネル
		mic_data = data_buf[N_CH * N_BYTE * i + i_ch];
		data_out[i] = (mic_data >> i_bit) & 1; // 右からi_bit目
	}

	FILE* outputfile;

	if (fopen_s(&outputfile, "data.txt", "w") != 0)
	{
		printf("ファイルを開けませんでした");
	}

	for (int i = 0; i < nTime; i++)
	{
		//fprintf(outputfile, "%d : %d\n", i, data_out[i]);
		fprintf(outputfile, "%d\n", data_out[i]);
	}

	fclose(outputfile);

	//確認用 全受信データを保存
	FILE* file;

	if (fopen_s(&file, "Mic.txt", "w") != 0)
	{
		printf("ファイルを開けませんでした");
	}

	for (int i = 0; i < num*loop_n; i++)
	{
		//fprintf(file, "%d :%d : %d\n",i,i%8, data_in[i]);
		fprintf(file, "%d\n", data_buf[i]);
	}

	fclose(file);

	//追加部分
	delete[] data_in;
	delete[] data_out;

	return 0;

}


コメント