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

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

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

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

Parents
  • 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)にて発生しています。

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

Reply Children
  • 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);
                    }