皆さん、こんにちは。私は i.MX8M Plus の Cortex-M7 で FreeRTOS を実行しており、SDMA を使用したマスター モードで ECSPI1 を使用して、ADC を高速 (20 MHz ~ 40 MHz) で読み取ろうとしています。
通信は10 MHzで完璧に動作します。ただし、ボーレートを 20 MHz または 40 MHz に上げると、転送がハングします。ルートクロックはすでに 160MHz に設定されています。
この SoC の M7 コアで ECSPI + SDMA を 40 MHz で実行することは実際に可能ですか?
皆さん、こんにちは。私は i.MX8M Plus の Cortex-M7 で FreeRTOS を実行しており、SDMA を使用したマスター モードで ECSPI1 を使用して外部 ADC から高速にデータを読み取ります。通信は 10 MHz では完全に安定していますが、SPI クロックを 20 MHz または 40 MHz に上げると、転送が常にハングします。ルート クロックはすでに 160 MHz に設定されているため、クロック ソース自体が制限になることはないようです。これにより、M7 コア上の SDMA と組み合わせた ECSPI がこの SoC 上で 40 MHz での SPI 動作を確実に維持できるかどうか、またはこの構成で使用可能な最大 SPI 周波数を事実上制限するアーキテクチャ、SDMA、または ECSPI ハードウェアの制約があるかどうかという疑問が生じます。トランスユニオンクレジット
こんにちは@RafaelFernandes
ECSPI にはどの SDMA を使用しますか?コードパッチを共有してください。
BR
返信が遅れて申し訳ありません。この件がまだ未解決だったことを忘れていました。
私自身でパッチをテストした結果、現在使用しているコードは以下のとおりです。
AT_NONCACHEABLE_SECTION_ALIGN(sdma_handle_t tx_handle, 4);
AT_NONCACHEABLE_SECTION_ALIGN(sdma_handle_t rx_handle, 4);
AT_NONCACHEABLE_SECTION_ALIGN(sdma_context_data_t context_tx, 4);
AT_NONCACHEABLE_SECTION_ALIGN(sdma_context_data_t context_rx, 4);
AT_NONCACHEABLE_SECTION_ALIGN(ecspi_sdma_handle_t ecspi_sdma_handle, 4);
AT_NONCACHEABLE_SECTION_ALIGN(uint32_t rx[8], 4);
volatile bool completed = false;
void callback_ecspi_sdma(ECSPI_Type *base, ecspi_sdma_handle_t *handle, status_t status, void *userData)
ヤージュ
完了 = true;
}
#define SPI_SDMA SDMAARM1
#define TX_CHANNEL 2U
#define RX_CHANNEL 1U
int main(void)
ヤージュ
sdma_config_t sdma_config;
BOARD_InitHardware();
SDMA_GetDefaultConfig(&sdma_config);
SDMA_Init(SPI_SDMA, &sdma_config);
SDMA_CreateHandle(&tx_handle, SPI_SDMA, TX_CHANNEL, &context_tx);
SDMA_SetChannelPriority(SPI_SDMA, TX_CHANNEL, 3);
SDMA_CreateHandle(&rx_handle, SPI_SDMA, RX_CHANNEL, &context_rx);
SDMA_SetChannelPriority(SPI_SDMA, RX_CHANNEL, 2);
ECSPI_MasterTransferCreateHandleSDMA(
ECSPI1、
&ecspi_sdma_handle、
callback_ecspi_sdma、
NULL、
&tx_handle、
&rx_handle、
2、
1、
TX_CHANNEL、
RX_CHANNEL);
ecspi_master_config_t config;
ECSPI_MasterGetDefaultConfig(&config);
config.baudRate_Bps= 1000000;
config.burstLength = 8;
PRINTF("開始中...\r\n");
ECSPI_MasterInit(
ECSPI1、
&config、
CLOCK_GetClockRootFreq(kCLOCK_RootEcspi1));
ecspi_transfer_t xfer;
xfer.チャネル = kECSPI_Channel0;
xfer.dataSize = 1;
xfer.rxData = &rx[0];
xfer.txData = NULL;
if (ECSPI_MasterTransferSDMA(ECSPI1, &ecspi_sdma_handle, &xfer) != kStatus_Success)
ヤージュ
PRINTF("転送に失敗しました\r\n");
}
(!完了)
ヤージュ
}
PRINTF("終了しました\r\n");
(1)
ヤージュ
}
}
しかし、fsl_ecspi_sdma を使用すると、依然として同じ問題が発生します。転送が開始されません。
オシロスコープでECSPIクロックラインを監視しましたが、全く動作が見られませんでした。これは、ペリフェラルがトランザクションを開始していないことを示唆しています。
このコードを作成する際、sai_sdmaのサンプルを参考にし、ECSPI向けに同じ初期化フローとSDMAハンドルの使用方法を適用しました。
私の問題は、SDMAイベントマッピングの誤り、またはECSPI1 TX/RXのチャネル選択の不備に関連している可能性がありますか?
また、SDKに公式のecspi_sdmaサンプルプロジェクトがあれば、必要な設定の検証がはるかに容易になるため、非常にありがたいです。
何かご助言いただければ大変ありがたいです。
@pengyong_zhangさんをタグ付けするべきだったと思います。ごめんなさい。
こんにちは@RafaelFernandes
返信が遅くなり申し訳ありません。メッセージを受け取りましたので、できるだけ早くお返事いたします。
BR
こんにちは@RafaelFernandes
imx8mpのデータシートによると、ECSPI1マスタの最大読み出し周波数と書き込み周波数(理論値)は以下のとおりです。
しかし実際には、それほどの速度には達しない。他の低周波周波数を試してみましたか?例えば、15MHz?
BR