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