1
MSP430 SPI マルチスレーブ・システム
Version3.0 2014/12/16 PIC 山内 一男
この資料では、SS(Slave Select)信号線を使用して、SPI のマルチスレーブ・システムを MSP430 で構築する具体的な 方法を説明します。
一般的には、master から slave に SS 信号を出して SPI 通信を行います。 これに加えて slave から master に RQSS(ReQuest Slave Select)信号を出して、スレーブドリブンの通信も実現してあります。
SPI は低コストで高速に双方向通信ができますので、複数 slave を連携させると幅広い使い方ができます。 自律分散シ ステムを構築できないかと考えています。 このドキュメントでは、SS・RQSS の制御と SPI 動作との連携、実装上の留意点などを少し細かく説明してあります。 この 内容の「動作と工夫」を理解すれば、他のシリーズにもインプリメントできると思います。 重要なキーワードは赤文字で書いて あります。 今回 Version3.0 では、G2553 と FR5969 をサポートして、マルチプラットフォームで実現しました。 また、SS と RQSS の制御方法を簡素化して、API も含めて更新しました。 API の説明は、ヘッダーファイルに記載してあります。 内容 1 装置構成 ...2 1.1 実験装置 ...2 1.2 配線図 ...2 1.3 master ボード、slave ボード ...3 2 方式概要 ...3 2.1 4線式 SPI 通信方式 ...3 2.2 マルチイベント処理 ...4 3 SPI マルチスレーブ通信 ...5 3.1 通信データ書式 ...5 3.2 SPI マルチスレーブ通信の詳細 ...5 3.2.1 master からの SPI 通信 ...6 3.2.2 スレーブから SPI 通信を要請 ...7 4 性能測定結果 ...8 4.1 master から SPI 通信するケース ...9 4.2 salve から SPI 通信を要請するケース ...9 4.3 slave の情報を他の slave に配信するケース ...9 5 補足 ... 10
2
1 装置構成
1.1 実験装置
下記写真が検証用に組み上げた装置外観です。 マスター1台とスレーブ6台で構成してあります。
Figure 1: Boards configuration
master:MSP-TS430RGZ48C+FR5969 ・・ 中央の黒いボード slave :MSP-EXP430FR5969 ・・ 左端の1台 MSP-EXP430G2+G2553 ・・ 他の5台 配線は、下記です。 ① 赤白ツイスト配線 ・・VCC と GND ② 緑+白のペア配線 ・・SPI:SIMO,SOMI 信号線 ③ 青配線 ・・SPI:CLK 信号線 ④ 白配線 ・・1対1の個別配線 6 本が SS 信号線
1.2 配線図
上記の実験装置の配線図は下記になります。 これはスレーブ2台の例です。3
1.3 master ボード、slave ボード
example プロジェクト(zip)で使用しているボードは下記です。 1) master ボード 下記のうち1台 MSP-TS430RGZ48C+FR5969 MSP-EXP430FR5969 MSP-EXP430G2+G2553 2) slave ボード 下記を混在して使用可能です。 接続台数は master ボードの種類によります。 オンボードのスイッチを使用します。 MSP-EXP430FR5969 MSP-EXP430G2+G2553 3) 信号接続 example プロジェクト(Multi_IO_projectV3.pdf)のドキュメントには、電源・GND と信号線の接続方法を解説 してあります。 example プロジェクト(zip)にある PIO_SPI_Driver.h には、信号線の接続方法、API とコーリングシーケンスの説明 があります。
2 方式概要
2.1 4線式 SPI 通信方式
SPI の基礎については、Google で「MSP430info spi」で検索して、下記の記事をご参照ください。 MSP430 SPI の概要と留意点の説明
1) 信号線
3線式 SPI(SOMI,SIMO,CLK)に、SS 信号線を加えた4信号線でシステムを構成します。
SS 信号線は共通線ではなく、master-slave ごとに1対1で配線します。 master は SS 信号線により slave を指 定あるいは識別をします。 (MSP430 の STE 信号をつかう 4pin SPI operation とは方式が異なります。) 2) SS(Slave Select)と RQSS(ReQuest Slave Select)
master から SS 信号線に出力するのをSSと呼び、slave から出力するのをRQSSと呼びます。
SSとRQSSは、信号あり= active high、信号無し= inactive Low で使用します。 SSは、master が slave を指定して SPI 通信をするときに使用います。
RQSSは、slave が master に SPI 通信を要請するときに使います。
SS 信号線へのSSとRQSSの出力は、master と slave の双方向から PIO 出力で行います。 このとき、出力信号 の衝突が起きるリスクが有りますので、提供するライブラリ関数が衝突回避動作をします。
SS 信号線からのRQSS on とSS onの割り込み(Low to High edge)を、master と slave ともに PIO 割り 込みで受けます。 SPI 通信がない時は、両者ともこの割り込みを LPM4省電力モードで待ちます。
4
master は最大8台までの RQSS の割り込みを受けることができます。 slave と通信しているときも、他の slave から の RQSS を受け付けてプールしますので、取りこぼすことはありません。
3) SPI 通信の動作概要
① master から SPI 通信をするとき
master が SPI 通信をするときは、SSで slave を指定して通信メッセージを SPI(一対一の双方向)通信で送信 し、同時に slave からの通信メッセージを受信します。 これを本書ではSPI ポーリングと呼びます。
SS onが slave へのSPI ポーリング開始の合図で、SS offがSPI ポーリング終了の合図です。
slave は、master からのSS onの割り込みを待ち、SPI ポーリングが来たら SPI 通信を開始して、master からの 通信メッセージを受信し、自分の通信メッセージを送信します。 SS offの割り込みで SPI 通信を停止します。 ② slave から SPI 通信を要請するとき
slave から通信をしたいときは、master にRQSS を送り、master からSPI ポーリングが来たら、自分の通信メッセ ージを送信し、同時に master からの通信メッセージを受信します。
RQSS onが、master へのSPI ポーリング要請の合図です。
master は通信メッセージがない時は、slave からのRQSS onの割り込みを、LPM4 で待ちます。 RQSS onの割 り込みが来たら、該当 slave にSPI ポーリングをします。
4) ポイント
SPI の通信がない時は、master はRQSS onを、slave はSS onを、LPM4 で PIO 割り込み待ちします。 つまり、 LPM4 の省電力で長時間の SPI 通信待ちをすることができます。
通信が必要な時は、master はSSを、slave はRQSSを出力して、相手に割り込みを入れます。 これにより、相手 の CPU を LPM4 から wake-up させてから、LPM0 で高速に SPI 通信をします。
1本の SS 信号線を SS と RQSS に使い分けることで配線を少なく、かつ master ドリブンでも slave ドリブンでも通信 を開始できます。 SS と RQSS は双方向からの出力なので、衝突リスクがありますが、これは SPI 通信ライブラリが衝突 回避します。
SS と SPI 通信のタイミングを制御することで、SPI 信号線(SOMI,SIMO,CLK)は、pull-up/down なしで、安 全に通信できます。 このタイミング制御の詳細は、3章で説明します。
2.2 マルチイベント処理
マスターとスレーブは、timer, ADC, スイッチ割り込み、SPI など複数のペリフェラルを並行動作できます。
このとき、並行動作させているペリフェラルから IO 完了などのイベント情報が非同期に発生します。 イベント情報が同 時に複数発生してもマルチイベント処理ライブラリがプールしますので、アプリケーションが順次イベント情報を取り出すこ とで、もれなく処理できます。 イベント情報はユーザ定義可能です。
---> 参照ドキュメント:MSP430 複数 IO の管理方式 Ver3
---> イベント情報 :example 中の driver.h ・・device ID(uint16_t)
イベント情報は複数非同期に発生しますので、これを他の master/slave に送る SPI通信メッセージも非同期に次々 と発生します。 これは、メッセージマネージャがバッファにプールしますので、ここから順次取り出して SPI 通信で送ること で対処できます。
5
master が SPI 通信中でも、別の slave からは RQSS が送られてきます。 RQSS を受けたslave-ID(bit 情報) は、PIO のIO-requestにプールされますので、SPI 通信が完了した後で、プールされていたslave-IDを取り出して その slave に SPI ポーリングします。 これにより RQSS を取りこぼすことなくマルチスレーブの処理が行えます。
---> 参照: example プロジェクト(zip)のソースコード、 main_multiSPI4_MstXX.c
3 SPI マルチスレーブ通信
Version 3 では、master と slave でやり取りするSSとRQSSの仕様を簡素化しました。 SS は「通信中は on にする」 の一般的な仕様に戻しました。 また、FR59xx 系の wake-up 時間に対応するように改造しました。
SPI ライブラリの機能と API は、example プロジェクト(zip)にある SPI_PIO_Driver.h を参照してください。
3.1 通信データ書式
通信は双方向でパケット(ヘッダ+データ)を交換します。
* send data format: size(n),data1,data2,....,data(n-1) * receive : size(m),data1,data2,....,data(m-1) 通信パケットは可変長です。 マスター/スレーブの指定size(n/m)の大きい方が実際の通信サイズになります。 masterとslaveのSPI-ISRが、最初のsize(n)とsize(m)を比較して、通信サイズを判定します。 通信最大サイズは _SPI_MaxSz(default=16 bytes)として定義されており、fail-safeのためチェックされます。 送信と受信の通信バッファは char abc[_SPI_MaxSz]; のように2組用意します。 通信メッセージを管理するメッセージマネージャは、dataの一部を下記用途に使います。 data1 : slave-ID
data2,data3 : master=コマンド、 slave=レスポンス data(n-1/m-1) : endマーク= “]”
メッセージマネージャは、sizeとendマークの適否、コマンド/レスポンスのコードをチェックして、ビットズレ、バイト落ちなどの 通信errorを検出します。 最小パケットは5bytes (size,data1,data2,data3,end)になります。
3.2 SPI マルチスレーブ通信の詳細
Figure 3 は、通信dataが正しく送られるかtestする機能を使い、SPI通信中の信号をオシロスコープで観測したものです。 黄色:SS信号線、 青:SPI CLK線
6
1) masterがSSでslaveを指定して、SPIポーリングでtestコマンドを送信 2) slaveがtest結果をかえすため、masterにRQSSを送り、
masterがSPIポーリングにより、test結果のACKレスポンスを受信
3.2.1
master からの SPI 通信
Figure 3の 1)master SS の動作を説明します。 1) masterの動作
[動作]
masterが行う、下記の①~⑤ 「SSの出力とSPI通信を組み合わせた動作」を、SPIポーリングと呼びます。 ① SPI ready(SPI reset off)にする -> SPI CLK 有効(inactive High)になる
② SS on(Low-> High)を出力する
③ SS on を維持してSPI通信を開始して通信メッセージの送信と受信を実行する ④ SS off(High-> Low)を出力する
⑤ SPI stop(SPI reset on) する -> SPI CLK不定(Hi-Z)になる [工夫]
LPM4 wake-upの工夫
②のSS onをslaveが受けると、LPM4からwake-upしますが、これには delay*がかかります。 masterはこのdelayを置 いてから次の動作をする必要があります。 delayを入れないと、slaveは先頭の数バイトを取りこぼします。
exampleプロジェクトの*wake-up delayは、FR5969=max 10usにマージンを加えて13us に設定。 SSとRQSS衝突防止の工夫
②のSS onを出力する前に、SS信号線を入力+pull-downに切り替えて、入力=Low(RQSSが来ていない)を 確認します。
SPI信号線のpull-up/down不要の工夫
最初、masterは①のSPI ready にします。 これでCLK 有効 になります。 次にmasterが②のSS onを出 力すると、slaveはwake-upしてSPI通信に入ります。
最後、masterが④のSS offを出力すると、slaveはSPI通信を停止します。 この後、masterが⑤のSPI stop すると CLK不定になります。
つまり、slaveがSPI通信状態になるのは②~③のSS onの間で、必ずmasterはSPI ready: CLK 有効です。 masterがSPI stopしてCLK不定(Hi-Z)の時は、slaveはSPI 通信を停止しています。
CLK不定(Hi-Z)の挙動は、Figure 3 と Figure5 のCLKが徐々にH->Lに下降している部分です。 これはmasterがSPI stopしたためCLK不定(Hi-Z)になり、CLK信号線の電荷が徐々に抜けて下降線を描 きます。 この下降途中でslaveがSPI readyだと、クロックありと誤認識してビットズレになるリスクが有ります。 ** 最近のデバイスの入力は、Hi-Zになっているのが、このリスクの理由です。**
7 2) slaveの動作
[動作]
slaveは、masterのSPIポーリングに合わせて、次の動作をします。
① slaveはSPI stop(SPI reset on)のまま、LPM4でSS on割り込みを待つ ② SS onがくると約5~10usでCPUがwake-upする
③ SPI ready(SPI reset off)に設定し、SPIステータスをIO_busy にする
(IO_busyとは、マルチイベントライブラリ中のペリフェラルのステータス情報を「使用中」にします) ④ LPM0でSPI通信を行い、CLK信号と同期して通信メッセージの送信と受信を実行する
⑤ SS off がきたらSPI stop してIO_busyを解除し、再度SPI通信が可能な状態に復帰する [工夫] IO_busyの役割と工夫 システムは複数のIOを並行動作(非同期IO:IO完了を待たない)させて、IO完了待ちのあいだもマルチイベントで 他の処理をして、システムのスループットを上げます。 反面、SPI通信中に、別のイベントにより自分自身がSPI通信を 2重コールするケースがあるので、IO_busy中はSPIへのアクセスをしないことで2重コールを回避します。 これはペリフ ェラルの排他処理の代わりです。 SPI通信開始の工夫
①では、先にSPI通信の準備(SPI設定と送信と受信バッファ設定)をしてから、SPI stopのままSS onを待ちます。 これにより、SS onがきたらSPI readにするだけでSPI通信が開始されます。 SS onが来てからSPI通信の準備をして いると、その遅延のために高速通信では取りこぼしが起きるリスクがあるので、それを回避しています。
SPI通信終了の工夫
SS offを確認してから、SPI stopしてIO_busyを解除します。 これにより、SS on 中に次のSPI通信が2重にコール されるのを防止します。 マルチイベント処理の工夫 ①のSS onを待つのは非同期IO(IO完了を待たない)です。 他のイベントが発生すれば、そのイベント情報がアプリ ケーションに通知され、その対応処理を進められます。 SS onもイベント情報の一つです。 これは、マルチイベント処理ライブラリ を使う利点です。
3.2.2
スレーブから SPI 通信を要請
Figure3の 2)slave RQSS の部分の動作を説明します。 1) slaveの動作 [動作] slaveは、送信する通信メッセージが発生すると、次の動作をします。 ① RQSSを出力して、SPIステータスをIO_busyにする ② LPM4でmasterからのSPIポーリングを待つ ・・ここは前項 3.2.1 2) と同じ動作8 [工夫] IO_busyの役割と工夫 SS onのとき、つまりSPIポーリングを受けているIO_busyのときは、RQSSを送るのを防止します。 また、すでにRQSS を送っていてIO_busyのときも、RQSSを送るのを防止します。 さもないと、煩雑にmasterにRQSSを送ってしまい、 masterのRQSS処理スループットを低下させます SSとRQSS衝突防止の工夫 RQSSを出力する前に、SS信号線を入力+pull-downに切り替えて、入力=Low(SSが来ていない)を確認しま す。 LPM4 wake-upの工夫
masterをLPM4からwakeupさせるためには、wake-up delay時間が必要です。 RQSS信号をhigh 13us維持し て、これをdelayの代わりにしています。 もし、このパルス幅が少ないと、masterがwake-upしたときに入力=Lowとな り、RQSSなしと誤認識されます。 2) masterの動作 [動作] masterは、送信する通信メッセージがない時は、下記の動作をします。 ① RQSS on割り込みを LPM4 で待つ ② RQSS onを受けて約5~10usでCPUがwake-upする
③ RQSS を受けたslave-IDが、PIO のIO-requestにプールされる
④ master のアプリケーションに、RQSS on 割り込み発生のイベント情報が通知される
⑤ アプリケーションは、IO-requestからslave-IDを取り出して、該当 slave にSPI ポーリングをする [工夫]
複数のRQSSを受ける工夫
PIOのIO-request に、RQSSを受けたslave-IDが8bit情報(slave1~slave8)として記録されます。 アプリケーションが、ここから一つずつslave-IDを取り出して、順番にSPIポーリングをして処理します。 slave-IDを取り出す関数 uint8_t SPIm_get_SID( uint8_t *S_list ); が用意してあります。 マルチイベント処理の工夫
①のRQSS onを待つのは非同期IO(IO完了を待たない)です。 他のイベントが発生すれば、そのイベント情報がア プリケーションに通知され、その対応処理を進められます。 RQSS onもイベント情報の一つです。
これは、マルチイベント処理ライブラリ を使う利点です。
4 性能測定結果
9
4.1 master から SPI 通信するケース
Figure 3 1)master SS では、master が test コマンド+data の 16 bytes を通信した場合の観測例では、 SS on の SPI 通信時間は 140us です。
実効 0.9 Mbps (8*16B/140us)換算になります。
4.2 salve から SPI 通信を要請するケース
・ Figure 4 は、slave が通信要求 RQSS を出して、master が SPI ポーリングにより ADC 測定データ 15 bytes を 受信した場合の観測例です。 RQSS から通信完了 SS off(Low)までの時間は 220 us です。
実効 0.55 Mbps(8*15B/220us)換算になります。
Figure 4: getting ADC data from a slave(15 bytes)
4.3 slave の情報を他の slave に配信するケース
Figure 5 は、次の複合動作をしたときの観測例です。
slave ボードの switch を押して自身の LED を点灯させたのち、master に RQSS を送って master が SPI ポーリングにより LED 点灯情報(7bytes)を受信し
他の slave5台に LED 点灯情報(7bytes*5台)を配信
RQSS から、slave5台へ配信完了(CLK off)するまでの時間は 1.1 ms です。 実効 0.3 Mbps (8*7B*6units/1100us) 換算になります。
10
5 補足
1) SPI-ISR 本書の SPI 通信は、可変長パケットを採用しています。 固定長よりもスループットが上がるとの思惑からです。 SPI-ISR は受信割り込みによりソフトウェア制御で通信をしていますので、高速通信するには MCLK を極力早くする必 要があります。 また slave の MCLK は、master の MCLK と同等以上でないと通信遅れのリスクがあります。 Figure4の CLK が束に固まっている部分が SPI baud rate=2Mbps で動作している部分で、その間の隙間が、SPI-ISR がソフトウェア制御している部分です。 SPI の baud rate をさらに上げても、この隙間部分は小さくなりません ので、MCLK=16MHz(max)では 2Mbpsが限界かなと思います。 双方向の DMA が使えると、もっと容易に高速 にできると思います。 2) PIO の DIR 制御 SS と RQSS の出力と入力を切り替えて衝突防止の確認をしていますが、PIO の DIR を切り替えると不要な割り込み が発生するケースが有ります。 DIR 切り替えの前に不要な割り込み防止の回避制御が必要です。 詳細はソースコー ドで確認してください。 3) 制限事項 SS と RQSS の割り込みにより、LPM4 から wake-up するのに必要な時間は、デバイスディペンドです。
FR57xx と F5xxx/F6xxx (normal mode) の LPM4 からの wake-up 時間は 150us 前後必要となり、SPI 通 信のスループットが低くなるので、インプリメントは見送っています。