なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

MacOSXでFTDIのBit-Bangモードを試す(2)

Posted by arms22 on 2008年05月19日 0  0

今回は FT232R, FT245R, FT2232C デバイスのみ使える Synchronous Bit Bang Mode を試す。

Synchronous Bit Bang Modeは書き込みの前に読み込みが行われるMode。1byte書き込むと、1byte読み込まれる。16byte読み込みたければ、16byteの書き込みを行う。
ポートの初期値が0xffの時、0x55, 0xaaの2byteをWriteすると、ポートの出力は次のように変化する。

0xff 0x55 0xaa
2byteのWriteに続けて2byteのReadを行うと次の値が読み込まれる。
0xff,0x55
0x55のWriteに対して0xffが読み込まれ、0xaaのWriteに対して0x55が読み込まれる。

次の図はSynchronous Bit Bang ModeのR/Wのタイミングと波形。
sync_bit_bang_3.png


ループバックテスト
次のようにD0-D3端子をD4-D7端子に接続し、簡単なループバックテストを行った。
D0端子-->D4端子
D1端子-->D5端子
D2端子-->D6端子
D3端子-->D7端子
D0からD3端子を出力に設定。D4からD7端子を入力に設定。0x0から0xfの16byteの値をWrite。16byteのReadを行った結果は次のとおり。
rx[0] ff
rx[1] 00
rx[2] 11
rx[3] 22
rx[4] 33
rx[5] 44
rx[6] 55
rx[7] 66
rx[8] 77
rx[9] 88
rx[a] 99
rx[b] aa
rx[c] bb
rx[d] cc
rx[e] dd
rx[f] ee

気をつけないといけない点は、
  • Writeの前にReadされる
  • 1byte目のReadの結果は最後にWriteした時の値
  • 16byte目のWriteに対する値が欲しい場合、17byte Writeして16byte目のReadの結果を使う

サンプルコードは続きを読むで。

FT232RBitBangModes.pdf
http://www.ftdichip.com/Documents/AppNotes/AN232R-01_FT232RBitBangModes.pdf
FTDI Application Notes
http://www.ftdichip.com/Documents/AppNotes.htm

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include "ftd2xx.h"

// Globals
FT_HANDLE ftHandle = NULL;

void quit()
{
if(ftHandle != NULL) {
FT_Close(ftHandle);
ftHandle = NULL;
printf("Closed device¥n");
}

exit(1);
}

int main(int argc, char *argv[])
{
DWORD dwBytesInQueue;
FT_STATUS ftStatus;

signal(SIGINT, quit); // trap ctrl-c call quit fn

ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK) {
/*
This can fail if the ftdi_sio driver is loaded
use lsmod to check this and rmmod ftdi_sio to remove
also rmmod usbserial
*/
printf("FT_Open failed = %d¥n", ftStatus);
if(ftStatus == FT_DEVICE_NOT_FOUND)
printf("ftdi device not found¥n");
else if(ftStatus == FT_DEVICE_NOT_OPENED)
printf("ftdi device not opend¥n"
"unload ftdi_sio¥n"
"linux) rmmod ftdi_sio¥n"
"osx) sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext¥n");
return 1;
}

ftStatus = FT_SetBitMode(ftHandle, 0x0f, 0x04); // D0-D3 output,D4-D7 input
if(ftStatus != FT_OK) {
printf("Failed to set bit mode¥n");
}

ftStatus = FT_SetBaudRate(ftHandle, 9600);
if(ftStatus != FT_OK) {
fprintf(stderr,"FT_SetBaudRate failed = %d¥n");
return 1;
}

ftStatus = FT_Purge(ftHandle,FT_PURGE_RX|FT_PURGE_TX);
if(ftStatus != FT_OK) {
fprintf(stderr,"FT_Purge failed = %d¥n");
return 1;
}

unsigned char tbuf[16];
unsigned char rbuf[16];

int i;
for(i=0;i<16;i++){
tbuf[i]=i;
}

FT_Write(ftHandle, tbuf, sizeof(tbuf), &dwBytesInQueue);
FT_Read(ftHandle, rbuf, sizeof(rbuf), &dwBytesInQueue);

for(i=0;i<16;i++){
printf("rx[%x] %02x¥n",i,rbuf[i]);
}

if(ftHandle != NULL) {
FT_Close(ftHandle);
ftHandle = NULL;
}

return 0;
}

Ads by Google

Leave a reply






管理者にだけ表示を許可する

該当の記事は見つかりませんでした。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。