”かふぇルネ“はルネサス製品に関してユーザ同士が自由に会話をするツールであり、回答者はルネサス社内外の方たちとなります。ルネサス製品やソリューションに関して正式な回答をご希望の場合は、ルネサス技術サポート問合せをご使用ください。
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)が消去されました。
ありがとうございます。
ハードウェアマニュアルを読み、私の設定が間違っていました。