Renesas Synergy™

FAQ 1006923 : また、どのような対策を行えばよいでしょうか。

ハンドシェイク信号を追加してください。
(これ以外にデータ自身にチェック用のデータを追加することで、通信の信頼性を高める方法もありますが、あくまで補助的な手段です。基本としては、やはり、タイミングの差が発生しないようにすべきです。)
通常、データのやり取りを行う場合には、相手の準備ができているかどうかを前もって調べておく必要があります。しかし、(シリアルバスを除く)シリアル通信信号自体にはそのような機能は準備されていないため、別に信号(これをハンドシェイク信号と呼びます)を準備する必要があります。

[制御信号の例]
このための信号として、モデムで使用されている信号に

送信要求信号 RTS(Request To Send)
送信許可信号 CTS(Clear To Send)

があります。送信したいときにRTS信号をアクティブにして、受信側に送信したいことを通知します。受信側は受信準備ができると、CTS信号をアクティブにして、送信していいことを送信側に通知します。このときのシーケンス図を下に示します。



なお、モデムで使用しているこれらのハンドシェイク信号そのままでは通信の細かな制御には使えません。そこで、これをマイコン間でのローカルな通信用に定義の変更を考えます。以下に新しい定義を示します。

RTS: マスタは送信を行いたいときにロウを出力。
スレーブはその立ち下がりを送信要求と判断し、立ち上がりを送信完了と判断する。
CTS: スレーブは受信可能になったら立ち下がりエッジを出力する。
(スレーブはデータを受信したら、一旦ハイを出力し、次のデータの受信準備ができたら、その後立ち下がりエッジを出力する。)
マスタは立ち下がりエッジを検出したら1キャラクタのデータを送信する。




この信号を処理するために、上記の接続を行います。マスタはポートを用いて、RTS信号出力し、スレーブはそれをエッジ検出割り込みで監視します。RTS信号は立ち上がりと立ち下がりの両方のエッジを使用しますからエッジ検出割り込みとポートして信号の状態の読み込みを行います。CTS信号は立ち下がりエッジのみを使用しますから、スレーブがポートで出力した信号をマスタが立ち下がりエッジ検出割り込みで監視します。

[制御信号を用いた送信処理手順]


上記処理手順に従って説明します。なお、マスタ、スレーブともにポートは初期状態でハイにしているものとします。
(1)マスタは送信を行う前にポートを用いてスレーブにRTS信号(立ち下がり)を送り、スレーブからの送信許可を待ちます。
(2)スレーブはエッジ検出割り込みとRTS信号のレベル確認によりマスタからの送信要求を確認し、受信の準備(受信起動)を行います(スレーブで受信起動しても、マスタからSCK(シリアル・クロック)がこないと実際の転送はおこなわれません)。
(3)スレーブは受信起動したら、ポートにロウを出力することで、マスタにCTS信号の立ち下がりエッジを送り、準備ができたことを知らせます。
(4)マスタはスレーブからのCTS信号の立ち下がりエッジを検出すると、データを送信します。
(5)スレーブはマスタからのデータを受信します。
(6)マスタは送信完了の割り込みを待ち、送信完了すると次のデータがあるかを判断し、次のデータがあれば(3)のCTS信号の立ち下がり待ちに戻ります。
(7)スレーブは受信完了したら、ポートにハイを出力し、CTS信号を立ち上げ、受信データの処理を行います。
(8)送信が完了したらマスタはRTS信号を立ち上げ、スレーブに送信が完了したことを通知します。
(9)スレーブは受信したデータの処理を行い、マスタからのRTS信号が立ち上がったことをエッジ検出割り込みとレベル確認により確認したら転送を終了します。RTS信号が立ち上がらない場合には次の受信に戻ります。

この例ではRTS信号を使用しましたが、スレーブが常に受信準備をしていて問題がない場合(ただし、実際の通信はまだ行われない)にはRTS信号は不要です。

スレーブが送信を行う場合にも同じような処理で実現可能です。この場合にはRTS信号がスレーブからのデータを要求する意味となり、CTS信号がデータが準備できたことを意味するようになります。

適用製品

RL78 ファミリ
78K ファミリ
他にご質問がございましたら、リクエストを送信してください