PIC16F1823 EEPROM のはなし
PIC16F1823 EEPROM のはなし とは
PIC16F1823 の開発が佳境に入って、そろそろ設定値をメモリ(EEPROM)に書いて保存する機能をつけようかと思って実装すると、どうもうまくかけていないようだった。プログラムは MPLABX -IDE の MCCというライブラリを使うだけなので簡単!と思っていたらそうでもなかったのでここに備忘録として書いておく。
1)使うルーチンは
void NVM_Initialize(void)
eeprom_data_t EEPROM_Read(eeprom_address_t address)
void EEPROM_Write(eeprom_address_t address, eeprom_data_t data)
の3つでいけるかと思っていたが、もしや書込準備が出来ていなかったのではと思い
bool NVM_IsBusy(void)
でチェックするようにしたが、これでもダメ。ちゃんと OK になって書込ルーチンを実行している。
2) 仕方が無いので、デバッグで、書込ルーチンでステップ実行した。
どこも止まっていたり、エラーが出ているようでは無く最後まで実行していた。
しかしながら、読んでも 0xFF とEEPROM の初期値が出るだけ。
3) 初心に戻って、データーシートの EEPROM 書込の部分をみると。
おおっ! 懐かしい秘密の言葉 0x55、0xAA があるではないですか!
確かにデバッグ中に同じアドレスに何か書いていたけど、0x00 だったので、クリアかな?と思ってスルーしていた..
不用意にプログラムが暴走したりして誤ったデーターが書込まれないように、こんなプロテクトがありましたねー確かに。
4) ではどうやるのかな?と見ていくと
void NVM_UnlockKeySet(uint16_t unlockKey)
{
unlockKeyHigh = (uint8_t) (unlockKey >> 8);
unlockKeyLow = (uint8_t) unlockKey;
}
ってのがありました。でもこの 引数 unlockKey はどこだ...と思って探すと
nvm.h の中に
/**
* @ingroup nvm_driver
* @def UNLOCK_KEY
* Contains the unlock key required for the NVM operations.
*/
#define UNLOCK_KEY (0xAA55U)
とありましたよ、0xAA55 がね
使用するときは、直前にこのルーチンを読んで、終わったらクリアするのが正しい使い方のようです。
めでたく、保存が出来るようになりました。
0xAA と 0x55 はビット反転のペアデータですね。
EEPROM とか Flash メモリーにはよくある話でした。
すっかり忘れてた...


