Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

FLASH_SPI_ERR_HARD の原因、および対処法について

はじめまして、takといいます。

 

RX231とFITモジュール(r_flash_spi/他)を用いてソフト開発しているのですが、以下のような状況となり困っております。

考えられる原因、および対処法につきましてアドバイス頂けますと幸いです。

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

 

【不具合状況】

・R_FLASH_SPI_Read_Data() の戻り値が FLASH_SPI_ERR_HARD となる。

・発生頻度は低い。

・処理をリトライすると成功することもある。


【マイコンソフト概要】

・通常時は低速動作モード

・SPIフラッシュからの読み出しタイミングで中速動作モード(8MHz)に移行しフラッシュから読み出す

・必要な処理実行後は低速動作モードに移行

その他、中速動作モードではRIICやSCIなどの通信も発生


【周辺機能の使用状況】

・RSPI(本件)
・SCI:3チャネル
・RIIC
・ADC:3チャネル
・DAC:2チャネル
・MTU2:1チャネル
・CMT:3チャネル
・RTC
・端子入力による割込
 - NMI
 - IRQ4

  • takさん、こんにちは。NoMaYと申します。

    r_flash_spi_v2.34のドキュメントに以下のように書いてあるだけで、ハードウェアエラーとは何か、の説明が書いてないのですね。(こういうことは自分も過去に何度もやらかしてますが、、、) ソースをgrepしてみたところ、このエラーはQSPI_SMSTR_ERR_HARDを付け替えているだけのようです。

    アプリケーションノート
    RX ファミリ Serial Flash memory アクセスクロック同期式制御モジュール Firmware Integration Technology
    www.renesas.com/jp/ja/doc/products/mpumcu/apn/rx/002/r01an2662jj0234-rx.pdf
    幾つかの関数の説明

    Return Values
    FLASH_SPI_SUCCESS /* 正常終了した場合*/
    FLASH_SPI_ERR_PARAM /* パラメータ異常の場合*/
    FLASH_SPI_ERR_HARD /* ハードウェアエラーの場合*/
    FLASH_SPI_ERR_OTHER /* 他タスクがシングル同期式シングルマスタ制御

    そして、QSPI_SMSTR_ERR_HARDはr_qspi_smstr_rxのエラーなのですが、r_qspi_smstr_rx_v1.10のドキュメント(WEB上に有るものは既にv1.11のようです)に以下のように書いてありました。([追記] 今日、RXファミリ RX Driver Package Ver.1.19がリリースされていたのですね、、、)

    アプリケーションノート
    RX ファミリ QSPI クロック同期式シングルマスタ制御モジュール Firmware Integration Technology
    www.renesas.com/jp/ja/doc/products/tool/apn/001/r01an1940jj0111-rx.pdf
    幾つかの関数の説明

    Return Values
    QSPI_SMSTR_SUCCESS /* 正常終了した場合 */
    QSPI_SMSTR_ERR_PARAM /* パラメータ異常の場合 */
    QSPI_SMSTR_ERR_HARD /* ハードウェア異常の場合 */
    Special Notes:
    DMAC 転送もしくはDTC 転送を指定する場合、以下の点にご注意ください。
    ・別途、DMAC FIT モジュール/DTC FIT モジュール/タイマモジュール(CMT FIT モジュール等)を入手してください。
    ・バッファのアドレスは4 バイトの境界値としてください。
    ・転送データ数として16 の倍数を指定しコールしてください。転送データ数として1~15 の端数が発生する場合、別途ソフトウェア転送を指定しコールしてください。
    ・転送モードはブロック転送として、1 回の起動要因に対して、16 バイトの転送が行われるように設定してください。例えば、データ転送サイズを4 バイトにした場合、ブロック転送回数を4 回に設定してください。
    ・データ送信完了待ち処理r_qspi_smstr_tx_dmacdtc_wait()はタイマを使用します。本関数をコールする前にCMT 等を用いて1 ミリ秒(ms)タイマを起動してください。そして、1 ミリ秒(ms)毎にR_QSPI_SMstr_1ms_Interval()をコールしてください。
    ・本関数をコールする前にDMAC もしくはDTC を起動可能状態に設定してください。
    ・DMAC もしくはDTC を起動可能状態に設定していない場合、転送は行われません。戻り値はQSPI_SMSTR_ERR_HARD が返ります。
    ・リトルエンディアン設定、かつDMAC 転送もしくはDTC 転送の設定で本関数をコールすると、送信データ格納バッファ内のデータ並びを変更し、データを送信します。送信完了後に元のデータ並びに戻します。

    ところが、ソースをgrepしてみたところ、タイムアウトでQSPI_SMSTR_ERR_HARDを返している箇所がありました。このあたりがヒントになりませんでしょうか? その一方で、r_qspi_smstr_rx_v1.10はRX231をサポートしていないようなので、私が見ているものが違うものかも知れない懸念があります。

    r_qspi_smstr_rx\src\r_qspi_smstr.c

    /*******************************************************************************
    * Function Name: r_qspi_smstr_wait
    * Description  : Waits for flag to be set.
    *                If time out occurred, returns error.
    * Arguments    : * flag -
    *                    Register to check
    *                wait -
    *                    Waiting time
    *                mask -
    *                    Mask data to specify flag to be set
    * Return Value : QSPI_SMSTR_SUCCESS -
    *                    Successful operation
    *                QSPI_SMSTR_ERR_HARD -
    *                    Time out has be detected.
    *******************************************************************************/
    qspi_smstr_status_t r_qspi_smstr_wait(volatile __evenaccess uint8_t * flag, uint32_t wait, uint8_t mask)
    {
        /* Wait for flag to be set to 1. */
        while (QSPI_SMSTR_FLAG_CLR == ((*flag) & mask))
        {
            /* ---- Check of time out. ---- */
            wait--;
            if (0 == wait)
            {
                return QSPI_SMSTR_ERR_HARD;
            }
            
            r_qspi_smstr_wait_lp(QSPI_SMSTR_T_QSPI_WAIT);
        }
        
        return QSPI_SMSTR_SUCCESS;
    }

     

  • In reply to NoMaY:

    NoMaYさん

    takです。
    ご回答頂きましてありがとうございます。

    まず、こちらで使用している各FITモジュールのバージョンは以下の通りです。
    (少し前のバージョンを使用しているのですが、更新することによる別の不具合が発生しそうでまだ更新しておりません)

    ・r_flash_spi : v2.33
    ・r_rspi_smstr_rx:v1.13

    RX231ではQSPIではなくRSPIとなりますが、以下については同じようです。

    ・本エラーはRSPI_SMSTR_ERR_HARDを付け替えているだけである
    ・タイムアウトでRSPI_SMSTR_ERR_HARDを返している箇所がある

    r_rspi_smstr_rxのソースコードを確認しました。
    DMAC転送/DTC転送は使用せず、Software転送を使用しているのですが、
    Software転送で使用される関数の中で、FLASH_SPI_ERR_HARDを発生させる可能性のある関数は、
    r_rspi_smstr_read_software()と、r_rspi_smstr_wait()の2つのみで、各々以下のようです。

    ・前者は、SPI通信でのオーバランエラー(SPSR.BIT.OVRF=1)
    ・後者は、送信バッファエンプティIRフラグ、または受信バッファフルIRフラグのポーリングタイムアウト

    とりあえずは、エラー発生元を特定できるよう仕掛けをして様子を見つつ、各種マニュアルを確認していこうと思います。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page