公式アカウントをフォロー+スターを付けて、楽しいコンテンツをお見逃しなく
転送元 | STM32
SPIとは、Serial Peripheral Interface(シリアル・ペリフェラル・インターフェース)の正式名称で、主に組み込みシステムで使用される近距離通信用の同期式シリアル通信インターフェースです。
SPI には幅広い用途があり、ディスプレイ モジュール、クロック チップ、メモリ チップ、温度センサーなどの多くのデバイスが SPI インターフェイスを使用して通信します。
通常これらのデバイスはスレーブデバイスとして使用され、シングルチップマイコンはマスターデバイスとしてそれらを制御しますが、今回はSTM32を組み合わせて一般的なSPI通信の異常問題を解析してみます。
STM32 SPIの基本内容
ほとんどの STM32 チップには複数の SPI ペリフェラルがあり、外部 SPI デバイスと半二重/全二重同期シリアル通信を実行できます。
1.SPI特性
3線全二重、2線単信同期伝送
8ビットまたは16ビットの伝送フレームフォーマット選択をサポート
マスターまたはスレーブモード動作をサポート
プログラム可能なクロック極性と位相
MSB または LSB データ順序をサポート
データを送受信するための DMA をサポート
その他の機能については、「STM32 リファレンスマニュアル」を参照してください。
2. ピンの説明
MISO:マスター入力/スレーブ出力データ。
MOSI:マスター出力/スレーブ入力データ。
SCK:クロック (マスター出力、スレーブ入力クロック);
NSS:スレーブデバイスの選択、理解可能なチップ選択信号。
3. SPI タイミング
SPI のタイミングで注意すべきパラメータは 2 つあり、それはクロック位相とクロック極性です。STM32 では、SPI タイミングは 2 ビット CPOL と CPHA によって決定されます。
これら 2 つのパラメータはソフトウェアで設定でき、次の図に示すように 4 つのタイミング関係に分けることができます。
4. データフレームフォーマット
シリアル ピアツーピア データ送信は MSB と LSB、つまり最上位ビットが最初、または最下位ビットが最初に分割されます。(注: 左端のビットが最上位ビットです)。
たとえば、バイトを送信するには: 0x95 (1001 0101)。
MSB (上位ビットファースト) による場合、送信シーケンス: 1001 0101。
LSB (下位ビットが先) に従っている場合、送信順序は逆になります: 1010 1001。
STM32 SPIパラメータ設定
通常、STM32 の SPI は外部スレーブに接続するマスターとして使用されますが、スレーブとの正常な通信を確立するには、スレーブのパラメータと一致する必要があります。
ここでは、[SPI フラッシュを読み書きするための SPI ホストとしての STM32] を例として取り上げます。主な設定パラメータは、双方向全二重、ホスト モード、8 ビット データ、MSB などです。
1. 標準周辺ライブラリ構成
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主机模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位数据
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //时钟极性:空闲为高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //时钟相位:第2个时钟沿捕获
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件控制NSS信号
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //波特率预分频值为4
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 位开始
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
▲ 左右にスワイプして完全なコードを表示します
2. STM32CubeMX 構成
最初に全二重ホスト モードを選択し、次に次のパラメータを段階的に設定します。ここのボーレート クロックは灰色で設定できず、システム クロックと分周クロックによって決まります。
これらの設定パラメータは比較的理解しやすいもの (明瞭で明瞭な英語) です。理解できない場合は、リファレンス マニュアルを参照してください。
STM32 SPI FAQ
SPI は比較的単純ですが、実際のアプリケーション プロセスではまだ奇妙な問題がいくつかあります。以下のケースで SPI の一般的な問題を分析します。
質問 1:NSSチップ選択の問題
一部のエンジニアは、ハードウェア NSS を使用してスレーブを制御し、NSS 信号が自動的に制御されると考え、その結果、スレーブが動作しなくなることがあります。
分析の理由: STM32 SPI の NSS 信号はチップ セレクト信号であり、ハードウェア制御として「有効」にすることができます (上記のパラメーター構成を参照)。
ただし、アプリケーションでは、NSS 信号 (高および低) を制御するために、次のようなソフトウェア操作も必要です。
SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);
▲ 左右にスワイプして完全なコードを表示します
解決策:通信タイミングに応じて、NSS 信号を High または Low に制御します (通常は Low が有効です)。
質問2: SPIピン多重化機能の問題
STM32 の SPI は多重化機能ですが、これまで標準ペリフェラル ライブラリを使用していた技術者は、多重化機能の設定を見逃して SPI が使用できなくなる可能性があります。
分析の理由:一部の SPI ピンは特殊機能ピンに対応します。たとえば、PB3 (MISO) は JTDO に対応します。設定されていない場合、このピンのデフォルト機能は JTDO の機能です。
この問題は以前はよく発生していましたが、現在では、STM32CubeMX ツールを使用して構成するときに多重化機能が自動的に構成されます。
解決策:公式規定を参照して、初期化コードで再利用機能を構成します (同時に HAL ライブラリを使用することをお勧めします)。
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
▲ 左右にスワイプして完全なコードを表示します
問題 3:クロックレートが高すぎる
エンジニアがSPI通信付きのモジュールを購入したところ、最大通信速度は8MB/sで、10.5MB/sの通信速度でも使用できるのですが、まれに通信異常が発生します。
分析理由:チップの公称最大レートは実際には比較的保守的な値であり、最大レートよりも条件が良い場合には使用できますが、安定性は保証されません。
STM32 SPI のクロック周波数はシステムクロックと分周によって決まりますが、技術者によってはこれらのパラメータを深く理解しておらず、使用できることがわかっても気にしない人もいます。
上の章の 21MB/s と同様、システム クロックを変更すると、この値も実際にはそれに応じて変化します。
解決策:最も簡単な方法は、分周値を変更することです。同時に、環境が厳しい場合には、シールド線の使用をお勧めします。(製品システム全体のリアルタイム性を確保しつつ、通信速度は可能な限り下げる必要があります)
質問 4:クロック位相の問題
多くのエンジニアは SPI のデバッグ時にデータの「シフト」の問題に遭遇しますが、データは送受信できるのになぜこの問題が発生するのでしょうか?
解析理由: SPI通信クロックはマスターから提供されており、電源投入時はマスター、スレーブの各信号が不安定であり、スレーブのクロック位相が一致していないとデータがずれたり、異常が発生したりする。時計に。
解決策:ソフトウェア上で SPI マスター デバイスとスレーブ デバイスのクロック位相を一致させ、通信プロトコル、CRC、チェックサム チェックなどを使用します。
------------ 終了 ------------
公式アカウントに注意し、ルールに従って技術交流グループに参加するには「 Jiagroup 」と返信し、さらに多くのコンテンツを表示するには「 1024」と返信します。
さらに共有を確認するには、「元のテキストを読む」をクリックしてください。