平成27年 5月 4日
PIC32の周辺機能(USART)を活用する(その7) 動作確認
目標仕様に合わせて実際にプログラムを書いて動かしてみました。結果自体は、当然予想できる範疇と変わりませんが、参考にはなります。
実験条件は以下です。
- CPUCLK, PBCLKは共に80MHz
- XC32 Cコンパイラの最適化0(禁止)
- 通信速度は1Mbps
- 送信文字数は有効データ16バイト(全体では20バイト)
- 待ち時間は下記値で実施
#define DEFAULT_MBR_CFG_T1 950
#define DEFAULT_MBR_CFG_T2 500
#define DEFAULT_MBR_CFG_T3 300
#define DEFAULT_MBR_CFG_T4 300
#define DEFAULT_MBR_CFG_TOOT 1500
今見ると、少しマスタ側に対する割り込み処理時間の設定がシビアですが、まあ良いとしましょう。
通信のタイミング図は以前に示したものを再度示します。
マスタ側 [Dn]|<------ T1 ---------->[D1]<---- T2 ---->[D2]<-- -->[Dn]|<----- T5 ------->
--------------------------------------------------------------------------------------------------
スレーブ側 [Dn]| |<-T3->| [R1]<-- T4 -->[R2]
まず最初は、送信開始から受信完了までの時間は4.364ms(4,364us)でした。ポーリングによるロスを無視してデータの通信時間と待ち時間を合計すると4.05msですので概ね計算どおりです。この条件での通信速度の実測値は91Kbpsです、割り込みに対する応答性を確保したまま、3〜4倍程度までの高速化が出来ています。
もう少し速度が欲しいなら、多少は工夫の余地があります。現在は一度に送信するデータ数を受信FIFOの割り込み仕様の制約に合わせて6バイトにしてあります。が、実際には割り込み処理に多少の時間が掛かることを考えれば、割り込み処理中にデータをもう1バイト送信出来そうです。このため、スレーブ側割り込み処理時間の最大値を確認すると19.5usでした。最適化によって20〜30%程度の低減はあるでしょうが、+1バイト送信するくらいは出来そうです。実効的な送信速度を15%程度上げられます。通信速度を倍の2Mbpsに上げることが出来るなら8バイト単位で送受信できます。これはかなり効果があります。
しかし、あまり無理はしないほうが良いです。これでも従来との比較では十分に高速です。
この実験のために、他の通信方式のプログラムを元にに通信部分を書き直ししました。ヘッダーファイルを除くCソース全体ではおよそ800行ほどになります。多分、まだ無駄な処理が残っているとは思いますので、全体で600行以上にはなるでしょう。
シリアル通信は既設の装置を改造したいときなど、既設の配線を生かして新規に配線を行わずに済むメリットがあり、簡単には捨てられない事情があります。高速化が出来るなら、選択肢として持っておきたい機能です。
以上の結果から、PIC32を使って100Kbps程度の通信速度を確保することは比較的容易に出来ることがわかります。
もし、これ以上の例えば1桁上の性能(1Mbps)が必要なら、DMA機能を使用することになります。
こちらはもっと多くのデータを一括して転送することを前提にすべきでしょう。例えば32バイトとか48バイトといったデータを一度にやり取りすることで全体の速度を稼ぎます。
PIC32には最小クラスのDIP品にもDMA機能が実装されています。