RXマイコンでのUSB(ライブラリ)の使い方
RaXino♪や、究極のRX62Nボード、RX-MEGAで使われる特電ライブラリでのUSBの使い方をまとめておきます。あと、特電のボードだけではなく、Interface誌の付録基板でも使えます。
特電のライブラリには「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などから開けるようになります。

これで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誌付録の基板単体でも動きますので、すぐに試せます。
MOTファイルが生成されてサーバから送られてくるので、これをRXマイコンに書き込めば、すぐにUSB通信のプログラムが試せます。

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




コメント
お世話になります。先日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