- 締切済み
FTDIのFT2232Dでのハンドシェイク通信について
FTDIのFT2232Dでのハンドシェイク通信について FTDIのFT2232とCPLDを接続してROMライターを作ろうとしています。 CPLDとの接続にパラレルのハンドシェイクで通信させたいと思っています。 (できれば、FT245を使う可能性もあるのでMPSSEモードは使いたくないんです) PC側のアプリはD2XXの.netラッパーをかませています。(ラッパーはFTDI純正で、言語はC#で書いています) FTDI device = new FTDI(); FTDI.FT_STATUS ftStatus = FTDI.FT_STATUS.FT_OK; インスタンスを作って、 ftStatus = device.OpenByIndex(0); if (ftStatus != FTDI.FT_STATUS.FT_OK) { MessageBox.Show("Error"); } ftStatus = device.SetBitMode(0xFF, 0x00); if (ftStatus != FTDI.FT_STATUS.FT_OK) { MessageBox.Show("Error"); } ftStatus = device.SetBaudRate(9600); if (ftStatus != FTDI.FT_STATUS.FT_OK) { MessageBox.Show("Error"); } SetBItModeで第2引数で0x00を与えてハンドシェイクモードにしています。 byte[] data = new byte[1]; data[0] = 0x0A; uint rcount = 0; ftStatus = device.Write(data, 1, ref rcount); if (ftStatus == FTDI.FT_STATUS.FT_OK) { MessageBox.Show(rcount.ToString()); uint buffcount = 0; ftStatus = device.GetTxBytesWaiting(ref buffcount); if (ftStatus == FTDI.FT_STATUS.FT_OK) { MessageBox.Show(buffcount.ToString()); } else { MessageBox.Show("Buff Count Error"); } } else { MessageBox.Show("Error Write"); } FTDIチップのFIFOへの書き込みですが、このようにしています。 本来、書き込みが正常に完了したら、buffcountが増えていてほしいのですが、 0のままで、チップにLEDを付けて動作を見ていると、PC側アプリでWriteしてから、 すぐにチップが出力しているようでした。 ハンドシェイクにしているので、制御ピンをいじるまでFIFOにとどまっているはずですが、 困ったものです。何かおかしい点ありましたら指摘していただけないでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- uruz
- ベストアンサー率49% (417/840)
>やはりFIFOにのこらず 残らないという判断はどこでされているのでしょうか FTD2XX_NETのドキュメントが見つけられなかったので確認出来てませんが GetTxBytesWaiting() はFIFO内のデータ数を返す関数なのでしょうか?ドライバー内に残ってるデータ数のような気もするのですが・・・・ FTD2XX_NETに FT_GetStatus() に相当する関数はありませんか FT_GetStatus() もどこのデータ数なのかよく解らないのですが RD#、WR の信号レベルは適切ですか >チップにLEDを付けて動作を見ていると どこにLEDを付けているのでしょうか、RXF#に付けているならRXF#は読み出し可能なデータが存在することを示す信号ですのでPC側アプリでWrite時点で点灯するのは正常です
- uruz
- ベストアンサー率49% (417/840)
またまた失礼しました、質問を読み返して気付いたのですが >パラレルのハンドシェイクで通信させたいと思っています。 FT2232DをFT245モードで動かそうとしているのでしょうか? FT2232DをFT245モードで動かすためにはEEPROMを実装しEEPROMに動作モード書き込んでおく必要があるようです EEPROMが未実装の場合SetBitMode()で0x00だとUART(FT232相当)で動作します 参考にされているページはFT245ですのでSetBitMode()で0x00でいいのですがFT2232Dの場合はEEPROMで設定していなければUARTモードになります EEPROMが実装済みであれば下記URLより「MProg 3.5 - EEPROM Programming Utility」を入手して書き込んでください http://www.ftdichip.com/Resources/Utilities.htm
補足
ご回答どうもありがとうございます。 FT245を友人から借りて、実験してみました。 しかしSetBitMode()の第2引数で0x00を送ってもやはりFIFOにのこらず すぐに出力されているようです。
- uruz
- ベストアンサー率49% (417/840)
失礼しました FT_SetBitmode()はPC-FTxxxx間(USB)の通信でBit BangモードはI/Oとして使う時の設定なので関係ないですね RS-232C側のフロー制御はFT_SetFlowControl()ですのでD2XXの.netラッパーで確答する関数を探してください FT_SetFlowControl (FT_HANDLE ftHandle, USHORT usFlowControl,UCHAR uXon, UCHAR uXoff) ●ftHandle:Handle of the device. ●usFlowControl:Must beone one of FT_FLOW_NONE FT_FLOW_RTS_CTS FT_FLOW_DTR_DSR FT_FLOW_XON_XOFF ●uXon: Character used to signal Xon. Only used if flow control is FT_FLOW_XON_XOFF. ●uXoff: Character used to signal Xoff. Only used if flow control is FT_FLOW_XON_XOFF. --------------------------------------- サンプルコード FT_HANDLE ftHandle; FT_STATUS ftStatus; ftStatus = FT_Open(0, &ftHandle); if(ftStatus != FT_OK) { // FT_Open failed return; } // Set RTS/CTS flow control ftStatus = FT_SetFlowControl(ftHandle, FT_FLOW_RTS_CTS, 0x11, 0x13); if (ftStatus == FT_OK) { // FT_SetFlowControl OK } else { // FT_SetFlowControl Failed } } FT_Close(ftHandle);
- uruz
- ベストアンサー率49% (417/840)
>SetBItModeで第2引数で0x00を与えてハンドシェイクモードにしています。 D2XXの.netラッパーの定義までは確認していませんが 「D2XX_Programmer's_Guide」で FT_SetBitmode((FT_HANDLE ftHandle, UCHAR ucMask, UCHAR ucMode) のucModeは以下のようになってますので 0x0 = Reset 0x1 = Asynchronous Bit Bang 0x2 = MPSSE (FT4232H, FT2232H and FT2232 devices only) 0x4 = Synchronous Bit Bang (FT4232H, FT2232H, FT232R, FT245R and FT2232 devices only) ハンドシェイクモードなら"0x4"ではないでしょうか?
補足
0x4で実験してみましたが、0x00のときと同じでした。 たしか、Synchronous Bit BangとAsynchronous Bit Bangの違いは、 ハンドシェイクを行うか行わないかではなく、出力するタイミングのときに現在チップ に入力されているデータを取り込むか取り込まないかということだったと思います。 ハンドシェイクは0x00というのは、 http://ioio.at.infoseek.co.jp/FT245RL/FT245DllHowTo.html ここで読みました。
補足
LEDはDB0~3と、¥RXFにつけています。 先ほど確認したところ、正常にハンドシェイクされていました。 秋月のFT245モジュールを使っているのですが、ブレッドボード の刺す位置が1つずれていたという初歩的なミスでした。お手数掛けました。 私も、FTD2XX_NETの資料が見当たらずに困っています。 FT_GetStatus()相当の関数が見当たりません。 バッファに関係ありそうなのがGetTxBytesWaiting()くらいしか見当たりませんでした。 ハンドシェイクはできるようにはりましたが、FIFOのバッファリング数の取得は .NETラッパーでは不可能なのでしょうか?