編集履歴一覧に戻る
meyon230のアイコン画像

meyon230 が 2024年05月20日00時31分13秒 に編集

初版

タイトルの変更

+

UART 送受信回路をロジックICで作る

タグの変更

+

シリアル通信

+

カウンタ

+

シフトレジスタ

+

フリップフロップ

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

セットアップや使用方法

本文の変更

+

## 概要 Arduino やパソコンと通信できる UART 送受信回路をロジックICで作ってみました。なお、ここでの UART 通信とは「調歩同期式非同期シリアル通信」のことと解してください。 この記事は、[meyon's STUDY](https://meyon.gonna.jp/study/tag/serial-communication/) に投稿した一連の記事の抜粋です。 [UART 受信回路をロジックICでつくる](https://meyon.gonna.jp/study/electronic/10463/) [UART 受信回路をロジックICでつくる (回路変更)](https://meyon.gonna.jp/study/electronic/10718/) [UART 送信回路をロジックICでつくる ](https://meyon.gonna.jp/study/electronic/10759/) ## タイミングダイヤグラム ![タイミングダイヤグラム](https://camo.elchika.com/34778b71eff6efe8fac0b98597cef9ab1868ee41/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30303433323039312d383534312d343463312d383534332d3263626436363135383430652f64666561393636342d623565652d343838372d383230642d616537363964616666616331/) ### 受信 受信タイミングダイヤグラムは、2 キャラクタを連続して受信する様子を示しています。 スタートビット $ST$ の立ち下がりエッジを検出したらトリガパルス $\overline {TR}$ を出力します。$\overline {TR}$ によりカウンタ制御信号 $\overline {LOAD}$ を HIGH にしてシリアルクロック発生回路のカウンタをスタートさせます。 カウンタは 8 ビットで、0x61 (97) を初期値として0xf8 (248) まで 0x97 (151) カウントし、10個のパルストレインを出力します。 カウントが 0xf8 となり 10個目のパルスが立ち上がったらカウンタ停止信号 $\overline {SUPPR}$ を出力し、$\overline {LOAD}$ を LOW にしてカウンタを停止します。このときカウンタは初期値 0x61 をロードして待機します。 出力されたパルストレインをシリアルクロック $SCK$ としてシフトレジスタへ送り、受信したシリアルデータ $RxD$ をパラレルデータに変換します。最後に、レジスタクロック $RCLK$ によってシフトレジスタからストレージレジスタへパラレルデータ $OD$ を出力します。 ### 送信 外部からのスタート信号 $\overline {START}$ で送信を開始することにします。 $\overline {START}$ が LOW になるとストレージクロック $ST_{CP}$ を出力し、入力された 8 ビットパラレルデータをストレージレジスタに読み込みます。このときスタートビット ST、ストップビット SP を付加した 10 ビットをセットします。 次にパラレルロード $\overline {PL}$ を出力し、ストレージレジスタのデータをシフトレジスタに転送します。同時に $\overline {TLOAD}$ を HIGH にしてカウント動作を開始します。カウンタは 8 ビットで、0x61 (97) を初期値として 0xff (255) まで 0x9e (158) カウントし、シフトクロック $SH_{CP}$ を 10 個出力します。10 ビットのデータをすべてシフトしたら、出力 $TxD$ が HIGH の状態で停止します。 ## ブロックダイヤグラム ![ブロックダイヤグラム](https://camo.elchika.com/606e41df819fff6fdbff7589344dd97c22772306/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30303433323039312d383534312d343463312d383534332d3263626436363135383430652f33626461356330352d646463322d346164632d616533352d653138363138336636333838/) 初期化回路、クロック発振回路は送受信の共通部分です。初期化回路は電源オン時にフリップフロップ、カウンタを初期化します。シフトレジスタ初期化回路は 74HC595 の初期化シーケンスを実行します。 水晶発振子により 19.6608MHz を発振し、リプルカウンタにより 128 分周してクロック 153.6KHz を出力します。これをさらに 16 分周してシリアルクロック 9600Hz とします。 テスト用の受信データは Arduino Nano Every の Tx1 から出力させます。受信したパラレルデータをバッファレジスタに保存し、3 キャラクタを LED 列で表示させました。 送信スタート信号は押しボタンスイッチで、送信データは 8 ビット Dip スイッチで生成しています。送信はバッファがありませんので 1 キャラクタのみのテストです。 ## 全体回路図 下に示した全体回路図は、ブロックダイヤグラムの点線で囲まれた部分です。それ以外はテスト用の回路で回路図には含まれていません。 ![全体回路図](https://camo.elchika.com/096b31c4128fa9fe2aaf0b9c59ec8da0b8a3d885/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30303433323039312d383534312d343463312d383534332d3263626436363135383430652f37633662336533322d333166342d343664392d613737622d356266346134623233373737/) 各回路の構成、動作およびテスト用回路については冒頭に記載した[元記事](#h_概要)を参照ください。 通信テストは Arduino Nano Every のほか、パソコン (ubuntu) の Arduino IDE シリアルモニタ、端末の cu コマンドでも実施しました。また、クロック発振回路の分周比を変更することで 2400~76800bps の通信速度をテストしました。いずれも正常に送受信ができました。