このページではPIC16F628が装備しているUSARTについて説明します。
USARTとはAddressable Universal Synchronous Asynchronous Receiver Transmitterの略です。 この機能はPIC16F873でも持っており、以下の説明で一部のレジスタ類はPIC16F873のページを使用しています。 USARTでは以下の通信モードで使うことができます。
USARTによる通信では通常は1つのデータブロックは8ビットで構成されますが、 マルチプロセッサ通信のアドレス指定をするために9ビットの構成にすることもできます。 このページでは非同期通信について説明します。 非同期通信とは
非同期通信では転送されるデータ(8ビットまたは9ビット)の先頭にスタートビットを付け、データの最後にストップビットを付けてデータの区切りとして使います。スタートビットはLレベル、ストップビットはHレベルの信号です。 データを転送していない状態では回線をHレベルにしておきます。この状態からLレベル(スタートビット)になると受信側はデータ転送が開始されたとみなします。その後、通信速度に従い、データの授受が行われます。最後にストップビット(Hレベル)を検出して1ブロックの転送が終了します。通信速度は送信側、受信側それぞれ独立したタイマーで制御します。ですから、このタイマーがずれていると正確な通信ができません。 非同期のUSARTでは送信用にTXポート、受信用にRXポートを使用するので、同時に送受信を行うことができます。(全二重通信) ポートの指定 非同期通信ではデータ送信にRB2/TX/CK(pin8)を使い、データ受信にRB1/RX/DT(pin7)が使われます。USARTを使用するためにはTXポート、RXポートの入出力モードをTRISCレジスタに設定します。Bポートのビット2を"0"にして出力モードとし、Bポートのビット1を"1"にして入力モードにします。 RB1およびRB2をUSARTポートとして使用するためにはRCSTAレジスタのSPENビットを"1"にする必要があります。 非同期通信の指定
通信速度の指定
BRGを制御するレジスタとしてSPBRGレジスタがあります。8ビットのフリーランタイマーを制御するためのレジスタです。非同期通信の場合、TXSTAレジスタのBRGHビットの指定も通信速度の制御に使われます。 SPBRGレジスタに値を書き込むとBRGタイマーはリセットされます。 通信速度とPICのクロック周波数は以下の式で計算できます。
SPBRGレジスタの設定値の詳細は「SPBRGレジスタによる通信速度」を参照して下さい。 送信回路動作 USARTで非同期送信を行う場合にはRCSTAレジスタのSPENビットを"1"にしてRB2ポートをTXポートにします。 TXREGレジスタに送信データを設定するとハードウェアでTSR(Transmit Shift Register)に取り込まれ、TXポートから送信されます。データの送信はTXSTAレジスタのTXENビットを"1"にすることにより行われます。 送信は最下位ビット( LSb : Least Significant bit )から先に送信されます。 TXREGの内容がTRSに送られるとPIR1レジスタのTXIFビットが"1"になり、割り込みが発生します。ただし、PIE1レジスタのTX1Eビットが"1"になっている必要があります。この割り込みはTXREGの内容がTSRに送られ、TXREGにデータが書き込み可能になったことを意味します。この割り込みを検出してTXREGに次のデータを設定すれば連続的にデータを送信することができます。(Back to Back) TXIFビットはソフトではクリアできません。TXREGにデータを書き込むとクリアされます。 TSRレジスタのデータが送信されるとTXSRAレジスタのTRMTビットが"1"に設定されます。このビットには割り込み機能は無いので、TSRレジスタの空きを確認するのにはTRMTビットを周期的に確認する必要があります。 TSRレジスタはデータメモリにはないので、このレジスタの内容を直接操作することはできません。通信速度はBRG(Baud Rate Generator)で制御されます。 データの誤りチェックのために使用するパリティビットはハードでは作られません。必要な場合にはソフトウェアで作る必要があります。パリティビットを9ビット目に付けることができます。その場合、TXSTAレジスタのTX9Dビットにパリティビットの内容を設定し、TX9ビットを"1"にすることにより、パリティビットを含んだ9ビット長のデータが送信されます。TX9Dビットの設定はTXREGにデータを設定する前に行う必要があります。TXREGにデータを書き込むと直ちに送信が開始され、そのときTX9Dにデータが設定されていないと正常に送信されません。 データを送信中にTXENビットをクリアすると送信回路はリセットされ、RB2/TX/CKピンはハイインピーダンス状態になります。
受信回路動作 USARTで非同期送信を行う場合にはRCSTAレジスタのSPENビットを"1"にしてRB1ポートをRXポートにします。 RXポートで受信されたデータはデータ補正回路を通りRSRレジスタで受信されます。RXポートのデータはHレベルまたはLレベルの判定を行うために3回サンプリングされます。受信データはSPBRGレジスタおよびTXSTAレジスタのBRGHビットで指定される通信速度に従ってRSRレジスタに格納されます。 ストップビットを検出するとRSRレジスタの内容はRCREGレジスタに転送されます。RCREGレジスタにデータが格納されるとPIR1レジスタのRCIFビットに"1"が設定され、割り込みが発生します。割り込みを発生させるためにはPIE1レジスタのRCIEビットを"1"にしておく必要があります。 RCREGレジスタは2段のFIFO(First In First Out)バッファで構成され、2ブロック分のデータを格納することができます。ソフトでの取り込み処理が多少遅れた場合の保護のためです。RCIFビットは読み取り専用のビットでRCREGレジスタが全て読み出された場合にハードウェアで"0"にされます。 RSRレジスタで受信が完了したときRCREGレジスタが2つとも一杯(読み出されていない)場合にはRCSTAレジスタのOERRビットが"1"になり、オーバーランエラーが発生したことが表示されます。このときRSRレジスタに格納されたデータは無くなります。また、これ以降の受信動作は行われなくなります。この状態を正常に戻すのは一度RCSTAレジスタのCRENビットをクリアし、再びセットします。これによりOERRビットもクリアされます。 RSRレジスタでフレームエラーが検出するとRCSTAレジスタのFERRビットがセットされます。RCSTAレジスタに格納されるRX9DビットとFERRビットは1ブロックのデータを受信する都度書き換えられます。ですから、RCREGレジスタの内容を読む前にRCSTAレジスタを読み込んでFERRビットをチェックする必要があります。エラーフレームの後に正常なフレームを受信した場合、FERRの情報は消えてしまい、正常なデータを受信できたのかどうかが分からなくなります。
動作は以下のようになります。この動作は9ビット転送で有効になります。 RCSTAレジスタのRX9ビットおよびADDENビットを"1"にします。このようにすると9ビット目のデータが"1"の場合だけ、受信したデータがRCREGレジスタに格納されます。9ビット目が"0"のデータは格納されません。 |