Top > libFTDI 広告
[[libFTDI:http://www.intra2net.com/de/produkte/opensource/ftdi/]]は[[Future Technology Devices International Ltd:http://www.ftdichip.com/]](FTDI)のUSB−シリアル(RS232C)+パラレル(8bit、D2XXと呼ばれている)変換チップである[[FT245系>FT245]](FT245AMやFT245RLなど)を扱うためのライブラリ。~ [[libFTDI:http://www.intra2net.com/de/produkte/opensource/ftdi/]]は[[Future Technology Devices International Ltd:http://www.ftdichip.com/]](FTDI)のUSB−シリアル(RS232C)+パラレル(8bit、D2XXと呼ばれている)変換チップである[[FT232系>FT232]]や[[FT245系>FT245]](FT245AMやFT245RLなど)を扱うためのライブラリ。~ オープンソースでさまざまなディストリビューションのパッケージになっているのでインストールしやすい。~ インストールのしやすさ、扱いやすさでFTDIの公式ライブラリより使いやすい。 インストールのしやすさ、扱いやすさでFTDIの公式ライブラリより使いやすい。ただ、公式ライブラリより遅いらしい 詳しくは[[ドキュメント:http://www.intra2net.com/de/produkte/opensource/ftdi/documentation/]]を参照のこと *自作したプログラムのコンパイル [#af264cba] プログラム名がhoge.cなら gcc -o hoge hoge.c -lftdi とやる。 **libftdiのbitbang.cの簡単な解説 [#j815c05f] libftdiのサンプルとして添付されている「bitbang.c」について。~ 「bitbang」は「bitを叩く」という意味なのか、つまりはパラレルポートのbit毎のON-OFFをするモード。 一番簡単に使えるモードだろう。~ このプログラムは、全1bitをON、OFFしたあと、1BitだけをOFFにして1bitずつシフトしていく。~ プログラムを見てもわかるように、PC側でON-OFFをしているためPCの処理の影響を受ける。~ なので、必ずしも思ったタイミングで動くわけではなく数msぐらいの誤差があるみたいだ。 #include <stdio.h> #include <unistd.h> //sleep, usleep用 #include <ftdi.h> //FTDIチップ用 int main(int argc, char **argv) { struct ftdi_context ftdic; //ftdi_contextの宣言 int f,i; char buf[1]; //入力用バッファ ftdi_init(&ftdic); //FTDIチップの初期化 f = ftdi_usb_open(&ftdic, 0x0403, 0x6001); //FTDIチップをオープン if(f < 0 && f != -5) { //エラーとトラップ。-5はftdi_sioが動いていた時のエラー fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic)) exit(-1); } printf("ftdi open succeeded: %d\n",f); printf("enabling bitbang mode\n"); ftdi_enable_bitbang(&ftdic, 0xFF); //すべてのビットをbitbangに設定 sleep(3); buf[0] = 0x0; printf("turning everything off\n"); f = ftdi_write_data(&ftdic, buf, 1); //00を書き込み。つまりすべてOFF if(f < 0) { fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",buf[0],f, ftdi_get_error_string(&ftdic)); } sleep(3); buf[0] = 0xFF; printf("turning everything on\n"); f = ftdi_write_data(&ftdic, buf, 1); //FFを書き込み。つまりすべてON if(f < 0) { fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",buf[0],f, ftdi_get_error_string(&ftdic)); } sleep(3); for(i = 0; i < 32; i++) { buf[0] = 0 | (0xFF ^ 1 << (i % 8)); if( i > 0 && (i % 8) == 0) { printf("\n"); } printf("%02hhx ",buf[0]); fflush(stdout); f = ftdi_write_data(&ftdic, buf, 1); if(f < 0) { fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",buf[0],f, ftdi_get_error_string(&ftdic)) } sleep(1); } printf("\n"); printf("disabling bitbang mode\n"); ftdi_disable_bitbang(&ftdic); //bitbangモードを終了 ftdi_usb_close(&ftdic); //デバイスを閉じる ftdi_deinit(&ftdic); } *簡単な関数リファレンス [#g2a31002] とりあえず「[[libftdiの関数:http://www.intra2net.com/en/developer/libftdi/documentation/group__libftdi.html]]」から良く使いそうなものだけ **struct ftdi_context ftdic; [#kadca2b8] FTDIコンテキスト(ftdic)へのポインタを設定 **ftdi_init(&ftdic); [#w627bcb9] FTDIコンテキスト(ftdic)を初期化 **ftdi_usb_open(&ftdic, vendor, product); [#e884d754] ベンダーID = vendor、プロダクトID = productでFTDIコンテキスト(ftdic)をオープン 戻り値 - 0: 問題なし - -1: usb_find_busses() が失敗 - -2: usb_find_devices() が失敗 - -3: USBデバイスが見つからない - -4: オープンできない - -5: 要求できない。ftdi_sioが動いていた時など - -6: リセットできなかった - -7: Baudrateが設定できなかった - -8: プロダクトの情報が得られなかった - -9: シリアルナンバーが得られなかった - -10: クローズできなかった **ftdi_enable_bitbang(&ftdic, bitmask); [#r7488d62] bitbangモードにする。bitmaskでIN/OUTの設定。~ -bitmask --0:IN、1:OUT --例えば0xFFならすべてOUT **ftdi_write_data(&ftdic, buf, size); [#c81add2a] データの出力 -buf:データ -size:送信するデータサイズ 戻り値 - -666: USBデバイスが使えない - <0: usb_bulk_write()からエラーが帰ってきた - >0: 問題なし **ftdi_read_data(&ftdic,buf,size); [#s9a592ef] データの受信 -buf:受信データを入れておく -size:受信するデータサイズ 戻り値 - -666: USBデバイスが使えない - <0: usb_bulk_read()からエラーが帰ってきた - 0: データが使えない - >0: 問題なし **ftdi_disable_bitbang(&ftdic); [#e424cd6c] bitbangモードを終了 **ftdi_usb_close(&ftdic); [#g0151d4a] デバイスを閉じる **ftdi_deinit(&ftdic); [#n24ccc5e] 初期化解除 広告 |