LPC1343 USBのソフトウェアコネクト (USB_CONNECT)
USBのH/W的な接続と、コンフィグレーションについて
ちょっと調べてみました。
これだけだと、PCにUSBを認識させるためのシーケンスが存在しました。
USB認識
OK : LPC1343の電源投入→USBケーブル挿入
NG : USBケーブルを挿入→LPC1343電源投入
一度認識は成功した後、USBケーブル挿入状態でLPC1343リセット(RST端子)
USBケーブルを挿したままだと
プログラムを書き換えたりしてLPC1343をリセットすると認識が切れてしまいます。
再度認識させるにはUSBケーブルを抜き差ししなければならず
結構めんどくさかったので対策のために調べてみました。
1.USBの認識のしくみ
どのようにUSBが認識されるのかはPICマイコンで有名な電子工作の実験室に
わかりやすく詳細な説明がありました。
(リンク:USBのプラグ&プレイとDescriptorの部分)
大まかに書くとこんな感じです。
PCサイドの動き
1)USBのプルアップを検出
2)100msウェイト
3)Reset 10ms(DPをLowにする)
4)コンフィグレーション動作
LPC1343の動き
PCサイドの4)までにMCU内部のリセット動作を終えて、
コンフィグレーションの指示を受けられるようにしておく。
これを見て認識がNGになる理由がわかりました。
USB認識 NG条件1 :USBケーブルを挿入→LPC1343電源投入
理由: LPC1343の電源が立ち上がる前にPCサイドは4)の状態になっている。
=3)のReset 10msをMCUが受けられずにNGとなる。
USB認識 NG条件2 :一度認識は成功した後、USBケーブル挿入状態でLPC1343リセット(RST端子)
理由:PCサイドはUSBのプルアップを検出して認識動作を開始する。
LPC1343をリセット(RST端子)する際に既に4)が完了しているので
そもそも認識動作を行わない。
また、LPC1343からみても10msのリセット期間がないために
MCU内部リセットが出来ない。
(実際 DPをPull upしたままだと、MCU動作はループに入っていることを確認した)
というわけで、LPCの電源が投入時やリセット時にはDPのプルアップを一度無効にするような
制御をすればよいだろうということがわかりました。
2.USB_CONNECT回路
DPのプルアップ制御については
USB接続部分のH/Wを修正すれば出来ます。
コードに関してはサンプルコード内に制御の記載が既に入っていますので
そのまま使えばよいようです。
(参考:以前のエントリ LPC1343 USB Virtual COM (USBシリアル変換 : Example pjt使用)
回路構成は
LPCのマニュアルに載っております。(最初は意味がわからなかったので無視していました)
USB_CONNECT端子でスイッチを制御してプルアップ状態にしたりしなかったりできます。
(LOWでプルアップ有効)
ここで、VBUSはUSBの5Vをぶち込みます。
そしてこれも必要です。
VBUSはUSBの5V電圧のレベルをチェックしていて、低くなるとUSB_CONNECTをHighにします。
(プルアップ無効)
なのでVBUSを接続していないとUSB_CONNECTもうまく動きません。
スイッチの回路については
LPC1343の開発ボードのようなものをwebで探し、
その回路情報から持ってきました。DTA114YKAという部品です。
参考の回路はIAR社のものです(リンク)
こんな感じで接続します。
(GNDのラインは切れているのではなく見づらくなるので割愛です)
これで、認識NGは回避されて
とっても便利にUSBが使えるようになりました!!