LPCXpresso1549でのUSB Serial通信

USBをVirtual COM Portとして使用することで、PCへのDebug環境を構築することからはじめて、ハマる。

で、なんにも考えずに http://developer.mbed.org/handbook/Serial を、コンパイル。全く動かないw

「One of the Serial connections goes via the mbed USB port, allowing you to easily communicate with your host PC.」なんて書いてあるから、USBで適当に接続すれば動くもんだと思っていたが全くダメ。 ページには「The Serial Interface can be used on supported pins and USBTX/USBRX」と書いてあるのて、mbed-srcを見てみる。 1768などの場合、/targets/hal/TARGET_NXP/TARGET_LPC176X/TARGET_MBED_LPC1768/PinNames.hに USBTX = P0_2, USBRX = P0_3, と書いてある。 次、1549の場合、targets/hal/TARGET_NXP/TARGET_LPC15XX/PinNames.hには Serial to USB pins USBTX = P0_18, USBRX = P0_13, となっている。 ふむふむ、回路図を見てみよう。 って、全然Target USBと関係ないところに繋がってるじゃんか!なんだこれ?USBTXとUSBRXじゃなくて、それぞれISP_TXとISP_RXなんですけど?

ということで色々調べてみる。 そしたら、こんなもの発見 https://developer.mbed.org/questions/5304/LPC1549-USBSerial-is-not-working/ それによると、USBSerialというAPIを使って、Target側のUSBを使えると書いてある。 他にもUSBをキーボードやマウス、Audioを繋いだりできるみたい。 http://developer.mbed.org/handbook/USBSerial ここにあるサンプルを使用してみると、問題なく動く! なんじゃそれ?

ってことは、最初に使ったSerialのAPIとは一体なんなのか? 通常のピンをPCのSrialと繋いで、昔ながらのWiredなシリアル通信のためのもの? 確かにそのように設定しても使えるみたいだけど、1768とかは普通にUSBで接続してVirtualCOMPortとして使えている。 もうちょっと調べる。 すると https://developer.mbed.org/questions/4649/LPC1768/ の一番下に記載が。

Quote:

なるほど. TG-LPC11U35-501ではUSBコネクタはLPC11U35のUSBペリフェラル端子に繋がっており,それをシリアルとして使うためにUSBSerialクラスを使います.

mbed LPC1768ではバイナリ書き込み用のUSBは直接LPC1768には繋がっていません.このUSB端子は基板裏側の「インターフェースチップ」を介して,LPC1768のシリアル端子に接続されています. このインターフェースチップがUSB↔シリアル変換を行うのでLPC1768内部のUSB機能を使う必要がありません.

このようなわけでTG-LPC11U35-501ではUSBSerialクラスを,mbed LPC1768ではシリアルポートを使うためのSerialクラスを使うことになります.

LPC1768でUSBSerialクラスを使うと,USBペリフェラルはp31(D+)とp32(D-)だけに繋がっているため未接続で放置されると動作しないままになってしまうのでしょう.

もし同コードを両基板で使う場合には以下の様に宣言しておくと便利かも知れません.

  1. ifdef TARGET_LPC11U35_501 USBSerial serial;
  2. elif TARGET_MBED_LPC1768 Serial serial( USBTX, USBRX );     
  3. endif

はっ!?どういうこと?と思って、ピンから回路図を辿る。 Serial to USB pins USBTX = P0_18, USBRX = P0_13, なので、ISP_TX、ISP_RXだが、それがLPC-Link2側のLPC4332に入って行く。 本来mbedを接続してメモリーの様に振る舞っているのは、こっちのファームで対応しているが、その際実際にプログラミングする経路であるようだ。 で、1768と同じようにSerialをVirtualCOMPortへ変換してくれているのが、LPC4322ってことのよう。 ってことは、最初のコードは、Target側で無くてLINK-DFU側で動くってことか?

Linuxへ接続して出てくるログを見る

Feb 24 19:49:28 glh kernel: usb-storage 1-1.5:1.0: USB Mass Storage device detected Feb 24 19:49:28 glh kernel: scsi host12: usb-storage 1-1.5:1.0 Feb 24 19:49:28 glh kernel: cdc_acm 1-1.5:1.1: ttyACM0: USB ACM device

あれ、ホントだ。ストレージとして以外にttyでも認識される。 ということで、Serialのサンプルを動かしてみる。 !!!動くじゃない。

やっとわかったよ。


Please log in to post comments.