2374437_ja-JP

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

2374437_ja-JP

2374437_ja-JP

imx8mminiのECSPIボーレートを52Mbpsに上げるにはどうすればよいですか?

こんにちは

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 関数で再初期化する必要のない関数とステートメントはどれですか? また、クロック周波数を上げましたが、問題は解決しません。以下に私のコードを示します。

 
status_t ECSPI_MasterTransferSDMA(ECSPI_Type *base, ecspi_sdma_handle_t *handle, ecspi_transfer_t *xfer)
{
// assert(base && handle && xfer);
 
// sdma_transfer_config_t xferConfig = {0U};
// sdma_peripheral_t perType = kSDMA_PeripheralNormal;
 
/* ECSPIがビジー状態かどうかを確認する */
if (handle->state == kECSPI_Busy)
    {
return kStatus_ECSPI_Busy;
   }
 
/* 入力引数が有効かどうかを確認します */
(((xfer->txData == NULL) && (xfer->rxData == NULL)) || (xfer->dataSize == 0U)) の場合
    {
kStatus_InvalidArgument を返します。
   }
// if(test_init_flg == 0)
{
ECSPI_Enable(base, true);
}
handle->state = kECSPI_Busy;
if(test_init_flg == 0)
{
 
    ECSPI_SetChannelSelect(base, xfer->チャネル);
}
#if defined(FSL_FEATURE_SOC_SPBA_COUNT) && (FSL_FEATURE_SOC_SPBA_COUNT > 0)
if(test_init_flg == 0)
{
 
bool isSpba = SDMA_IsPeripheralInSPBA((uint32_t)base);
/* インスタンスが SPBA に存在するかどうかを判定する */
if (isSpba)
    {
perType = kSDMA_PeripheralNormal_SP;
   }
}
#endif /* FSL_FEATURE_SOC_SPBA_COUNT */
if(test_init_flg == 0)
{
 
/* 転送を準備します。*/
SDMA_PrepareTransfer(&xferConfig, (uint32_t)xfer->txData, (uint32_t) & (base->TXDATA), sizeof(uint8_t),
sizeof(uint8_t)、sizeof(uint8_t)、xfer->dataSize、handle->txSdmaHandle->eventSource、perType、
kSDMA_メモリから周辺機器へ);
}
/* 送金を送信します。*/
SDMA_SubmitTransfer(handle->txSdmaHandle, &xferConfig);
 
if(test_init_flg == 0)
{
/* 転送を準備します。*/
SDMA_PrepareTransfer(&xferConfig2, (uint32_t) & (base->RXDATA), (uint32_t)xfer->rxData, sizeof(uint8_t),
sizeof(uint8_t)、sizeof(uint8_t)、xfer->dataSize、handle->rxSdmaHandle->eventSource、perType、
kSDMA_周辺機器からメモリへ);
}
/* 送金を送信します。*/
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);
test_init_flg=1;
 
kStatus_Success を返します。
}

void main(void)

{

...

while(1)
{
 
DRIVER_MASTER_SPI.Transfer(masterTxData, masterRxData, TRANSFER_SIZE); // ECSPI_MasterTransferSDMA を呼び出す
 
/* スレーブがすべてのデータを受信するまで待機します。*/
while (!isTransferCompleted)
    {
   }
...
}

}

 

sofia_0571_0-1780311681503.png
回复: How to increase the ECSPI of imx8mmini baud rate to 52Mbps?

ソースコードを添付する

Re: How to increase the ECSPI of imx8mmini baud rate to 52Mbps?

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

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

サラス。

Tags (1)
No ratings
Version history
Last update:
6 hours ago
Updated by: