この数日間で STM32 の SPI 通信を学び、今日は学習ノートを書きます。
(一)SPI 通信とは?#
SPI(Serial Peripheral Interface)は、Motorola 社によって開発された汎用データバスで、4 本の通信線があります:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)。これは同期式で全二重通信を行い、バスに複数のデバイスを接続することができます(一主多従)。
(二)SPI ハードウェア回路#
SPI のハードウェア回路図は以下の通りです(画像がやっと送信できました!):
ここで SCK クロック線はすべてのデバイスに接続され、クロック信号を送信します;
MOSI はホストからスレーブへの受信線、MISO はホストがスレーブから受信する線です;
SS はチップ選択で、ホストとすべてのスレーブにはそれぞれチップ選択が接続され、スレーブを指定するために使用されます。
(三)SPI タイミング#
SPI タイミングの基本単位は:開始、終了、1 バイトの交換です。
USART や I2C と比較して、1 バイトの交換は SPI の大きな特徴であり、このプロセスはホストとスレーブが直接データを交換するもので、一方が送信し、他方が受信するのではありません。
開始と終了のタイミングは比較的簡単で、SS を高くするか低くするだけです:
1 バイトの交換は CPOL と CPHA の 2 つのパラメータによって 4 つのモードが決まります。
CPOL:アイドル状態の SCK レベル。
CPHA:SCK の立ち上がりまたは立ち下がりでデータをキャプチャします。
4 つのモードのタイミング図は以下の通りです:
(四)ソフトウェア SPI#
ソフトウェア SPI では、4 つのピンを選択して構成する必要があります。その中で SS、SCK、MOSI はプッシュプル出力に、MISO はプルアップ入力に設定します:
次に、3 つのタイミング基本単位を作成します:
その後、これらの 3 つのタイミング基本単位を使用して SPI 通信の完全なタイミングを構成できます。
ここでは W25Q64 のいくつかの関数を作成しました。主にコマンドの方式で、まず開始タイミングを送信し、次にコマンドを送信し、コマンドのいくつかのパラメータを送信し、最後に終了します。ここでは ID を読み取るコマンドを示します:
(五)ハードウェア SPI#
STM32 内部には SPI 通信の周辺機器があり、その基本構造は以下の通りです:
I2C とは異なり、SPI では送信と受信それぞれにバッファがあり、共通のシフトレジスタを使用します。
構成プロセスは以下の通りです:
ここで、MOSI と SCK をリダイレクトプッシュプル出力に設定し、他の 2 つはそのまま(SS は SPI 周辺機器で使用されないため、NSS はその機能を持っていません)、次に構造体を構成します。構造体のパラメータは以下の通りです:
SPI_BaudRatePrescaler—— ボーレート、伝送速度を決定します
SPI_CPHA—— 前述の CPHA
SPI_CPOL—— 前述の CPOL
SPI_CRCPolynomial——CRC チェック、ここでは使用しませんが、0 にはできません。なぜ知っているかは聞かないでください。
SPI_DataSize—— データサイズ、8 バイトで伝送します。
SPI_Direction—— 伝送方向、全二重を選択します。
SPI_FirstBit—— 最上位ビット先行か最下位ビット先行か、最上位ビット先行を選択します。
SPI_Mode——SPI モード、ホストモードを選択します。
SPI_NSS——NSS、マルチマスター用で、使用しないので、適当に選択します。
その後、開始と終了のタイミングコードは変更する必要がなく、データ交換のコードを変更します:
コードは主に以下のタイミング図に従っています:
以上が SPI のすべての内容です、886.