Arduinoや安価なマイコンは、UARTが1chまたは無いことが多く、ログ出力用に送信だけでも、もう1チャネルあればなと思うことがよくあります。 多くのマイコンはペリフェラルとしてSPIを複数チャネル搭載しているものが多いので、SPIを用いてUART送信を実現する方法を紹介したいと思います。

UART送信(調歩同期)は、115200bps,8bit幅,ノンパリティ,ストップ1bitとして説明します。

まずは、UART通信の出力形式ですが、下図のようになります。

 

次にSPIですが、次のように考えます。

(1)出力だけなので、外部端子はMOSIだけを用いる。・・・・(*1)
(2)SPIのキャラクタ長を 8bitとする。・・・・(*2)
(3)SPIのクロック周波数をボーレートの2倍の 230400Hz にする。・・・・(*3)
(4)LSBファーストとする。
(5)極性は、’1’がHigh になるように設定する。

*1: SEL,SCK端子は使用しません。
*2: 7bitでも行えるが、ここでは便宜的に8bitとします。
*3: 誤り率を5%とした場合、218880~241920Hz の範囲に収める。

最後にデータ処理ですが、下図のようにUART送信したいデータ列をSPI出力用に変換してバッファリングを行い、順に送出します。
送出したいデータ4バイトに対し、SPIでは5バイトのデータ送出となります。
端数があれば、1バイトのデータをSPIでは2バイトとしてデータ送出します。