S32K144 SPIをスレーブモードでDMAを使用して構成した場合、データ受信時にデータミスアライメントが発生します(例えば、正しいシーケンスは1、2、3、4、5、6であるべきところ、実際に受信されるデータは3、4、5、6、1、2となり、ミスアライメントを示しています)。オシロスコープを使用して通信データシーケンスを解析すると、シーケンスは正常であり、最初の通信時にSPIが受信するデータも正常です。現在の通信方法は、マスターおよびスレーブマイクロコントローラが定期的にSPI通信をトリガーするというものです。
IDE:S32 Design Studio for ARM バージョン2.2、カスタムボード。
こんにちは、 @GLBさん
どのソフトウェアとIDEを使っていますか?自分の側で問題を再現できるよう、コードと設定を共有していただけませんか?
また、カスタムボードを使っていますか?それとも評価ボード(EVB)ですか?
BR、VaneB
こんにちは、 @GLBさん
受信データの不整合の原因として、新しいトランザクション開始前にLPSPI RX FIFO状態とDMA RX TCD状態間の同期が不完全であることが考えられます。
最初に受信したフレームシーケンスは正確ですが、RX FIFOに保留中のデータが含まれている場合、その後の転送でシフトされる可能性があります。DMA要求を無効にし、LPSPIのFIFOをクリーンアップし、SPIとDMAステータスフラグをクリアし、RX/TX DMA TCDを読み込み直してから新しい転送を開始することができます。同様の手法は、Thread SPIスレーブDMAチップセレクトリスタートにも実装されています。S32K144デバイスに特有のものではありませんが、有用な参考資料として役立ちます。
さらに、S32K1 SDKの例lpspi_dma_s32k144も参考文献として利用できます。
マスターは10ms周期でデータを送信し、スレーブも10ms周期でDMAをトリガーしてデータを転送します。この通信方法は妥当でしょうか?スレーブがDMAでデータを転送する前にFIFOをクリアしたとしても、データのずれは依然として発生する可能性がありますよね?
こんにちは、 @GLBさん
S32K144のマニュアルを確認したところ、SPIには受信割り込みと送信割り込みしかなく、チップセレクト割り込みはなく、DMAには転送完了割り込みしかないことがわかりました。SPI受信割り込みを設定してみましたが、依然として位置ずれが発生します。SPI自体に頼るだけではこの問題を解決できないようです。SPIの正確性を確保するためには、マスターとスレーブの間に同期信号を追加する必要があると考えています。他に何かご提案はありますでしょうか?よろしくお願いいたします。