2398412_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2398412_ja-JP

2398412_ja-JP

IMXRT1172 LPSPI EDMA転送APIを使用する場合、SPI転送が完了する前にDMA IRQハンドラが呼び出されます。

こんにちは、

私は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

Re: Using IMXRT1172 LPSPI EDMA transfer API, DMA IRQ handler called before SPI transfer is done

こんにちは、 @nxp16 さん

私たちの製品にご関心を寄せ、コミュニティをご利用いただき、本当にありがとうございます。

DMA完了とSPIバス完了は、2つの異なる概念です。

eDMAコールバックは、DMAエンジンがメモリとLPSPI FIFO/レジスタパス間で設定されたバイト数のデータの転送を完了したことを示します。これは必ずしも、LPSPIバスステートマシンが最後のフレームを完了した、あるいはアイドル状態に戻ったことを意味するものではありません。

LPSPIバスの完了を確認するには、SR[TCF]を確認するか、SR[MBF]がクリアされるまでお待ちください。

mayliu1_0-1784876065178.png

mayliu1_1-1784876092476.png


お役に立てれば幸いです。

よろしくお願いいたします。

5月

Re: Using IMXRT1172 LPSPI EDMA transfer API, DMA IRQ handler called before SPI transfer is done

はい、しかし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

Re: Using IMXRT1172 LPSPI EDMA transfer API, DMA IRQ handler called before SPI transfer is done

こんにちは、 @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月

Tags (1)
No ratings
Version history
Last update:
Tuesday
Updated by: