エンジニア風味 (Engineer-taste)

電子系エンジニアのメモ帳

MATLABでFTDIのBitBangを行なう

MathworksのFileExchangeにサンプルプログラムが投稿されています。
jp.mathworks.com

基本構成はVC++などのサンプルプログラムと一緒で、DLLを指定し、

f = NET.addAssembly('C:\FTD2XX_NET.dll');

FTDIをオープンし、

fo=FTD2XX_NET.FTDI;
pause( 1);%準備ができるのを待つ
r = OpenByIndex(fo,0);

もろもろの設定をし、

x = uint8([0,0,0]);%FTDIからポートに出力する値を入れる場所を用意

allBitsOutputMask = uint8(255); % 8ビット全てを出力に使う
bitBangMode = uint8(1); %1は非同期BitBangモード
resetMode = uint8(0);  % リセットは0

SetBaudRate(fo,115200);%ボーレート(転送レート)設定

r = SetBitMode( fo, allBitsOutputMask, bitBangMode);%モード設定

書き出しをします。

for n=0:255
    x(1) =uint8(n);%符号なし8ビットにする
    r = Write( fo, x, 1, 0);%書き出す
end

r = Close(fo);%ポートを閉じます

となるわけですが、上記のやり方だとデータを1つずつ送ることになり、転送速度がとても遅いです。
実測したところでは、1000個/秒くらいでしょうか。
(8bitデータが1秒間に1000個という意味)。

転送速度を上げるには、データを配列で渡してあげる必要があります。

Xdata=0:255;%データは256ケだとする
datanum=uint32(256);%転送したいデータ数
datadum=uint32(0);%転送できたデータ数

%%%途中を省略します。

%送るデータのフォーマットに合わせる
TXdata=NET.convertArray(Xdata,'System.Byte');

%PCからFTDIから送る
[r,dnum] = Write(fo,TXdata,datanum,datadum);

%%%以下、省略

となります。全部書くと、以下のとおりです。

Xdata=0:255;%データは256ケだとする
datanum=256;
datanum=uint32(datanum);
datadum=uint32(0);

%dllが置いてある場所を指定
f = NET.addAssembly('C:\FTD2XX_NET.dll');

fo=FTD2XX_NET.FTDI;

FT_OK = FTD2XX_NET.FT_STATUS.FT_OK;

pause( 1);

r = OpenByIndex(fo,0);
if( r ~= FT_OK)
    disp(r);
    pause(1);
    return; 
end

pause( 1);

allBitsOutputMask = uint8(255); % '1' bit is output
bitBangMode = uint8(1); % '1' mode is async bitbang
resetMode = uint8(0);  % terminate bitbang

SetBaudRate(fo,115200);

r = SetBitMode( fo, allBitsOutputMask, bitBangMode);

%送るデータのフォーマットに合わせる
TXdata=NET.convertArray(Xdata,'System.Byte');

%PCからFTDIから送る
[r,dnum] = Write(fo,TXdata,datanum,datadum);
    

r = Close(fo);

転送速度は1Mくらいに向上するようです。1000倍ですね。