USB-046 (絶縁型USB Serial/MPSSE変換器)を使用したMPSSEの通信の例をお示しします。
USB-046に搭載されているFT2232HにはMPSSE(Multi-Protocol Synchronous Serial Engine)というモードが用意されています。このモードを使用することによりシリアル通信(I2C, SPI, JTAG等)をエミュレートし、通信することが可能です。
今回はシリアルEEPROM AT93C46 にSPI通信でアクセスする例をお示しします。
◆構成
USB-046のMPSSEポートをAT93C46に接続しています。ORG=GNDとし、データ長を8bitモードとしています。
◆通信仕様
メモリのアクセスタイミングは下図のようになっています。書き込みデータはSKの立ち上がりでラッチされ、出力データはSKの立下りで取り込みます。
◆MPSSEのつかいかた
MPSSEではコマンドとデータを同時に書き込むことで動作を指示します。
通常のモード(UARTなど)で0x86, 0x01, 0x00をFT_Write()すると、3Byteのシリアルデータが出力されますが、
MPSSEでは「コマンド - 引数」という順で解釈され、今回はクロック分周値を0x0001に変更するという指示になります。
buff[size++] = 0x86;
buff[size++] = 0x01;
buff[size++] = 0x00;
FT_Write(ftHandle, buff, size, &dwByteWritten);
同様に0x2C, 0x10, 0x00 は「16Byte分のデータを取得する」という動作指示になります。
コマンドの詳細などについてはFTDI社の資料をご参照ください。
- FTDI 社 Programming Guides (URL) - D2XX Programmer's Guide
◆MPSSEの通信設定
MPSSEモードに切り替えるにはFT_SetBitMode() を使用します。APIのみで移行できますので、EEPROMに特別な設定は必要ありません。
第3引数の0x02でMPSSEモードに切り替わります。第2引数は適当でかまいません。
FT_SetBitMode(ftHandle, (UCHAR)0x00, (UCHAR)0x02);
つぎにポートの初期設定を行います。この処理を行わないとデータの入出力コマンドが反映されませんのでご注意ください。
buff[size++] = 0x80; //SET DATA BITS LOW BYTE
buff[size++] = 0x00; //Value
buff[size++] = 0x0B; //Direction 1:OUT, 0:IN
FT_Write(ftHandle, buff, size, &dwByteWritten);
その他の必要な設定を行います。
buff[size++] = 0x85; // Disconnect TDI to TDO LoopBack
buff[size++] = 0x97; // Turn off Adaptive clocking
buff[size++] = 0x86; // Set TCK Divisor
buff[size++] = 0xA0;
buff[size++] = 0x00;
FT_Write(ftHandle, buff, size, &dwByteWritten);
◆データ書き込み
データを書き込む前にWeite Enable (EWEN) コマンドを発行しておく必要があります。
EWEN の波形は下記のようになります。
Start Bit (SB)から始め、OpCodeとして0b00を出力した後0b11 + 5bit dummy のアドレスを送信します。
この波形を出力するコマンドは下記のようになります。
// CS HIGH
buff[size++] = 0x80;
buff[size++] = 0x08; // Value
buff[size++] = 0x0B; // Direction
CSピンをHighに設定します。
// OpCode
buff[size++] = 0x13;
buff[size++] = 0x2;
buff[size++] = 0x80;
0x13はデータをSKの立ち上がりエッジでMSBから順に数bit出力するコマンドです。第1引数が出力するbit数(0x2 = 3bit), 第2引数がデータです。
つまり0x80のMSBから3bitを出力します。 [100]
// Addr
buff[size++] = 0x13;
buff[size++] = 0x6;
buff[size++] = 0xC0;
OpCodeと同様に0xC0のMSBから7bitを出力します。[1100000]
// CS LOW
buff[size++] = 0x80;
buff[size++] = 0; // Value
buff[size++] = 0x0B; // Direction
CSピンをLowに設定します。
FT_Write(ftHandle, buff, size, &dwByteWritten);
最後にコマンドをまとめて書き込みます。波形は下図のようになります。
(DOはHi-Z状態です)
つづけてデータの書き込みを行います。
Address = 0x1 に Data = 0xAA を書き込むには下記のコマンドとなります。 (CSの設定とFT_Write()は省略)
// OpCode
buff[size++] = 0x13;
buff[size++] = 0x2;
buff[size++] = 0xA0;
// Address
buff[size++] = 0x13;
buff[size++] = 0x6;
buff[size++] = 0x1 << 1;
MSBからの出力となるため1bit左シフトしています。
//Data
buff[size++] = 0x11;
buff[size++] = 0x00;
buff[size++] = 0x00;
buff[size++] = 0xAA;
0x11はデータをSKの立ち上がりエッジでMSBから順に出力するコマンドです。第1,2引数が出力するByte数(0x0000 = 1Byte), 第3引数以降にデータを設定します。
今回は1Byteのみの出力なので0xAAのみ設定しています。波形は下図のようになります。
◆データ読み込み
書き込みを行った Address = 0x1 からデータを読み取ってみます。コマンドは下記のようになります。
// Command
buff[size++] = 0x13;
buff[size++] = 0x2;
buff[size++] = 0xC0;
//Addr
buff[size++] = 0x13;
buff[size++] = 0x6;
buff[size++] = 0x01 << 1;
//Read
buff[size++] = 0x24;
buff[size++] = 0x00;
buff[size++] = 0x00;
0x24はデータをSKの立下りエッジでMSBから順に入力するコマンドです。第1,2引数が出力するByte数(0x0000 = 1Byte), 第3引数以降にデータを設定します。
Readコマンド後はFT_Read()によりデータを取り出します。
FT_GetStatus(ftHandle, &dwRxBytes, &dwTxBytes, &dwEventDWord);
if(dwRxBytes == 1){
if(FT_Read(ftHandle, buff, dwRxBytes, &dwByteRead) == FT_OK){
data = buff[0];
}
}
波形は下図のようになります。
◆サンプルアプリケーション
AT93C46の読み書きを行うサンプルアプリケーションです。
- Load : CSVファイルを読み込みWrite列に設定します
- Save : テーブルの内容をCSVファイルに保存します
- Write : Write列に数値が設定されている場合に指定のアドレスに書き込みを行います
- Read : メモリの全領域を読み出します。Write列にデータが設定されている場合比較結果をComp列に表示します
ダウンロードはこちらをクリックしてください。(バージョン:Ver.10)
デバイスドライバは製品資料のページよりダウンロードして頂けます。
プログラムソース(C++ Builder Project) はご希望の方に無償提供いたします。ソースリクエストページからご請求ください。
◆改訂履歴
・2018/03/13 : 作成
[kw] USB-046 FTDI MPSSE SPI TEC-FA
[]