RX220でE2データフラッシュができた

イレースのバグ修正完了!!サークルの後輩が調べて直してくれました。感謝します。

この前からず〜っとやっていた、RX220 のデータフラッシュ書き込みができたのでご報告。
ルネサスのよくわからん仕様に悩まされながらなんとかこの苦行を成し遂げました。P/Eなんとかモードが不必要に多すぎ。しかもモード移行シーケンスが本当に分からん。
ユーザーマニュアルもROMとE2データフラッシュの項目で行き来させられて、正直嫌になりますよ、本当。

そんなわけで出来ました。以下にソースをダラダラと載せるので、使ってやってください。

今回実装したコードの基本的な仕様は以下のとおりです。

  • 書き込みは16ビット単位のみを実装。多分8ビットは出来ないと思います(多分)
  • 読み書きともに相対的なアドレスを指定すれば良い。すなわち E2 データフラッシュ領域がメモリ空間のどこにあるかなど考慮する必要なし。
    • あ、でもブロック(後述)については意識してコード書いてくださいね。
  • エラー処理は適当。エラーが出たらそれを返すだけ。エラー処理のコマンドは実装した(動作確認済み)。

使い方

初期化の必要はなし。各種操作の際に自動的に初期化をします。
また、各オペレーションは読み込みも含めポインタで直接行うのではなく、要した関数を通して行ってください。

各操作の際は関数の引数として相対アドレスを指定してください。例えばE2データフラッシュ領域の 0x00 番地に書き込みたければ単に 0x00 とするだけで良いです。なおこの関数ではポインタで値を渡すことになっているので、(uint16_t *)0x00 とキャストしてください。

if( e2_write(810, (uint16_t *)0x00) ) {
    uart_printf("Success!\r\n"); // e2_writeは書き込み成功時に1を返す
}else{
    uart_printf("Fail\r\n"); // 書き込み失敗時は0を返す
}

何でいちいちキャストしなければならないかというと、まあ連続してデータを置けるからですね。例えば16ビット変数の配列を全て保存する際等に便利です。

uint16_t arr[] = {1, 1, 2, 3, 5, 8, 11};

e2_erase((uint16_t *)0x00);
for(uint8_t i=0; i<sizeof(arr)/sizeof(arr[0]); i++) {
    e2_write(arr[i], (uint16_t *)0x00 + i);
}

ポインタに数値iを足すとそのポインタ型の差すメモリアドレスのi番先の領域のポインタとなります。
でもポインタとポインタは足してはいけませんよ。念のため。

ルーチン

各ブロックに書き込む前にはブランクチェック、イレースをしてください。ブランクチェックは必須ではないですが、イレースの時間を省きたい時にどうぞ。
ブロックとはなんぞや、については、ユーザーマニュアルにごく適当に説明があります。

ですので、(ブランクチェック ->) イレース -> 書き込み としてください。

読み込みはそのまま読み込み関数を呼んでいただければOKです。

ソースコード

長いです。134行。ご査収ください。