« ルネサスE1エミュレータを使ってみた | トップページ | RXduino環境でのUSBの使い方 »

2012.01.27

RXマイコンでのUSB(ライブラリ)の使い方

RaXino♪や、究極のRX62NボードRX-MEGAで使われる特電ライブラリでのUSBの使い方をまとめておきます。あと、特電のボードだけではなく、Interface誌の付録基板でも使えます。

Raxino_usb

特電のライブラリには「RXduino」というC++でArduino互換のものと、「特電HAL」というC言語のライブラリがあります。これらのライブラリでUSBを使う方法を説明します。(特電HALとRXduinoのコアは一緒で、RXduinoは特電HALを呼び出しているにすぎません。)

これらのライブラリにはUSBファンクションで実現したCDC(いわゆるUSB-UARTのこと)が組み込まれているので、RXマイコンとホストPCをつないで、TeraTermなどを通じて簡単に通信できるようになります。

まず、特電HALのほうから説明します。
このライブラリはUSBは仮想UARTを実現しているので、COMポートをオープンする要領でUSBが使えるようになります。

USBを使えるようにするには、プログラム中で、


sci_init(SCI_USB0,38400);

というコードを実行します。
※38400は速度ですが、USBの場合は何を設定しても構いません。実際には毎秒数百キロバイトでます。

ここで


sci_init(SCI_SCI0P2x,38400);

にすると、RXマイコンのSCI0のTxD,RxDを使って、レガシーなUARTを通じて通信が行われます。SCI0P2xというのは、RXマイコンのSCI0はP20,P21番端子と共有されているのでこのような命名をしました。

つまり、RXマイコンからみて、USB仮想COMポートでも、SCIを使ったレガシーなUARTでも、プログラム上は同じコードが使われます。


sci_init(SCI_AUTO,38400);

とすると、システムの起動時にUSBとSCI0とSCI1のうち、一番先に何らかのデータを送ってきたCOMポートが開かれるようになります。

ポートがオープンされると、TeraTermなどから開けるようになります。
Rx_usb

これでUSBを使う準備ができました。

ところで、組み込みマイコンの中で動くC言語での改行コードと、Windows上でTeraTermなどを使って通信する際の改行コードは異なります。これが異なると改行が反映されなかったり、2回改行されたりします。
そこで、


sci_convert_crlf(CRLF_CRLF,CRLF_CRLF); // \nを\r\nに変換

とやって、ライブラリの中で改行コードを自動的に変換できるようにします。

あとは、RXのプログラムの中からホストPCに文字列を送信したいならば、


sci_puts("hogehoge");

とやります。
ホストPCからRXマイコンに文字を送ったら、マイコンの内蔵RAMの中のバッファに格納されます。そのたまったデータ量(バイト数)を調べるには、

sci_rxcount()

関数を呼び出します。この関数が0でない値を返したならば、何か受信データがあります。
その場合は、

 char c = sci_getc(); // 1文字受信

とやって、1文字受信します。

USBまたはSCIのポートを開いて、エコーバックするプログラムの例を次に示します。


sci_init(SCI_AUTO,38400); // 自動的にCOMポートを判別してオープンする
sci_convert_crlf(CRLF_CRLF,CRLF_CRLF); // \nを\r\nに変換
sci_puts("Hello I'm RX62N\n");
while(1) {
if(sci_rxcount()) { // 何か受信した文字があるか調べる
char c = sci_getc(); // 1文字受信
sci_putc(c); // エコーバック
}
}

こんな簡単なコードで、RXマイコンとホストPCとの間で通信ができるようになります。

手軽に試してみたい場合は、Webコンパイラを使ってみてください。

http://www.tokudenkairo.co.jp/rxmega/webcomp/

上のURLからWebコンパイラを開いて、「シリアル通信(HAL版)」のサンプルコードをクリックし、「コンパイル実行」ボタンを押してみてください。ターゲットボードを「RX-MEGA」にしておけば、Interface誌付録の基板単体でも動きますので、すぐに試せます。

Frk_rx_usb

MOTファイルが生成されてサーバから送られてくるので、これをRXマイコンに書き込めば、すぐにUSB通信のプログラムが試せます。
Frk_rx_usb_teraterm

Webコンパイラは、シリアル番号の入力などは必要ないので、気軽に試してみてください。

http://www.tokudenkairo.co.jp/rxmega/webcomp/

|

« ルネサスE1エミュレータを使ってみた | トップページ | RXduino環境でのUSBの使い方 »

コメント

お世話になります。先日Raxino基板を購入しました。
上記のプログラムをwebコンパイラでコンパイルした後、FDTで書き込んでも動作しませんでした。(TeraTermで開いても仮想comポートが見えません)GPIOのサンプルも同様にダウンロード・書き込みを行いましたがLEDが点滅しません。(ターゲットボードはRaxinoを選択しています)
rxprogwinを使用して書きこもうとしましたが、こちらは「LIBUSB0.DLLがないため、プログラムを開始できません」と言われて起動しないため諦めました。
FDTからはデバイスが見えるので故障ではないと思いますが、チェックポイントについてご教示願えないでしょうか。ジャンパはデフォルトのままです。
使用PCはwindows7(64ビット版)です。
よろしくお願いします。

投稿: きくや | 2012.01.29 11:23

きくやさん

RaXinoをご利用いただきまして誠にありがとうございます。
Windows7の64bit版では、「署名」がないカーネルモードのプログラムを動かすことができなくなってしまいました。
RaXinoの仮想COMポートドライバは署名を取得していないため、ドライバを動かすことができないためです。

この問題を回避するには、Windowsの起動時にF8を押して、「ドライバ署名の強制を無効にする」のオプションを付けて起動してください。

ご面倒をおかけしますがよろしくお願いします。

投稿: なひたふ | 2012.01.29 12:11

なひたふ様
素早いご回答ありがとうございました。
こちらからの結果報告は遅れてしまいました。
署名回避をして見ましたが、読み込むことはできませんでした。(エラーメッセージも同じ)
トラ技付録78k基板の時は署名エラーが出るのでF8で回避していましたが、メッセージの内容が異なります。
WinXP機でやってみたところ、comポートが認識され、動作確認が出来ました。
そのかわり、XP機ではFDTおよびrxprogで書きこむことが出来ませんでした(FDTからデバイスが認識されません)こちらの問題は、FDTに問題がありそうなので、折を見て色々試してみます。
とりあえずハードには問題ないことが確認できました。ありがとうございました。

投稿: きくや | 2012.01.30 07:46

コメントを書く



(ウェブ上には掲載しません)




« ルネサスE1エミュレータを使ってみた | トップページ | RXduino環境でのUSBの使い方 »