フラッシュメモリデータ管理モジュールFIT

はじめまして。Giggsと申します。

RX72Mで、フラッシュメモリデータ管理モジュールFITを使用してデータフラッシュに書き込み/読み出ししようとしています。
データ番号0に書き込むことが出来たので、続けてデータ番号1に書き込もうとしましたがうまくできません。
書き込もうとすると「消去ブロックなしのため、データ更新処理実行不可能」になるので、
ブロック消去しようとすると「無効ブロックなし」になります。
データ番号0に書き込んでからデータ番号1に書き込む間で何か処理が必要でしょうか?

以上、宜しくお願い致します。

  • Giggsです。

    上記の件ですが、ほぼサンプルコードを使用しています。

    「RXファミリ フラッシュメモリ データ管理モジュール Firmware Integration Technology Rev.2.01 - Sample Code

     type4_rx65n_2mb_rsk_sample」

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

    FITモジュールから返って来ているエラーは、これらでしょうかね。私の場合ですと、FITモジュールはソースが全公開されているので(ごく僅かに例外がありますが)、恐れずにエラーの発生箇所までステップ実行して行って、原因を調べようとします。「ほぼサンプルコードを使用」とのことですけれど、試しにステップ実行して行って、まさにエラーが発生している箇所を教えて頂くことは出来ませんでしょうか?

    消去ブロックなしのため、データ更新処理実行不可能 → FLASH_DM_ERR_REQUEST_ERASE
    無効ブロックなし → FLASH_DM_NO_INVALID_BLOCK

    ソースコードをgrepしてみると、FLASH_DM_ERR_REQUEST_ERASEは、以下の6箇所で見つかりますね。

    smc_gen\r_datfrx_rx\src\r_flash_dm_rx_if.c(491):         ret = FLASH_DM_ERR_REQUEST_ERASE;
    smc_gen\r_datfrx_rx\src\r_flash_dm_rx_if.c(1423):                     g_flash_dm_handle->error_code = FLASH_DM_ERR_REQUEST_ERASE;
    smc_gen\r_datfrx_rx\src\r_flash_dm_rx_if.c(1424):                     ret = FLASH_DM_ERR_REQUEST_ERASE;
    smc_gen\r_datfrx_rx\src\r_flash_dm_rx_if.c(491):         ret = FLASH_DM_ERR_REQUEST_ERASE;
    smc_gen\r_datfrx_rx\src\r_flash_dm_rx_if.c(1423):                     g_flash_dm_handle->error_code = FLASH_DM_ERR_REQUEST_ERASE;
    smc_gen\r_datfrx_rx\src\r_flash_dm_rx_if.c(1424):                     ret = FLASH_DM_ERR_REQUEST_ERASE;

     
    [関連リンク]

    Renesas検索: RXファミリ フラッシュメモリ データ管理モジュール
    www.renesas.com/jp/ja/search?keywords=RXファミリ フラッシュメモリ データ管理モジュール
     

  • NoMaY様、早速の回答有難う御座います。

    ご指摘の件、確認したところ上記の(1423)(1424)にて発生しています。

    何かわかりますでしょうか?

  • Giggsさん、こんにちは。NoMaYです。

    ここですね。考えてみます。

    static e_flash_dm_status_t r_flash_dm_d2_write(st_flash_dm_info_t * p_flash_dm_info)
    {
        e_flash_dm_status_t ret = FLASH_DM_SUCCESS;
        uint8_t tmp = g_flash_dm_handle->api_call;
        int16_t free = 0;

        /* === Check the parameter. === */
        if (0 == g_flash_dm_handle)
        {
            ret = FLASH_DM_ERR_ARGUMENT;
        }
        /* === Check the data_no and p_data. === */
        else if ((p_flash_dm_info->data_no >= r_flash_dm_drvif_get_datanum()) ||
                 (0 == p_flash_dm_info->p_data))
        {
            ret = FLASH_DM_ERR_ARGUMENT;
        }
        /* ==== Check busy. ==== */
        else if(g_flash_dm_handle->activity != FLASH_DM_ACT_IDLE)
        {
            ret = FLASH_DM_ERR_BUSY;
        }
        else
        {
            /* ==== Check status. ==== */
            ret = r_flash_dm_1st_check(FLASH_DM_WRITE_1ST_CHECK);

            if((FLASH_DM_ERR_BUSY != ret) && (FLASH_DM_ERR_REQUEST_INIT != ret))
            {
                g_flash_dm_handle->data_no = p_flash_dm_info->data_no;
                g_flash_dm_handle->user_data = p_flash_dm_info->p_data;

                /* === This module checks whether initialization has been done. === */
                if (g_flash_dm_handle->initialized != FLASH_DM_INITIALIZED_ID)
                {
                    g_flash_dm_handle->error_code = FLASH_DM_ERR_REQUEST_INIT;
                    ret = FLASH_DM_ERR_REQUEST_INIT;
                }
                else if(g_flash_dm_handle->flash_state == DATF_FLASH_CALL)
                {
                    ret = FLASH_DM_ERR_BUSY;
                }
                /* === Start processing. ===*/
                else
                {
                    /* cast from uint16_t to uint16_t */
                    free = (int16_t)(((g_flash_dm_handle->erase_block_num - 2) * DATF_F2_DATASIZE) + DATF_F1_DATASIZE);
                    if (free < gc_dm_data_size[p_flash_dm_info->data_no])
                    {
                        g_flash_dm_handle->error_code = FLASH_DM_ERR_REQUEST_ERASE;
                        ret = FLASH_DM_ERR_REQUEST_ERASE;
                    }
                    else
                    {
                        ret = r_flash_dm_dispatch(DATF_USER_WRITE);
                    }
                }
            }
        }
        g_flash_dm_handle->api_call = tmp;
        return ret;
    } /* End of function r_flash_dm_d2_write() */

     

  • Giggsさん、こんにちは。NoMaYです。

    ちなみに、以下での次の値は幾つでしたでしょうか?

    (1) g_flash_dm_handle->erase_block_num
    (2) free
    (3) p_flash_dm_info->data_no
    (4) gc_dm_data_size[p_flash_dm_info->data_no]

                    /* cast from uint16_t to uint16_t */
                    free = (int16_t)(((g_flash_dm_handle->erase_block_num - 2) * DATF_F2_DATASIZE) + DATF_F1_DATASIZE);
                    if (free < gc_dm_data_size[p_flash_dm_info->data_no])
                    {
                        g_flash_dm_handle->error_code = FLASH_DM_ERR_REQUEST_ERASE;
                        ret = FLASH_DM_ERR_REQUEST_ERASE;
                    }
                    else
                    {
                        ret = r_flash_dm_dispatch(DATF_USER_WRITE);
                    }

     

  • Giggsさん、こんにちは。NoMaYです。

    あと、別のアプローチとして確認したいのですけれど、「ほぼサンプルコードを使用」とのことですけど、どのような変更をされたのでしょうか?自分で試していない状態で書くのも何ですけれど、こんな感じでしょうか?(CS+では無くe2 studioなのはFITがそちら優先なので。)

    (1) e2 studioでデモプロジェクトを開いてRXスマートコンフィグレータ上でターゲットデバイスをRX72Mへ変更した

    or

    (2) e2 studioでRX72Mの新規プロジェクトを作成して必要なFITモジュールを追加してr_datfrx_rx_main.cを追加した

  • NoMaYさん、有難う御座います。

    変更点は以下の通りです。
    (1)CS+でRX72Mの新規プロジェクトを作成
    (2)スマート・コンフィグレータで必要なFITモジュールを追加
    (3)r_datfrx_rx_main.cを追加
    (4)r_flash_rx_config.hの「#define FLASH_CFG_DATA_FLASH_BGO (0)」を「#define FLASH_CFG_DATA_FLASH_BGO (1)」に変更
    (5)r_datfrx_rx_config.hの「#define FLASH_DM_CFG_DF_SIZE_NO0 (1)」を「#define FLASH_DM_CFG_DF_SIZE_NO0 (***)」に変更
    (6)r_datfrx_rx_config.hの「#define FLASH_DM_CFG_DF_SIZE_NO1 (1)」を「#define FLASH_DM_CFG_DF_SIZE_NO1 (***)」に変更
    (7)r_datfrx_rx_main.cの「#define TEST_BUFF_NUM (256)」を「#define TEST_BUFF_NUM (***)」に変更
    思考錯誤しながら、現状は以上の状態です。

    下記の値は今のところ(1)しか確認できていません...。
    値の確認方法を調べていますが...、経験が浅く、すみません。なんとか確認したいと思います。
    (1) g_flash_dm_handle->erase_block_num = 1
    (2) free
    (3) p_flash_dm_info->data_no
    (4) gc_dm_data_size[p_flash_dm_info->data_no]

  • Giggsさん、こんにちは。NoMaYです。

    すみません、最近のかふぇルネの投稿システムにはバグがあるらしくて、数値が伏字になってしまうことがあります。今回も頂いたリプライの一部が伏字になってしまっていました。(5)~(7)の数値を教えて頂けませんか?

    また、以下は、ひょっとして、コンパイラの最適化を掛けたままデバッグしていませんか?そうだとしたら、最適化を無しに変更してビルドし直してデバッグしてみて下さい。

    > 下記の値は今のところ(1)しか確認できていません...。
    > 値の確認方法を調べていますが...、経験が浅く、すみません。なんとか確認したいと思います。

  • NoMaYさん、有難う御座います。

    本当だ。***になってますね...。
    (5)~(7)はの値は全て「***」です。

    コンパイラの最適化の設定なんですね。
    最適化レベルを0にしたら値が出ました!

    データ番号0のとき
    (1) g_flash_dm_handle->erase_block_num = 3
    (2) free = 94
    (3) p_flash_dm_info->data_no = 0
    (4) gc_dm_data_size[p_flash_dm_info->data_no] = ***

    データ番号1のとき
    (1) g_flash_dm_handle->erase_block_num = 1
    (2) free = -12
    (3) p_flash_dm_info->data_no = 1
    (4) gc_dm_data_size[p_flash_dm_info->data_no] = ***

    g_flash_dm_handle->erase_block_numを遡ってみたりしていますが、イマイチわかりません...。

  • またですね...。

    ***は全て64です。