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