STM32 CortexM3MCUに接続されたフラッシュメモリチップ用のドライバを作成する必要があります。チップはSPIバスを介して制御されます。MCUの統合SPIペリフェラルを使用するつもりでしたが、残念ながら、フラッシュチップコマンドの長さが14ビットであるのに対し、8ビットまたは16ビットのデータパケットしかサポートしていません。したがって、GPIOを使用してプロトコルを最初から実装する必要があります。私の質問は、信号の正しいタイミングを確保するための正しい方法は何ですか?私は現在、割り込みを無効にしてGPIOラインのアサートとデアサートの間に遅延を挿入することを考えていますが、それは私にはかなり信頼できないようです。より良い方法はありますか?
3 に答える
Jebの答えが推奨される方法であり、可能であればハードウェアSPIを使用する必要があります。また、DMAがオプションである場合も同様です。
何らかの理由でハードウェアSPIを使用できないが、GPIOを介して「ビットバンギング」を使用して実装する必要があることがわかった場合は、MCUのタイマー/PWMハードウェアで使用できるオプションを確認する必要があります。あなたが投稿したリンクのように、鈍い「趣味のバーンアウェイ遅延」を使用することはできませんし、使用すべきではありません。リアルタイムのパフォーマンスはがらくたになり、CPUを100%占有します。
ほとんどのMCUタイマーにはピン出力機能があり、タイマーが経過するとピンの状態を変更できます。その場合、擬似コードは次のようになります。
- 次に送信するビットが1か0かを判別します。
- それに応じてMCU極性レジスタを設定し、ピンがハイレベルまたはローレベルに切り替わるようにします。
- タイマーが経過したら、おそらく割り込みによって、極性をもう一度設定する必要があります。これを行う方法は、ハードウェアに大きく依存します。
- データ(MOSI)をビットバンすると同時に、クロックとチップセレクトを生成する必要があります。クロックは、データと同じ方法で生成できます。または、そのオプションが使用可能な場合は、PWM信号を介して生成することもできます。データ送信中にピンをローに引き下げるだけでよいので、チップセレクトは最も簡単な部分です。
最後に、特定のMCU用のソフトウェアSPIを作成する方法について、アプリケーションノートまたは公式の例がいくつかある可能性があります。
可能であれば、SPIとDMAのビルドを使用することをお勧めします。
データを14ビットの倍数のサイズのバイト配列に再マッピングできます。したがって、毎回7*4ビット=28バイトの倍数を送信する必要があります。
次に、8ビットサイズの標準SPIを使用できます。
しかし、これはGPIOをビットバンギングするよりもSPI/DMAの方がはるかに高速であるはずです。
不明確なデータ長を使用する一部のデバイスは、トランザクションの開始時に、最初の「1」の前にクロックインされたすべての「0」ビット、または最初の「1」の前にクロックインされたすべての「1」ビットを無視するように設計されています。 「0」。デバイスがたまたまそのように設計されている場合、対象のビットとともに 2 つの「ジャンク」ビットをクロック出力することにより、8 ビットまたは 16 ビットの SPI モードを使用できる場合があります。