苦労したので共有します。
目的
boardrateに12000000を設定して、12MBit/s(約1MByte/s)の通信を行います。手順
最も重要なのは、version1.0以上(自分は1.3を使用)のlibftdiを使うことです。libusb ver1以上のインストール
ubuntuは14.04も16.04もapt-getではver1をインストールできません。そのため、下記のファイルに従ってインストールを行います。
README.build
上記ファイルの内容を、備忘録も兼ねて展開します。
buildに使うツールをインストールします。
sudo apt-get install build-essential sudo apt-get install git-core sudo apt-get install cmake
libftdiの動作に必要な関連プロジェクトをインストールします。
sudo apt-get install libconfuse-dev sudo apt-get install swig python-dev sudo apt-get install libboost-all-dev
libftdiのコードを取得します。
mkdir ~/gitprojects cd ~/gitprojects git clone git://developer.intra2net.com/libftdi
buildとinstallを行います。
cd ~/gitprojests/libftdi mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX="/usr" ../ make sudo make install
動作確認します。
cd ~/gitprojects/libftdi/build/examples ./find_all_pp
ftdiのチップが付いている機器がPCに接続されていたら、認識されるはずです。
asuki@asuki-ThinkPad-S1-Yoga:~/gitprojects/libftdi/build/examples$ ./find_all_pp Found devices ( VID: 0x403, PID: 0x6010 ) ------------------------------------------------ FTDI (0x1c918a0): , , (Open FAILED)
libftdiのインストールできたので、次はプログラムを作ります。
プログラムの作成
このプログラムは下記の目的で作成しています。通信相手: FT2232HLのBポートに接続された機器
通信速度: 12Mbit/s
通信相手の動作: 送信したデータを返信する
serial_with_libftdi.cpp
#include <libftdi1/ftdi.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define TARGET_BAUDRATE 12000000 // 12Mbit/s
#define TARGET_VENDOR_ID 1027
#define TARGET_PRODUCT_ID 24592
#define TARGET_INTERFACE INTERFACE_B
int main(void) {
struct ftdi_context* ftdic;
int result;
// open ftdi a device
ftdic = ftdi_new();
ftdi_set_interface(ftdic, TARGET_INTERFACE);
result = ftdi_usb_open(ftdic, TARGET_VENDOR_ID, TARGET_PRODUCT_ID);
if ( result < 0 && result != -5 ) {
fprintf(stderr, "unable to open ftdi device: %d (%s)\n", result, ftdi_get_error_string(ftdic));
exit(-1);
}
result = ftdi_set_baudrate(ftdic, TARGET_BAUDRATE);
if ( result != 0 ) {
fprintf(stderr, "failed to set baudrate: %d (%s)\n", result, ftdi_get_error_string(ftdic));
exit(-1);
}
printf("baudrate: %d\n", ftdic->baudrate);
const char* command_chars = "abcd";
unsigned char sending_data[1];
unsigned char received_data[255];
int received_data_length = 0;
for ( int i=0; i<4 ) {
// data send
sending_data[0] = command_chars[i];
ftdi_write_data(ftdic, sending_data, 1);
printf("Send: %c\n", sending_data[0]);
// data receive
received_data_length = ftdi_read_data(ftdic, received_data, 254);
received_data[received_data_length] = 0;
printf("Received: %s\n", received_data);
sleep(1);
}
ftdi_usb_close(ftdic);
ftdi_free(ftdic);
return 0;
}
ファイルの内容は変わるかもしれませんが、上記のファイルはgitで下記のurlにて管理しています。
https://github.com/asukiaaa/miniSpartan6-plus_usb_communication/blob/master/cpp/src/serial_with_libftdi.cpp
コンパイル
下記のようにlibftdi1のフラグ「`pkg-config --cflags --libs libftdi1`」を付けてコンパイルします。g++ serial_with_libftdi.cpp -o serial_with_libftdi `pkg-config --cflags --libs libftdi1`
実行
ftdiのデバイスをPCに接続し、プログラムを実行します。sudo ./serial_with_libftdi
うまくいけば通信できるはずです。
通信相手のFPGAのコードも含めて、ソースコードは下記のリポジトリで管理しています。
https://github.com/asukiaaa/miniSpartan6-plus_usb_communication
以上です。
何かのお役に立てば嬉しいです。
参考
http://penguin.tantin.jp/hard/libFTDI.htmlhttps://www.intra2net.com/en/developer/libftdi/documentation/
https://github.com/legege/libftdi/blob/master/test/baudrate.cpp
https://github.com/legege/libftdi/blob/master/src/ftdi.h

0 件のコメント :
コメントを投稿