最初に、SPIモジュールの内部構造を簡単に説明します。図3に「STM32F3シリーズ」のSPIモジュールの概要を示します。*1)
SPIモジュールは、マスターでもスレーブでも使用可能です。インタフェース信号を制御する回路は、「シフトレジスタ」「クロック制御」「NSS制御」に分けられます。シフトレジスタはMISOから入力されたデータを1ビットずつシフトしながらLSB側から取り込み、同時に1ビットずつMSB側へ押し出して、MOSIから出力します。
マスターの場合、クロック制御はクロックを生成し、シフトレジスタのクロックとして使用すると同時に、SCKから出力します。スレーブの場合は、入力されたクロックをシフトレジスタのクロックとして使用します。
NSSは、マスターの場合は出力信号になり、通信時にローレベルへ落ちます。スレーブの場合は入力となり、SS信号として働きます。
汎用IOは、SPIとは独立したモジュールです。ソフトウェアで複数のGPIO(General Purpose IO)端子をハイレベル、ローレベルに制御可能です。
*1)参考資料:STM32F3 トレーニング資料(閲覧には会員登録が必要です)
SPIは、通常1つのマスターに対し1つのスレーブと通信します。マスターから出力されたNSSがスレーブのNSSに接続され、マスターがNSSをローレベルに制御することでスレーブを活性化し、通信します。しかし、NSS端子は1本しかありませんので、対応するスレーブは1つに限られます。そこで、NSS端子ではなく複数の汎用IO端子を、複数のスレーブのNSSにそれぞれ接続します。マスターは、通信したいスレーブを選択する場合、該当のSPIに接続されている汎用IOをローレベルにします。この時MOSIとMISOとSCKは共通信号としてすべてのスレーブに接続しておきますが、NSSがローレベルになっているスレーブだけがクロックとデータを受け取るため、その他のスレーブは、NSSがハイレベルなので、MOSIとMISOとSCKを無視します。
このようにすれば、1つのマスターに複数のスレーブを接続した状態で、通信したいスレーブだけを選択することができます。
この場合、NSSで選択するスレーブは1つでなければなりません。2つ以上のスレーブを選択すると、2つのスレーブからMISOラインに同時に出力されるデータが衝突し、正常なデータが得られなくなります。もしマスターが複数のスレーブと通信したい場合は、必ず時分割で行う必要があります。
マスターが複数のスレーブに同時に同じデータを送りたい場合も、この方式を応用することができます。その場合は、MOSIラインのみ使用し、MISOラインはオープンにしておきます。そして、該当するSPIのNSSにつながっている汎用IOを同時にローレベルにし、マスターでMOSIからデータを出力すると、選択されている複数のSPIのシフトレジスタに同じデータが同時に入ります。活用例としては、同時一斉配信などに使えます。
Copyright © ITmedia, Inc. All Rights Reserved.