SPI通信
SPI通信とは
マイクロコントローラとその周辺ICの間でよく使用されるインターフェースの1つ
センサー、A/Dコンバータ、D/Aコンバータ、シフト・レジスタ、SRAMなどとマイクロコントローラの接続に使用される。
メインとサブノードがあり、クロックを生成する方がメインとされる。
メインでサブノードを操作する。
例:mbedで温度センサの値を取得する場合
mbed側がメイン、温度センサ側がサブノード。
特徴
一つのメインから、複数のサブノードを操作可能
ただし、複数の機器同時にデータの通信は出来ない。
I2C等に比べて、通信速度が早い。(対応しているクロック周波数が高い)
CSにて、デバイスを選択
送受信(MOSI,MISO)同時にデータの送受信が可能
必要なライン
メイン側:
CS:チップセレクト
使用するサブノード(IC)を選択するのに使用される。
メインがCSのHigh、Lowを設定する。
基本は、データを送りたい時に、Low、データを送らない時はHighにすることが多い。
これは、ICによる為、使用するICのデータシートを参照する。
CSを複数ノード選択状態にすると、サブノードからデータが送信されているのか、メインが判別出来ず
壊れる可能性がある。
SCLK:クロック
データの送受信のタイミングに使用される。
MOSI(Master Out Slave In):データを送信
データを送る
MISO(Master In Slave Out):データを受信
送られたデータを受け取る
サブノード側:
SDO(Serial Data Out):データを送信
SDI(Serial Data In):データを受信
※ICによって、MOSIだったり、SDIだったり書かれるので、混同しない様に、意味を考えるとよい。
接続:
https://scrapbox.io/files/63210f4fc4ad2f001d6e0bff.svg
※サブノードでも、MOSI,MISOが使われる場合がある。
その場合は、MOSIどうし、MISOどうしを接続する。
データの同期
シリアル・クロックのエッジによって、データのシフト/サンプリング処理を同期する。
クロックの立上がりエッジと立下がりエッジのうちどちらでデータをサンプリング/シフトするかを選択する。
SPIを介して送信されるデータのビット数については、各デバイスのデータシートを参照する。
メインでは、サブノードの要件に適合するように、CPOLビット、CPHAビットによって、クロックの極性と位相を選択する。
アイドル状態とは:
送信を開始するためにCSがハイからローに遷移するまでの間
送信を終了するためにCSがローからハイに遷移するまでの間
CPOL(Clock POLarity)ビットとは
アイドル状態におけるクロック信号の極性を設定する。
CPHA(Clock PHAse)ビットとは
クロックの位相を選択する
データのサンプリング/シフトにクロックの立上がりエッジと立下がりエッジのうち、どちらを使用するのかを設定する。
table:SPI
SPIモード CPOL CPHA アイドル状態のクロックの極性 データのサンプリング/シフトに使われるクロックの位相
0 0 0 Low データを立上がりエッジでサンプリング、立下がりエッジでシフト
1 0 1 Low データを立下がりエッジでサンプリング、立上がりエッジでシフト
2 1 0 High データを立下がりエッジでサンプリング、立上がりエッジでシフト
3 1 1 High データを立上がりエッジでサンプリング、立下がりエッジでシフト
※どのモードで通信を行うかは、サブノードの仕様によって決定する。
クロックの立下りエッジとは
クロックの信号が、HighからLowになったタイミング
クロックの立ち上がりエッジとは
クロックの信号が、LowからHighになったタイミング
データ通信の流れ
SPIモード0の場合
メインによって、CSをHighからLow設定に設定し、サブノードを選択する。
モード0の場合、アイドル状態のクロック極性が、Lowの為、
CSがHighからLowになる間、クロックはLowの状態になる。
CSがLowになった後、クロックがLowからHighになった時に、データの格納が開始される。
データを立下がりエッジになった時でサンプリング、立上がりエッジでシフトなので、
クロックが、HighからLowになった時に、その時のMISO,MOSIのデータを取得する。
次のクロックのLowからHighになったタイミングで、格納する場所が隣のビットに移動(シフト)する。
これを繰り返すことにより、送信する為のデータを格納していく。
参考:
SPIとは:https://tmytokai.github.io/open-ed/activity/IO/text06/page01.html
SPIの解説:https://synapse.kyoto/glossary/spi/page001.html
SPIの基本を学ぶ:https://www.analog.com/jp/analog-dialogue/articles/introduction-to-spi-interface.html
https://synapse.kyoto/glossary/spi/page001.html
DAC
https://akizukidenshi.com/catalog/g/gI-11988/
参照:
P961
https://www.st.com/resource/en/user_manual/dm00105879-description-of-stm32f4-hal-and-ll-drivers-stmicroelectronics.pdf
SPI参考資料
https://www.stmcu.jp/wp/wp-content/uploads/files/presentation-ja/STM32MP1/39_STM32MP1-Peripheral-Serial-Peripheral-interface-(SPI)_J.pdf
https://www.youtube.com/watch?v=HLCTDL_5QWw
参考:AD5308IC,AD5162使用プログラム
SPI通信設定(レジスタ):
https://rappy.hatenablog.com/entry/2020/05/22/204512
https://paiza.io/projects/49QXyyZ3Zy7yx8XXtZS_Kg?language=c
その他、参考
https://wazalabo.com/pic-spi.html
CPOLの設定方法について調べる必要がある。
関連:
LPS25HB使用方法
SPI通信同期変更