USB-001-FIFO転送実験
弊社、CSP-018-20と接続してみました( D2XXドライバを用いた実験)

2002/3/2()

 FTDI社のFT8U245AMを使用したUSB-FIFO変換基板(USB-001-FIFO)と、FLEX10K学習用ボードCSP-018-20を接続し、転送実験をしてみました。
前回の仮想COMポートドライバ+通信ソフトでの実験の続報になります。
波形を示します。この波形は、FT8U245AMから、CSP-018-20上のFLEX10Kがデータを読み出している信号です。

クリックして拡大

読み出しサイクルは図のとおりです、この状態がベタでつづくならば、2MBytes/secということになりますが、それは瞬間風速ということになります。

実際には、上記のようにすきまがあります。約2/3の時間が使われているならば、2MBytes/sec * 2/3 = 1.3MBytes/secということになります。
(もっと長いスパンでみればもちろんこれも瞬間風速ということになりますが・・)
以下にテスト用のソースを示します。ソースがすべて正しいとは限らないかもしれません。
// usb001s1.cpp : USB-001-FIFOでDXXダイレクトドライバを用いて送信実験
//

#include "stdafx.h"

#include "Ftd2xx.h"     //FTDI社供給ヘッダファイル

/** USB-001操作関数 **/
int USB_001_opn( void ); /* 使用開始 */
int USB_001_setRTS( int dt ); /* RTS信号制御 1/0 */
int USB_001_setDTR( int dt ); /* DTR信号制御 1/0 */
int USB_001_readCTS( void ); /* CTS信号読み込み 1/0 */
int USB_001_readDSR( void ); /* DSR信号読み込み 1/0 */

int USB_001_send( char * text ); /* 送信 */
int USB_001_recv( char * res, DWORD * byte ); /* 受信 */

int USB_001_close( void );      /* 使用終了 */

FT_HANDLE USB_001_han;  /* D2XX操作用ハンドル変数 */


int USB_001_opn( void ) /* 使用開始 */
{
FT_STATUS st;

        st = FT_Open( 0, &USB_001_han );
        if( st == FT_OK ){
                return 1;
        }else{
                return 0;
        }
}

int USB_001_setRTS( int dt ) /* RTS信号制御 1/0 */
{
FT_STATUS st;

        if( dt == 0 ){
                st = FT_SetRts( USB_001_han );

        }else{
        st = FT_ClrRts( USB_001_han );
        }
        if( st == FT_OK ){
                return 1;
        }else{
                return 0;
        }
}

int USB_001_setDTR( int dt ) /* DTR信号制御 1/0 */
{
FT_STATUS st;

        if( dt == 0 ){
                st = FT_SetDtr( USB_001_han );

        }else{
                st = FT_ClrDtr( USB_001_han );
        }
        if( st == FT_OK ){
                return 1;
        }else{
                return 0;
        }
}

int USB_001_readCTS( void ) /* CTS信号読み込み 1/0 */
{
FT_STATUS st;
DWORD mstat;
        st = FT_GetModemStatus( USB_001_han, &mstat );
        if( mstat & 0x0000010 ){
                return 1;
        }else{
                return 0;
        }
}

int USB_001_readDSR( void ) /* DSR信号読み込み 1/0 */
{
FT_STATUS st;
DWORD mstat;
        st = FT_GetModemStatus( USB_001_han, &mstat );
        if( mstat & 0x0000020 ){
                return 1;
        }else{
                return 0;
        }
}

int USB_001_send( char * text ) /* 送信 */
{
FT_STATUS st;
DWORD sendn;    /* バッファサイズ */
DWORD donen;    /* 送信バイト数 */
int len;
char *pt;
        len = strlen( text );
        if( (pt = (char*)malloc( (size_t)len ) ) == NULL ){
                return 0;
        }
        memcpy( pt, text , len );
    sendn = strlen( text );
        donen = 0;
        st = FT_ResetDevice( USB_001_han );
        st = FT_Write( USB_001_han, pt, sendn, (LPDWORD)&donen );
        free( pt );
        if( st == FT_OK ){
                return 1;
        }else{
                return 0;
        }
}

int USB_001_close( void )       /* 使用終了 */
{

        return( FT_Close( USB_001_han ) );

}

void USB_test( void )   /* test */
{
char k;
int owari;
int dt;
int i;
int stat;
#define N600 4096
char sdata[N600] ;
        memset( sdata, 'a' , N600 );
        sdata[N600-1] = 0;

        owari = 0;
        while(owari == 0){
                if (USB_001_opn() /* 使用開始 */ != 1 ){
                        printf( "open error! \n " );
                        break;
                }
        
                dt = 1;
                for(i=0;i<1000;i++){
                        printf( "%05d ",i );
                        if( USB_001_send( sdata ) /* 送信 */ != 1 ){
                                printf( "!!! send error \n" );
                                owari = 1;
                                break;
                        }
                }
                owari = 1;
                USB_001_close();        /* 使用終了 */
        }
}

int main(int argc, char* argv[])
{
        printf("--Start--\n");

        USB_test();     /* test */

        printf("--End--\n");
        return 0;
}
メールでのご質問はこちらへどうぞ

HDLのホームページへ