UARTを切り替えて複数のデバイスを接続したいときの一手
はじめに
マイコンのポートをもう全部割り当ててしまった後に、あるいはマイコンが持っているSCIを全部使ってしまった後に、UARTのデバイスをもう一つ接続する必要に迫られるケースはわりとあるのではないでしょうか。I2CやSPIならバス上にデバイスを増やすことはさほど難しくないですが、UARTはそうもいきません。そんなときなるべく面積を使わず、複雑な操作なしで安定して動くシンプルなUART切り替え回路が欲しくなりますね。しかしそんな都合のいい部品はなかなか見つからず、検索してもベストプラクティスといえる例もあまりHitしませんでした。
仕方ないので、勝手の良い部品を使って作ってみることにしましょう。
こうしてみましょう
受信の切り替えには、そのために生まれてきたようなICがありますので、 SN74LVC1G99 を使ってみましょう。データシートの使い方の中に、"3-state 2-to-1 data selector MUX"がありますので、書いてある通りに使いましょう。説明は割愛します。
送信の切り替えにはおなじみの 74HC00 を使ってみます。ロジック回路に触れたことがある方なら、きっと部品箱にいくつか入っているでしょう。 UARTは通信していないときの状態は1ですので、出力が選択されていて入力が0のときだけ、0を出力するようにします。
真理値表に表すとこのようになります。
入力 | 出力 A D |TX0 TX1 0 0 | 0 1 0 1 | 1 1 1 0 | 1 0 1 1 | 1 1
以上をふまえて、回路を設計するとこうなります。 74HC00 は同じゲートが4つ入っていますが、アートワークの際パターンをひきやすい順番になるように配慮しましょう。
つらつらと理屈を述べましたが、これで動くはずですので試作してみたものがこちらです。
使用している部品はどれも街の部品屋さんで入手可能だったため、思い立った日のうちに試作できました。大変ありがたいですね。 USB-UARTにつないで両ポートの送受信全パターンで正常に通信できることが確認できました。
この回路のなにがいいの?
受信の切り替えを担う SN74LVC1G99 は…
- 電源電圧に関わらず5.5Vまで入力できますので、接続相手が5.0Vでも3.3Vでも問題ありません
- シュミットトリガ入力になっているので、こちらもケーブルが長くなった際など、少々環境が悪くなっても安心です
送信の切り替えを担う 74HC00 は…
- 5.0V、3.3Vどちらでも駆動でき、接続相手のデバイスの電圧に合わせることができます
- ロジックICなのでそれなりに駆動力もあり、ちょっとケーブルを伸ばす用途でも安心です
レベル変換を伴った使い方をする際は、データシートを読んでスレッショルドの範囲内に入っているか確認しておくと安心でしょう。
SN74LVC1G99 はもともとコンパクトなパッケージのラインナップですが、 74HC00 はDIPゲジゲジサイズから、QFN14の米粒サイズのものまでありますので、基板の面積がないときでも、隙間に配置できるかもしれません。
なにより、どちらも非常に汎用性の高い部品なので、半導体入手難の今でも当面は手配に困ることはなさそうな点がメリットといえるでしょう。
さいごに
汎用的で潰しが効く部品は部品箱に何個あっても困らないのでついつい使ってしまいますね。 まだベストプラクティスといえるほどスマートでないので、もっといい方法があったら教えてください!
来年は「もう少し早く言ってくれたらよかったのに」と言わなくていいよう、創意工夫していきたいですね。
それでは、良いお年を。