- 公開日:2021年03月18日
- | 更新日:2022年11月30日
UARTからSPIへの変換をマイコンで実現してみた!
- ライター:umamiti
- マイコン
はじめに
本記事は、以下の記事の続きとなります。既に準備が完了している方、ひとまず動作結果を確認したい方はこのままお読みください。
今回は25種類の中の、UARTからSPIへのブリッジの例を実際に動かしてみたいと思います。
- UART-to-SPI Bridge Using Low-Memory MSP430MCUs
UARTからSPIへの変換
この例では、マイコンのシリアル通信機能とTimer+GPIO機能を使用して、UARTとSPIへの変換を実現します。SPI Slaveデバイスから受け取ったデータをUARTデバイスへ転送、またはその逆を行うことができます。
MSP430FR2000は、シリアル通信機能を1つしか搭載していないため、SPIかUARTのどちらか片方のみにしか対応出来ません。そこで、Timer機能を使用して適切な時間にあわせてGPIOピンを操作することで擬似的にUARTの通信を実現します。
ブロック図
今回はMSP-EXP430FR2433を2台使用して、下図のようにPCと接続します。MSP-EXP430FR2433 #1がブリッジICとして動作し、受信したデータをUARTもしくはSPIに変換して送信する役割となります。
TTL-232R-3V3はPCとMSP-EXP430FR2433 #1を繋ぐ役割となり、内蔵されているUSB-シリアル変換ICが”UART device”となります。TTL-232R-3V3を経由してPCに送信されたデータはTeraTermを使用して確認する事ができます。
MSP-EXP430FR2433 #2はSPIのSlaveデバイスとして動作し、SPIで受信したデータをそのままMSP-EXP430FR2433 #1へSPIで送り返す役割となります。本来、”SPI Slave device”は任意のデバイスを使用することが出来ますが、SPI Slave用のサンプルコードが用意されてるMSP-EXP430FR2433を使用していきます。下記よりサンプルコードが提供されていますので、こちらをMaster側のデータ・フォーマット、クロックに合わせて修正してください。評価ボードへの書き込み方法については、準備編の内容が参考になるかと思います。
・msp430fr243x_euscia0_spi_10.c(eUSCI_A0, SPI 3-Wire Slave Data Echo)
実際の接続図
実際の動作としては、PC上のTeraTermに文字を入力すると、入力した文字がそのままTeraTerm上に表示されます。ここでは、以下のような流れでPC、MSP-EXP430FR2433 #1、MSP-EXP430FR2433 #の間でデータのやり取りが行われています。
- UART to SPIの時:TeraTermに入力>>PCからアスキーデータが送信>>USBケーブル>>USB-シリアル変換IC>>
>>UART>>MSP-EXP430FR2433 #1>>SPI>>MSP-EXP430FR2433 #2 - SPI to UARTの時:MSP-EXP430FR2433 #2>>SPI>>MSP-EXP430FR2433 #1>>UART>>USB-シリアル変換IC>>
>>USBケーブル>>PCがアスキーデータを受信>>TeraTermに表示
TeraTerm上の動作
サンプルプロジェクトがどのような動作になるのかをなんとなくイメージ出来たところで、ブリッジICのプログラムの動作やデータの処理部分をもう少し詳しく見ていきましょう。また、準備編では解説できなかったプログラムの修正点についても解説させていただきます。
フローチャート
UARTとSPIはそれぞれでデータを受信したタイミングで、データの処理を開始します。
SPIでは、受信したデータをマイコン内部のバッファーへ格納します。その後、格納したデータは、Timer+GPIO機能を使用して、擬似的にUARTのプロトコルに従ったデータ・フォーマット(スタートビット+8ビットデータ+ストップビット)で転送されます。
SPIでデータ受信時のフローチャート
UARTでは、スタートビットの立ち下がりをGPIOで監視することでデータの受信を開始します。以降8ビット分のデータはGPIOへの入力のHigh/Low状態から決定し、変数(内部メモリ)へ格納します。このデータをシリアル通信機能へ渡したタイミングで、自動的にSPI通信でのデータの送信が開始されます。
UARTでデータ受信時のフローチャート
Timer+GPIO機能を使用した擬似的なUART通信の実現方法についてですが、信号波形としては下図のようになります。
疑似UART通信の信号波形
送信処理では、Timer機能を用いて一定時間ごとにGPIOの出力状態をデータに合わせて切り替えます。受信処理では、Timer機能を用いて一定時間ごとにGPIOの入力状態をデータとして格納します。Timer機能で1ビット長の時間を調整することで、その他のボーレートにも対応することが出来ます。
ソースコードの変更部分
今回提供されているサンプルコードは、MSP430FR2000用に構成されていますので、MSPFR2433(またはそれ以外の型番)で使用する場合には、シリアル用のピン番号やGPIOのピン番号、Timerのモジュール番号を調整してあげる必要があります。
難易度が高いように聞こえますが、同じMSP430FR2xxxシリーズですので、データシートを確認し、差分を埋めてあげるだけです。下記に今回の変更点を記載いたしますが、ソフトウェアの全体像を変更する必要はありません。
※注意点として、ソースコードにバグが有るようでして、シリアル通信機能に入力するクロックをSMCLKに変更してあげる必要があります。
- ピンアサインの変更点
- HW_TX_PIN:7 → P1.4
- HW_RX_PIN:6 → P1.5
- SW_TX_PIN:0 → P1.1
- SW_RX_PIN :1 → P1.2
- モジュールの変更点
- Timer B0 → Timer A0
- 例:TB0CT → TA0CTL
- PORT2 → PORT1
- 例:P2DIR → P1DIR
- Timer B0 → Timer A0
- バグの修正点
- UCSSEL__ACLK → UCSSEL__SMCLK
ソースコードの修正後、プロジェクトのビルドと書き込みに成功しましたら、実際に動作確認を行いたいと思います。
動作確認
TeraTermの動作を確認するために、評価ボードとPCを最初にお見せした接続図のように接続し、PC上でTeraTermを立ち上げます。TeraTermの設定は、”9600/8bit/パリティ無し”となります。
TeraTermの設定
配線、ソフトウェアの修正、プロジェクトの書き込み、TeraTermの設定などすべての工程に問題が無いようであれば、PC上のTeraTermに文字を入力すると、入力した文字がそのままTeraTerm上に表示されます。
TeraTerm上の動作
TeraTerm上に1,2,・・・と入力したときの波形を確認すると、UARTで送信されたデータがSPIに変換されていることが分かります。逆にSPIで送信されたデータは、UARTに変換されてPC側に送信されていることが分かりました。
信号波形
おわりに
今回はUARTからSPIへのブリッジICの例を実際に動かしてみました。使用するデバイスによってはソースコードに少し修正が必要になりますが、評価ボードとPCさえあればすぐに動作を確認することが出来ます。この記事を見て、「何とか自力で確認できそう!」と思った方は、是非自分自身で試してみてください!
下記の記事では、UARTからUARTへのブリッジICの動作確認に解説しておりますので、ご興味がありましたらご確認ください。