2204517_ja-JP

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2204517_ja-JP

2204517_ja-JP

[i.MX RT1064] SDカードの初期化が停止し、コマンドタイムアウトが発生しない

こんにちは!

現在、MIMXRT1064 CVL5B プロセッサを搭載したカスタム ボード上の SD カード インターフェースの信頼性を向上させようとしています。SDK の sdmmc サンプルを使用して、ほとんどのものを実行できました。カードと通信してデータの読み書きがCAN。しかし、まれに、SD カードの初期化中にアプリケーションが停止することがあります。この問題は、SD カード スロットの機械的な故障によって発生した誤ったカード検出信号に起因することが判明しました。ファームウェアは、スロットにカードが挿入されていないにもかかわらず SD カードの初期化を試み、コマンドの完了を待機し続けます。もちろんこれはハードウェアの問題ですが、プログラムの実行が永久にブロックされることはありません。

MIMXRT1064-EVK 評価ボードで問題を再現しようとしましたが、その SD カード スロットは少し堅牢なようで、空の micro SD カードでは誤動作しません。しかし、25.09 SDKのsdcard_pollingの例を使用し、sdmmc_config.cのBOARD_SDCardGetDetectStatus関数を変更することで、評価ボードで問題の動作をトリガーすることができました。SD カードが挿入されていない場合でも常に true を返すには:

bool BOARD_SDCardGetDetectStatus(void)
{
    return true;
}

SD カードがないと、初期化は USDHC_WaitCommandDone 関数の while ループで停止します。

static status_t USDHC_WaitCommandDone(USDHC_Type *base, usdhc_command_t *command, bool pollingCmdDone)
{
    assert(NULL != command);

    status_t error           = kStatus_Success;
    uint32_t interruptStatus = 0U;
    /* check if need polling command done or not */
    if (pollingCmdDone)
    {
        /* Wait command complete or USDHC encounters error. */
        while (!(IS_USDHC_FLAG_SET(interruptStatus, kUSDHC_CommandFlag)))
        {
            // SD card initialization gets stuck running this loop
            interruptStatus = USDHC_GetInterruptStatusFlags(base);
        }

        if ((interruptStatus & (uint32_t)kUSDHC_CommandErrorFlag) != 0UL)
        {
            error = kStatus_Fail;
        }

        /* Receive response when command completes successfully. */
        if (error == kStatus_Success)
        {
            error = USDHC_ReceiveCommandResponse(base, command);
        }

        USDHC_ClearInterruptStatusFlags(base, kUSDHC_CommandFlag);
    }

    return error;
}

完全なスタック トレースは次のとおりです。

USDHC_WaitCommandDone() at fsl_usdhc.c:729 0x7000741a
USDHC_TransferBlocking() at fsl_usdhc.c:1.641 0x70007f3e
SDMMCHOST_TransferFunction() at fsl_sdmmc_host.c:190 0x7000a960
SD_SendInterfaceCondition() at fsl_sd.c:1.206 0x70004430
SD_ProbeBusVoltage() at fsl_sd.c:1.950 0x70005388
sdcard_init() at fsl_sd.c:2.020 0x7000549a
SD_CardInit() at fsl_sd.c:2.107 0x700055ea
main() at sdcard_polling.c:174 0x70002bb6

通常、SD カードはコマンドに応答し、USDHC1.INT_STATUS.CC フラグが設定されて、プログラムは while ループを終了できるようになります。カードが存在しない場合は、USDHC1.INT_STATUS エラー フラグの 1 つ (CTOE コマンド タイムアウト エラーなど) が設定され、最終的に init 関数がエラーを返すことが予想されます。しかし、そんなことは決して起こりません。また、USDHC1.INT_STATUS_EN.CTOESEN が有効になっており、SD クロックが動作していることも確認しました。

このCASE、コマンド タイムアウトがトリガーされるはずだという私の想定は正しいでしょうか、それともこの動作は正しいのでしょうか。

SD カードが挿入されていないときに初期化が失敗して停止しないようにする別の方法はありますか?SD ドライバ全体を変更するのは避けたいのですが、while ループ内の再試行回数を制限することが現時点で考えられる唯一の解決策です。

よろしくお願いします
ヤン

i.MXRT 106x
标记 (1)
无评分
版本历史
最后更新:
‎11-21-2025 05:24 PM
更新人: