こんにちは
i.MX8M Mini の M4 コアの場合、ECSPI ペリフェラルと SDMA を使用して 32 Mbps の速度でデータを読み取る場合 (データシートでは ECSPI の最大速度は 52 Mbps と記載されています)、使用されているサンプルは「 SDK_2.5.0/boards/evkmimx8mm/cmsis_driver_examples/ecspi/sdma_loopback_transfer」です。しかし、このサンプルではデータ読み取りごとに SPI と DMA の両方を再初期化するため、多くの時間が無駄になります。ECSPI_MasterTransferSDMA 関数で再初期化する必要のない関数とステートメントはどれですか? また、クロック周波数を上げましたが、問題は解決しません。以下に私のコードを示します。
void main(void)
{
...
}
ソースコードを添付する
こんにちは、@sofia_0571さん
お元気でお過ごしのことと思います。
関数内のフラグを使用してセットアップをバイパスする代わりに、ECSPI_MasterTransferSDMA を高速ループ専用にし、不要な処理を取り除いてみてください。準備が既に完了していることを前提とした「高速トリガー」関数を作成します。
例えばこんな感じです。
status_t ECSPI_MasterTransferSDMA_FastTrigger(ECSPI_Type *base, ecspi_sdma_handle_t *handle, uint32_t size)
{
handle->state = kECSPI_Busy;
xferConfig.dataSize = size;
xferConfig2.dataSize = size;
SDMA_SubmitTransfer(handle->txSdmaHandle, &xferConfig);
SDMA_SubmitTransfer(handle->rxSdmaHandle, &xferConfig2);
handle->rxInProgress = true;
SDMA_StartTransfer(handle->rxSdmaHandle);
ECSPI_EnableDMA(base, kECSPI_RxDmaEnable, true);
handle->txInProgress = true;
SDMA_StartTransfer(handle->txSdmaHandle);
ECSPI_EnableDMA(base, kECSPI_TxDmaEnable, true);
return kStatus_Success;
}
よろしくお願いいたします。
サラス。