”かふぇルネ“はルネサス製品に関してユーザ同士が自由に会話をするツールであり、回答者はルネサス社内外の方たちとなります。ルネサス製品やソリューションに関して正式な回答をご希望の場合は、ルネサス技術サポート問合せをご使用ください。

RX130シリーズ E2データフラッシュのブロックイレースできない

RX130シリーズで開発環境CS+でE2データフラッシュへのアクセスするプログラムを作成しています。

ハードウェアマニュアルを参考に下記のように作成しましたが、E1を接続して、デバッグを行っていますが

必ずFLASH.FSTATR0.BIT.ILGLERR が 1となりエラー検出個所で停止します。原因がわかりません、だれか

教えてください。

volatile static uint8_t tmp1,tmp3;
volatile static uint16_t tmp2,tmp4;

const uint32_t address = 0x00FE0000UL;

/*P/Eモードに設定*/
FLASH.FPR = 0xA5u;
FLASH.FPMCR.BYTE = 0x08u;
FLASH.FPMCR.BYTE = 0xF7u;
FLASH.FPMCR.BYTE = 0x08u;
delay_cnt = 50UL;
while(delay_cnt--):
FLASH.FENTRYR.WORD = 0xAA00u;
while(0x0000 != FLASH.FENTRYR.WORD){
}

/*イレーズ処理*/
wrtaddr_start = address; // 開始アドレス (書込み用)
wrtaddr_end = wrtaddr_start + 0x03ff; // 開始アドレス (書込み用)

tmp1 = (uint8_t)(wrtaddr_start >> 16UL);
tmp2 = (uint16_t)(wrtaddr_start & 0xFFFF);

tmp3 = (uint8_t)(wrtaddr_end >> 16UL);
tmp4 = (uint16_t)(wrtaddr_end & 0xFFFF);

FLASH.FASR.BIT.EXS = 0; // フラッシュ領域はデータ領域

FLASH.FSARH = tmp1; // フラッシュ処理開始アドレスの設定
FLASH.FSARL = tmp2;

FLASH.FEARH = tmp3; // フラッシュ処理終了アドレスの設定
FLASH.FEARL = tmp4;

FLASH.FCR.BYTE = 0x84;

while(FLASH.FSTATR1.BIT.FRDY != 1);

FLASH.FCR.BYTE = 0x00;

while(FLASH.FSTATR1.BIT.FRDY != 0);

if((FLASH.FSTATR0.BIT.ILGLERR == 1)||(FLASH.FSTATR0.BIT.BCERR == 1)){/*エラー検出*/
               FLASH.FRESETR.BIT.FRESET = 1;
               FLASH.FRESETR.BIT.FRESET = 0;
               return 0
}
return 1;

  • (1)データフラッシュのアクセス許可(ハードウェアマニュアルP1249図39.6)

    FLASH.DFLCTL.BYTE = 0x1; ★

    ウェイト

    →先頭に追加

    (2)E2データフラッシュをP/Eモードに遷移(ハードウェアマニュアルP1251図39.8)

    FLASH.FENTRYR.WORD = 0xAA00u; → 0xAA80 に変更(先に設定)

    FLASH.FPMCR.BYTE = 0x08u; →  0x10(または0x50, 動作速度に応じて)に変更 ★

    FLASH.FISR.BIT.PCKA に FCLKに応じた値を設定 

    (3)データフラッシュのアドレスが違う

    const uint32_t address = 0x00FE0000UL; → 0xF10000 ★

     ★の部分が特に抜けている点かと思います。データフラッシュに何か適当なデータを書いて、実行してみましたが、先頭の1kB(リードアドレスでは、0x0010_0000~0x0010_03ff)が消去されました。

  • ありがとうございます。

    ハードウェアマニュアルを読み、私の設定が間違っていました。