楽天市場
[無料でホームページを作成] [通報・削除依頼]

番外 LPC810 EEPROM エミュレーション

LPC810のEEPROMエミュレーションプログラムを紹介します。
PICのEEPROMエミュレーションのページも参考にしてください。


<エミュレーションプログラムの仕様>

1.サイズ  (128Tumbワード)(256バイト)、実行中レジスタr1とr2以外は書き換えない。

2.EEPROMアドレス 0x00~0x0E 15個

3.EEPROMデータ 最小値0x00000000、最大値0x0FFFFFFF(268435455)

4.仮想EEPROM空間

 16ワード(64バイト)の連続したFlash領域を2ページ使用、
 テストプログラムではPage0:0x00000D00~0x00000D3FとPage1:0x00000D40~0x00000D7Fを使用

5.機能

 initial_eeprom       EEPROM領域に0xFFFFFFFFを書き込み初期化する。
 read_eeprom         r1レジスタで指定したEEPROMアドレスのEEPROMデータをr2レジスタに書き込む。
 write_eeprom        r1レジスタで指定したEEPROMアドレスにr2レジスタで指定したEEPROMデータを書き込む。

6.使用レジスタ 最大3(r0,r1,r2)

 r0レジスタで作業用バッファーの先頭アドレスを指定、作業用バッファーは 16+5ワード(84バイト)必要

img_20140329-153153.jpg

 指定した値が範囲を超えたときは書き込み読み出しを行わず、r1レジスタの値を書き換えて戻る

     read/write status  ----> EEPROMアドレスが0x0Eを超えた                 r1 |= 0x80
     write status         ----> EEPROMデータが0x0FFFFFFFを超えた           r1 |= 0x40

 読み出し時、指定したEEPROMアドレスにデータが存在しないときはr1レジスタの値を書き換えて戻る、
 このときr2レジスタには0x0FFFFFFFがセットされる。

     read status          ----> There is no data in the specified EEaddress  r1 |= 0x20

7.アセンブラでの使用例

        ldr       r0,=#XXXXXXXX        @r0に作業用バッファーの先頭アドレスをセット
        movs    r1,#Y                      @r1にEEPROMアドレスをセット
        ldr       r2,=#ZZZZZZZZ        @r2にEEPROMデータをセット
        bl        write_eeprom            @サブルーチン呼び出し

8.フラッシュ内部のデータ形式

    EEdata   =< 0x0FFFFFFF    EEdata      (upper 28bits)
    EEaddress < 0xF               EEaddress (lower 4 bits)

    EEPROM Data Format(word): [EEdata31:4|EEaddress3:0]

9.制約事項

 Page0とPage1は128ワード境界に配置しなければならない。

 O  PAGE0=0x00000E00, PAGE1=0x00000E40
 X  PAGE0=0x00000E40, PAGE1=0x00000E80
 O  PAGE0=0x00000E80, PAGE1=0x00000EC0
 X  PAGE0=0x00000EC0, PAGE1=0x00000F00

 O  PAGE1=0x00000E00, PAGE0=0x00000E40
 X  PAGE1=0x00000E40, PAGE0=0x00000E80
 O  PAGE1=0x00000E80, PAGE0=0x00000EC0
 X  PAGE1=0x00000EC0, PAGE0=0x00000F00


<テスト回路>
前ページのものと一緒です。シリアル入出力にPIO0_0とPIO0_1を使用
img_20140323-144404.jpg


<テストプログラムの動作> テストプログラムの動作確認にはターミナルソフトが必要です。

1.まず i コマンドでEEPROM領域(Page0,Page1)をクリア
      i コマンド実行後は必ずPage0が書き込み読み出しに使用される。
img_20140329-153607.jpg

2.EEPROMにデータを書き込む、コマンドw05544332
     アドレス0x0にデータ0x5544332(7桁)を書き込む、右のr1,r2は書き込み後のレジスタ値(戻り値)を示す。
img_20140329-154016.jpg

3.アドレス0x0の値を読み出す、コマンドr0
     アドレス0x0には最初に0x1234567が書き込まれていたが、直前に上書きした5544332が読み出される。
img_20140329-154657.jpg

4.さらに書き込みを続ける、あと1回書き込むとページ0が満杯になる。
img_20140329-155102.jpg

5.次のデータを書き込む。
      Page0が使用できなくなるので、Page0のデータを整理してPage1にコピー。
      Page0は消去される。直前に書き込まれたアドレス0x4の値0xcccccccはPage1に書き込まれている。
img_20140329-155340.jpg

6.次のデータを書き込む、以後仮想EEPROM空間としてPage1が使用される。
     アドレス0x0のデータ0x2345678がPage1に書き込まれる。
     Page1が満杯になるとPage1のデータをPage0に移動し、Page1を消去、以後これを繰り返す。
     Pageのサイズが許されるアドレスより常に大きい為、移動の過程でデータの欠損はない。
img_20140329-160035.jpg

7.最後にもう一度イニシャライズして消去の動作を再確認
img_20140329-160944.jpg


※追記
最初にハーフワード(16bit)仕様のEEPROMエミュレーションを検討したのですが、
フラッシュの書き込みをハーフワード毎に行うとデータが化けてしまうことがわかりました。

ハーフワード毎で書き込みを行った例。
アドレス0x01にデータ0x234を連続書き込み。上位ハーフワードでデータが化ける。バッファーの値は正常
img_20140329-161430.jpg




ソース一式のダウンロード先

Bequest333のページ(別館)

http://hp.vector.co.jp/authors/VA058115/

https://drive.google.com/file/d/1CyThVKJp-yb_WA3wZS8dY_vn44CU11vb/view?usp=drivesdk

ダウンロードしたZIPファイルは圧縮プロジェクトとしてLPCXpressoからインポートすることが可能です。




























































.