ArduinoでのUART高速通信を行う(115200bps)

組み込み
スポンサーリンク

Arduinoでセンサーなど周辺機器を使用する場合はI2CかSPIで通信を行うことになります。
ただ、センサーによってはシリアル通信(UART)でのアクセスが必要になるものがまだまだあります。
UARTでは通信速度の設定が必要となります。UARTは調歩同期式といって、お互いの通信速度を合わせて通信を行うことが必須となります。
通常のArduinoでは問題になることはありません。115200bpsでの速度でも物理ポート、ソフトウェアシリアル経由でも問題になることはありません。
これは、5V16Mhzで動作しているので処理速度に問題がないためです。

ただし、省電力のために3.3V8Mhzで動作させている場合はこの速度でのUART通信ができません。8Mhzの動作周波数では115200bpsでの通信を処理するためのパフォーマンスが満たせないためです。

8Mhzでの高速UART通信をおこなうにはどうするか

Arduino(ATMEGA328)でパフォーマンスが不足しているのであれば外部モジュールを使うしかありません。
代表的な製品としてはSWITCHSCIENCEから発売されているSC16IS750 シリアル-I2C ピッチ変換済みモジュールがあります。

I2C経由でのアクセスになりますが、このモジュールが高速でのUART通信を行ってくれます。モジュールには64byteのFIFOバッファが搭載されています。

Arduinoのドライバは公式には提供されていませんが、SC16IS750を使用するドライバはGitHubで公開されていますのでそちら流用できます。
例えばUART_Bridgeなどがあります。

ドライバを使用する場合の注意点

サンプルコードではTXとRXを直結して送受信を行うサンプルになります。ハード不良がない限り失敗することはありません。ただ、外部機器と通信が正常にできないことが多いと思います。

これは、ドライバの設定を変更する必要があります。
SWITCHSCIENCEの機器は12Mhzの水晶発信子が実装されています。
かたや、ドライバのヘッダファイルを見てみます。

define SC16IS750_CRYSTCAL_FREQ (14745600UL)
//#define SC16IS750_CRYSTCAL_FREQ (1843200UL)
//#define SC16IS750_CRYSTCAL_FREQ (16000000UL)

通信する際に使用される水晶発信子の設定があります。
デフォルトでは14Mhzが設定されています。
この設定のままではUARTの通信タイミングがずれてしまうため正常通信が行えません。
そこで、この値を12Mhzで設定する必要があります。「12288000UL」を設定すると正常通信が行えるようになります。

コメント

タイトルとURLをコピーしました