こんにちは。
FITモジュールを用いて、フラッシュメモリの書き換えをするプログラムを作成しています。
手順書「RX ファミリ CS+に組み込む方法 Firmware Integration Technology」を参考にし、
BSPとFlash APIのFITモジュールをCS+に組み込み、動作を確認しましたところ、
R_FLASH_Erase関数とR_FLASH_Write関数のリターン値が「FLASH_ERR_FAILURE」となっていました。
何が原因なのか悩んでいます。
御教授いただけたらと思います。
簡単な処理の流れは以下になります。
R_FLASH_Open関数
R_FLASH_Erase関数(データフラッシュメモリを対象)
R_FLASH_BlankCheck関数(データフラッシュメモリを対象)
R_FLASH_Write関数(データフラッシュメモリを対象)
> 既に出ている問合せであったようで、申し訳ございません。
Renesas Rulz のサービスが日本語と英語で分かれていて、それぞれを検索するよりかぐぐった方がマシという現在の残念な仕様はどうにかならんかなという感じですね。
japan.renesasrulz.com での検索
renesasrulz.com での検索
Google での renesasrulz.com の検索
Google での検索
> ブランクチェックR_FLASH_BlankCheck関数を実行すると、> ブランクチェックの結果がFLASH_RES_NOT_BLANKとなってしまい、悩んでいます。
#define ACCESS_DF_EN_0000_0063BLOCK (0x0001) /* 0000-0063 block read and P/E enable */ #define DF_WRITE_SIZE (FLASH_DF_BLOCK_SIZE) /* write data size fro data flash */ /* typedef definitions */ typedef enum { TARGET_CODE_FLASH = 0, TARGET_DATA_FLASH } flash_target_t; /* Exported global variables and functions (to be accessed by other files) */ void main(void); flash_err_t er_wr_flash( flash_access_window_config_t access_info, flash_block_address_t block_start_adr, uint32_t erase_num_blocks, uint32_t src_adr, uint32_t dest_adr, uint32_t write_size ); /* Constant Definition */ /* writing data for data flash */ const uint8_t df_write_data[DF_WRITE_SIZE] = { 0x98, 0x76, 0x54, 0x32, 0x10, 0xFE, 0xDC, 0xAB, 0x02, 0xE0, 0x04, 0xC0, 0x06, 0xA0, 0x08, 0x80, 0xF1, 0xD3, 0xB5, 0x97, 0x79, 0x5B, 0x3D, 0x1F, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 }; /* Function Name: main */ void main(void) { flash_err_t err; /* error check */ flash_access_window_config_t access_info; /* initialize the Flash FIT module */ err = R_FLASH_Open(); if ( FLASH_SUCCESS != err ) { goto FLASH_ERR; } else { /* Do nothing */ } /* data flash memory */ access_info.read_en_mask = ACCESS_DF_EN_0000_0063BLOCK; /* allow Read access */ access_info.write_en_mask = ACCESS_DF_EN_0000_0063BLOCK; /* allow Erase/Write access */ err = er_wr_flash(access_info, FLASH_DF_BLOCK_0, 1, (uint32_t)df_write_data, FLASH_DF_BLOCK_0, DF_WRITE_SIZE); if ( FLASH_SUCCESS != err ) { goto FLASH_ERR; } else { PORTD.PODR.BIT.B7 = 0; /* Turn on LED2 */ } /* normal end */ while(1); FLASH_ERR: while(1); } /* Function Name: er_wr_flash */ flash_err_t er_wr_flash( flash_access_window_config_t access_info, flash_block_address_t block_start_adr, uint32_t erase_num_blocks, uint32_t src_adr, uint32_t dest_adr, uint32_t write_size ) { uint32_t cnt; /* loop counter and write data */ uint8_t *src_ptr; uint8_t *dest_ptr; flash_err_t err; /* error check */ flash_res_t result; /* Result type for certain operations */ flash_target_t target_flash; /* data falsh area */ if ( (FLASH_DF_BLOCK_0 <= block_start_adr) && (FLASH_DF_BLOCK_INVALID > block_start_adr) ) { /* allow reading/writing to data flash blocks */ err = R_FLASH_Control(FLASH_CMD_ACCESSWINDOW_SET, (void *)&access_info); target_flash = TARGET_DATA_FLASH; } else { err = FLASH_SUCCESS; target_flash = TARGET_CODE_FLASH; } /* normal end */ if ( FLASH_SUCCESS == err ) { /* erase code/data flash blocks */ err = R_FLASH_Erase(block_start_adr, erase_num_blocks); /* normal end */ if ( FLASH_SUCCESS == err ) { /* data flash */ if ( TARGET_DATA_FLASH == target_flash ) { /* blank check an entire data flash block */ err = R_FLASH_BlankCheck(block_start_adr, BLANK_CHECK_ENTIRE_BLOCK, &result); } else { result = FLASH_RES_BLANK; } /* normal end */ if ( (FLASH_SUCCESS == err) && (FLASH_RES_BLANK == result) ) { /* write data to code/data flash memory */ err = R_FLASH_Write(src_adr, dest_adr, write_size); /* normal end */ if ( FLASH_SUCCESS == err ) { src_ptr = (uint8_t *)src_adr; /* code flash */ if ( TARGET_CODE_FLASH == target_flash ) { dest_ptr = (uint8_t *)(dest_adr | 0xFF000000); } else { dest_ptr = (uint8_t *)dest_adr; } /* verify code/data flash memory */ for ( cnt=0; cnt<write_size; cnt++ ) { /* not matching ? */ if ( (*(src_ptr+cnt)) != (*(dest_ptr+cnt)) ) { err = FLASH_ERR_FAILURE; break; } else { /* Do nothing */ } } } else { /* Do nothing */ } } else { err = FLASH_ERR_FAILURE; } } else { /* Do nothing */ } } else { /* Do nothing */ } return (err); }
R_FLASH_BlankCheck() で BLANK_CHECK_ENTIRE_BLOCK を指定して全体をチェックしていますが、R_FLASH_Erase() で消去しているブロックの数は全ブロックとなっているでしょうか?