こんにちは、
私はIMXRT1172上でSDKのLPSPI EDMA転送API(2.16.100)を使って、SPIデータを同時に読み書きしています(つまり、同じサイズのバッファを持つ2つのDMAチャネルでのTX+RX転送)。残念ながら、EDMAコールバックは転送が実際に完了する前に呼び出されているようです。コールバック内でLPSPIのSR、FSR、RSRを確認すると、DMAは処理が完了したと考えているにもかかわらず、SPIはまだビジー状態であると考えていることがわかります。つまりMBFは設定されたままで、TXCOUNTは1です。
SR = 0x01000100 (MBF、WCF)
FSR TXCOUNT = 1、RXCOUNT = 0
RSR = 0x00000002 (RXEMPTY、!SOF)
もしTXだけを扱うなら、SPIペリフェラルがDMAから最後に読み込まれたバイトをまだ処理している可能性があるので、ある程度理にかなっているかもしれません。その場合、DMA周辺機器はRAMからSPIのデータTXレジスタへの最後のバイトの読み込みを終えていますが、SPIはそれを送信する作業をまだ必要としていました。
しかし、TXとRXを同時に行う場合、TXCOUNTが1ならRXCOUNTも1になるはずだと予想していました。つまり、DMAはすべてのTXデータがクロックアウトされるまでRXで完了してはならない。なぜなら、最後のバイトはSPI RXデータレジスタからDMAによってRAMに転送される必要があり、これは転送の最後のクロックサイクルでのみ発生するからである。
これは本当に問題なのでしょうか?
もしそうなら、SDKで問題ですか? それともハードウェアIPで?
DMAコールバック内でLPSPI SRをチェックして、SPIエラーが発生しているかどうかを判断できればと思っていました。
ありがとうございます
-m
こんにちは、 @nxp16 さん。
私たちの製品にご関心を寄せ、コミュニティをご利用いただき、本当にありがとうございます。
DMA完了とSPIバス完了は、2つの異なる概念です。
eDMAコールバックは、DMAエンジンがメモリとLPSPI FIFO/レジスタパス間で設定されたバイト数のデータの転送を完了したことを示します。これは必ずしも、LPSPIバスステートマシンが最後のフレームを完了した、あるいはアイドル状態に戻ったことを意味するものではありません。
LPSPIバスの完了を確認するには、SR[TCF]を確認するか、SR[MBF]がクリアされるまでお待ちください。
お役に立てれば幸いです。
よろしくお願いいたします。
5月
はい、しかしTX/RX転送の場合、DMAが完了した時点でTX_COUNTとRX_COUNTの両方がゼロになることを期待していました。つまり、RX DMAが最後のSPIクロックより前に完了することは不可能であるはずです。なぜなら、SPI周辺機器はその時間までにデータの最後のビットをRX FIFOにシフトしておらず、DMAは最後のバイトをRX FIFOにシフトするまでRAMにコピーできないからです。その場合、TXとRXの両方がDMAが完成する前に完了しているはずです。もしTXの転送だけなら、DMAがSPIより先に完了し、TX_COUNTはまだ1のままかもしれません。
ありがとうございます
-m
こんにちは、 @Mike_M3 さん、
ご意見ありがとうございます。
あなたの指摘はRXデータパスに関しても正しいです。RX EDMAチャネルが完了すると、期待されるRXデータはすでにRAMに移されています。しかし、これはLPSPIバスの完了とはまだ同じではありません。
TXCOUNT/RXCOUNTはFIFO占有率インジケーターです。RXCOUNT=0はDMAによってRX FIFOが消耗されたことを意味し、TXCOUNT=1は送信/コマンドFIFO内の保留中のエントリを1つ示すことがあります。LPSPIでは、送信FIFOはコマンドやTCRエントリにも使用されるため、TXCOUNTは単なるRX補完のミラーではありません。MBF=1は、LPSPIバスステートマシンがまだ完全にアイドル状態に戻っていないことを示します。
したがって、転送完了の条件としてTXCOUNT/RXCOUNTの等価性を使用することはお勧めしません。LPSPIバス完了条件については、代わりにSR[TCF]=1またはSR[MBF]=0を使用してください。割り込みベースの表示が望ましい場合は、kLPSPI_TransferCompleteInterruptEnableを有効にし、EDMAコールバックをDMA完了表示専用にしてください。
よろしくお願いいたします。
5月