スパイス  組み込み制御装置の受注製作

自社標準仕様の製作
平成27年 8月 4日

 汎用の高速シリアル通信機能(2)  通信の基本的手続き
 通信の具体的な手順や内容について書いていきます。

(1) RS-485による半二重通信
 RS-485で問題になるのは半二重通信であるため通信方向を切り替える時にどうしても信号の衝突を避けるためのデッドタイムが必要です。
この時間は主として送信側が最後のデータ送信を終了してから、送信終了割り込みを受け付けて通信方向を受信に切り替えるまでのワーストケースだけの時間を確保する必要があります。この時間はどの程度必要なのか?
 全てのプログラムを自作していいてさえもこの質問に答えるのは大変です。
通常はプログラム中の各所にある割り込み禁止時間を知ることは非常に困難です。ちゃんとした製品として販売されているプログラムであれば割り込み禁止時間の最大値を明示してある可能性はあります。送信終了割り込みと同等以上の優先度を持つ割り込み処理も関係してきます。これらの割り込み処理を実行中に送信終了が起きる可能性もあり得ます。

 結局はある程度余裕を見込んだ時間をデッドタイムとして確保することになります。PIC32は下位デバイスでも40MIPSの性能がありますのでデッドタイムの初期値として100usとします。条件を整えれば数us以下でも十分に動作するのですが、汎用となるとそんな訳にも行かなくなります。

 このデッドタイムは1Mbpsという通信速度を基準にすると無視できるものではなく、むしろ遅く感じます。通信方向の切り替えは一度の送受信で2回発生します。このときの送受信文字数の合計を20バイトとすると、通信時間とデッドタイムがほぼ同じ時間になります。当然、より多くの文字数を一度に送るようにすれば効率は上がりますが、組み込みではそれ程通信量をまとめることは困難です。

    通信方向の切り替えを減らす工夫
 このままではせっかくの1Mbpsの通信速度はせいぜい半分程度になってしまいます。何か工夫が必要です。
そこで考えたのがマスタから各スレーブへの送信を一度に行い、各スレーブは一定の規則に従ってマスタに応答を返す方法です。
これならマスタからスレーブへの送信回数が(スレーブ数 -1)回減り、その分だけ通信方向の切り替え回数も減らせます。
 具体的には次のように行います。
・マスタからスレーブへの送信は次のように構成される。
[ブロック送信コマンド][全送信文字数]<スレーブ1への送信> ・・・・<スレーブNへの送信>[CRC(2バイト)]

 また、各スレーブへの送信データは次のように構成されています。
[スレーブアドレス][本スレーブアドレスに対する送信文字数]<コマンド1>・・・・<コマンドN>

 上記のコマンドは個々のコマンドによって引数やオプションが含まれます。通信データには各スレーブに対するアドレスと送信文字数が添付されているので、各スレーブが自分のアドレス部分を見つけるのは容易です。

 マスタからの送信が終わると各スレーブはそのアドレスに従って順番に応答を返していきます。従って、スレーブアドレスは連番である必要があります。同時に複数スレーブへの送信では、マスタは常に全スレーブに対して応答を要求する必要があります。若い番号だけに送信することは可能ですが。
 これをタイムチャートに書くと、下記のようになります。○が送信開始、が送信終了(従ってデッドタイムが必要)

 これをPIC32に実装することを考えます。流石に1Mbpsのボーレートで送られてくるデータを1バイト毎に割り込み処理させるのは現実的ではありません。どうしてもDMA機能が前提になります。しかし、DMA機能を使用した場合は受信の終了を判断する方法が必要です。固定長の送受信なら文字数で判断できますが可変長の書式ですのでこれは使えません。このため送信データの最後にBreakを追加して送信することにします。BreakはSCI通信機能でフレーミングエラーとして認識されるので、これを受信終了の合図として使用します。これなら受信終了を割り込みで捉えることが出来ます。

 この方法を使った場合のメリットは既に説明しました。実用上の通信速度を上げられます。では、デメリットはどのようなものか?
次回以降に順次書いていきます。


目次へ  前へ  次へ