PIC UARTでRS-485を使用する際に送受信を切り替えるタイミングの検討

RS-485で半二重通信を行う際、送受信に応じてバスの入出力を切り替える必要があります。全二重ならこの手間は不要ですが、半二重だと、信号線が2本(+GND)で済むため、省配線になります。PICのUARTを使用する際にうまい方法がないか検討します。

●切り替えタイミング

通常、受信待機のためにトランシーバは入力にしておいて、送信するときだけ出力にしたいのですが、送信し終えて、入力に戻すタイミングが問題です。

●送信完了の判断

PICの場合、送信用のレジスタが空になったタイミングは割込みフラグのTXIFで判断できます。だた、PICの場合は、ダブルバッファになっていて、RCREGが空でもシフトレジスタに出力途中のデータが残っている可能性があります。

そのため、TXIFだけでは判断できません。で、PICのマニュアルを見ていると、シフトレジスタが空になったことがわかるフラグを見つけました。TRMTというフラグで、シフトレジスタが空の時に1になります。これとTXIFをANDした条件が判定できれば送信していないことが判断できます。

●割込み駆動のリングバッファ出力の場合

通常、リングバッファを設けて、送信の際も割込みで1バイトずつ出力しますが、この場合は、リングバッファにデータが残っている間はそれが空になるまで、出し続けることになります。このことも踏まえて、送信完了の条件はリングバッファが空で、TXIFが1になり、かつ、TRMTも1という条件を満たせば送信が完了したと判断できそうです。こあと、少し遅延させて、トランシーバを入力に戻してやれば、送信の途中でバッファが切り替わるって送信に失敗することは無くなります。

ハードウェアでそのフラグが読み出せれば、電気的にそういう回路が作れるのですが、それは不可能なので、割込み処理などに細工すればなんとか作れそうです。

●CANなどは

ちなみにCANも同じような接続になりますが、CANの場合は、専用のコントローラが調停してくれて、他が送信しているときはバスが空くのを待って自分が出力する、とういように自動で制御してくれるので、このような心配はいりません。そういう意味ではCANは楽なんですよね。

コメントは受け付けていません。