イレースのバグ修正完了!!サークルの後輩が調べて直してくれました。感謝します。
追記(2020/6/28):
コメントでご指摘を頂きました。RX シリーズでは各ペリフェラルで共通のレジスタが多いのですが、シリーズ間で地味に異なる仕様がありますよね。
今回のご指摘は FCU への異なる仕様のようです。RX220 をお使いの方はこの追記を無視して構いません。
RX210 や RX631 では FCU の初期化が必要なようで、e2_write
等を実行する前に以下のレジスタ書き込みを行って、FCU RAM への書き込みを許可してあげてください。
FLASH.FCURAME.WORD = 0xC401;
これをしないと例外で落ちます。ご参考にどうぞ。
追記 終
この前からず〜っとやっていた、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行。ご査収ください。
コメント
古い記事にコメントしますが、RX210でE2データフラッシュの書き込みで
検索して、ここにたどり着きました。それなりに動いたのですが1点だけ問題あります。
このままですと、E1デバッガ繋いでいるときは問題なく動作して、デバッガはずして
ターゲット単体にすると、動かなくなります。
E2データフラッシュをアクセスするには、一番最初(1回だけでよい)にFCUの初期化を行わう必要があるようです。デバッガ繋ぐとデバッガが初期化している感じがします。コマンドは0xC401です。
ご参考まで
ご報告ありがとうございます。RX210ではE1エミュレータ無しでは動作しないのですね。
> E2データフラッシュをアクセスするには、一番最初(1回だけでよい)にFCUの初期化を行わう必要があるようです。デバッガ繋ぐとデバッガが初期化している感じがします。コマンドは0xC401です。
私の使っているRX220では正常に動きますし、該当するレジスタは見つかりませんでした...が、RX210やRX631ではご指摘の通り、FCU初期化のコマンドが必要なようです。
どうやら、RX210とRX220で地味に仕様が異なる箇所のようですね。ルネサスからの直リンクですが、以下のアプリケーションノートに記載があります(52ページ目一番下です)↓
RX210グループ、RX220グループ アプリケーションノート RX210グループとRX220グループの相違点
実際のリファレンスマニュアルを見たところ、実行前に以下のレジスタ書き込みをする必要があると分かりました。
このことは記事に追記しておきます。この度はどうもありがとうございました。