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

自社標準仕様の製作
平成27年12月 14日

 汎用の高速シリアル通信機能(24)  SPI仕様の検討(2)

 Binaryモードの次はAsciiモードです。
Asciiモードでは特定の文字コードを通信の終端文字として認識させることで、可変長の通信を行います。この場合、特定の文字コードは事実上'\0'になります。
これはSPIのスレーブ送信で、送信データが間に合わない(送信バッファにデータがセットされていない)状態で通信が行われた場合、無条件に送出される文字コードが'\0'であるためです。
これでマスタ側から読み出しを行ったときに、まだスレーブ側がデータを用意できていないときでも、マスタ側はスレーブがデータを用意できていないことを認識できる。

 Asciiモードについても、細かな動作を検証してみます。

1.書き込みのみ
 マスタからスレーブへの書き込みでは、送信開始前に送信文字数が判明していますので、送信ルーチン内で終端文字'\0'を含む文字数を送信指示することで行います。
これは事実上Binaryモードでの送信と同じです。書き込みの終了は送信側DMAの終了ではなく、(受信データ自体は無効ですが)受信側DMAが指定された文字数を受信完了した時点で判断されます。


(2015-12-18追記)
 受信(読み出し)仕様の検討内容に不備がありました。以下の文書では正しく通信できません。詳細はこちらにあります
(追記ここまで)
2. 読み出しのみ
 読み出しは比較的複雑になります。最初の問題はBinaryモードと同様にダミーでマスタからの送信を行う必要があるのですが、何時ダミー送信を止めれば良いのかが問題です。Binaryモードでは送信する文字数が分かっていたのですが、今回は不明のままです。
結局は、受信側が終端文字を受信したことを認識するまではダミー送信を続ける必要があります。つまり、送信開始時点では最大送信数である受信バッファ分の文字数を指定して送信を開始し、途中で受信側DMAが終端文字を認識して割り込みを発生させることをトリガとして送信を中断します。
 この方法での疑問点は、受信側DMAが終端文字を認識してから送信側に中断を要求しても間に合わす、次のデータが送信されてしまうのではないかという点です。実際にやってみた所、やはり間に合わず終端文字の次の文字までは送信されてしまいます。これ自体は「そうなる」と知っていれば問題はありません。
最後の送信と同時に受信されたデータはSPIの受信レジスタは留まります。特に受信バッファサイズを1バイト余計に用意する必要もありません。
 ほかに注意すべき点を列記しておきます。

目次へ  前へ  次へ