RX63N FITモジュールを用いたフラッシュメモリの書き換えについて(FIT使用)

こんにちは。

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関数(データフラッシュメモリを対象)

  • fujita nozomuさん

    コメントありがとうございます。
    既に出ている問合せであったようで、申し訳ございません。
    アクセスウィンドウの設定が必要とのことで、解決しました。
    ありがとうございました。
  • > 既に出ている問合せであったようで、申し訳ございません。

    Renesas Rulz のサービスが日本語と英語で分かれていて、それぞれを検索するよりかぐぐった方がマシという現在の残念な仕様はどうにかならんかなという感じですね。

    japan.renesasrulz.com での検索

    renesasrulz.com での検索

    Google での renesasrulz.com の検索

    Google での検索

  • fujita nozomuさん

    コメントありがとうございます。
    検索対象が違うのですね。。。
    管理人さんが見てくれていると思います。
    そのうち、改善されることを期待しています。


    To : 御教授いただける方

    引き続き作成しておりますと、
    RX63NはE2データフラッシュのみブランクチェック対象にできますが、
    E2データフラッシュを対象とし、ブランクチェックR_FLASH_BlankCheck関数を実行すると、
    ブランクチェックの結果がFLASH_RES_NOT_BLANKとなってしまい、悩んでいます。
    御教授いただけたらと思います。
    (ブランクチェック結果を無視すると、意図した書き込みが確認できますが、使用方法を間違えているのでしょうか?)
    ※フラッシュFITモジュールはRev.2.10です。

    以下、ソースの抜粋です。


    #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関数を実行すると、
    > ブランクチェックの結果が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() で消去しているブロックの数は全ブロックとなっているでしょうか?

  • fujita nozomuさん

    コメントありがとうございます。
    消去ブロック(20h)とブランクチェック(20h*64 または2h)の単位が違うのですね。
    例えば、1ブロック(20h)の消去を実行し、ブランクチェックをする場合は、
    消去した対象領域を2h単位で順次ブランクチェックしていく手順を取るということで理解しました。
    ハードウェアマニュアルの理解が浅く、御迷惑をお掛けしました。
    御教授ありがとうございました。
  • fujita nozomuさんのアドバイスで作成できました。
    ありがとうございました。
    作成したソフト、および説明書は、以下のURLからご覧いただけます。
     ↓
    japan.renesasrulz.com/.../rx63n-fit