私はLPC4078とMCUXpressoを使用して、EEPROMに値を保存する実験を行っています。
ページ全体を消去せずに、ページの中央に数バイトのデータを書き込みたい。
データシートを見ると、ページレジスタに書き込むデータを書き込んだ後、さらに不揮発性メモリにプログラムする必要があり、それは消去/プログラム操作によって行われると記載されている。
消去/プログラム操作は、ページ全体を消去するのか、それとも新しいデータが格納されているページ領域だけを消去するのか、また、どのようにしてそれを判断するのか?- 消去/プログラム用のアドレス設定では、6 つの lsb が無視されるため、ページのみが認識されます。
UM10562.pdfには、このマターについて明確な記載はありません。
よろしくお願いします。
アレックス
該当プロジェクトを含むワークスペースを添付します。LPC4078上でlpc-link2デバッガを使って実行しました。
(セミホスティングを動作させるのが面倒だったので、ブレークポイントを使ってデータを検査しました。)
こんにちは、 @alex_conway さん。
こんにちは、アリスさん。
私の実験結果はそれとは異なることを示している。
まずは手始めに、lpc_board_ea_devkin_4088ライブラリとperiph_eepromデモプロジェクトを使って小さなプログラムを作成しました。
EEPROMの1ページを消去して、それを読み戻します。驚いたことに、結果は0xFFではなくすべて'\0'だった。
次に、そのページのアドレス0に「ABCDEFG\0」を書き込み、ページを読み戻します。「ABCDEFG\0」を受け取ります
次に、そのページのアドレス7に「ABCDEFG\0」を書き込み、ページを読み戻します。「ABCDEFGABCDEFG\0」を受け取ります
これはすべて予想通りだったが、2点だけ例外があった。
1. EEPROMを消去した後、0を読み取る
2. Chip_EEPROM_Write() の実装を見ると、読み出し-変更-消去-書き込みのシーケンスがないように見えます。Chip_EEPROM_WritePageRegister と Chip_EEPROM_EraseProgramPag があるだけです。
だから私はこの質問をしたのです。
よろしくお願いします。
アレックス
printf文字列にすべて改行を追加したら、セミホスティングがうまく動作するようになりました!また、私が言ったことすべてをより明確に裏付ける証拠もあります。
消去するとEEPROMが0x00に設定されます
このコードは、読み取り→変更→消去→書き込みのシーケンスを実行せず、消去→書き込みのみを実行します。
LPC4078は、消去時に書き込みが行われた場所のみを消去するようです。
この点について、ぜひとも明確な説明をいただきたいです。
よろしくお願いします。
アレックス
「エスカレーション」という言葉が何を意味するにせよ、NXPからはこれに関してそれ以上の回答は得られていない。
まだ確認が必要です。
こんにちは、 @alex_conway さん。
ご返信ありがとうございます。返信が遅くなり申し訳ありません。
残念ながら、以前はコミュニティスクリプトが壊れていたため、お客様からの返信が内部システムでのCASE更新通知を発生させませんでした。遅れてしまい、誠に申し訳ございません。
LPC4078上のEEPROMに関しては、ユーザーマニュアルによると、実際のEEPROMブロックとの通信はすべて64バイトのページバッファを通じて行われます。したがって、EEPROM運用がユーザーマニュアルに記載された要件に従うことを必ず確認してください。
現時点では、EEPROMがこれらの要件に従ってアクセスされない限り、問題があるかどうか判断できません。
よろしくお願いします。
BR
アリス
こんにちは、アリスさん。
私はeeprom_17xx_40xx.hの関数を使用しています。および eeprom_17xx_40xx.c(NXP社提供、添付プロジェクトに含まれています)
Chip_EEPROM_Write() 関数は、Chip_EEPROM_WritePageRegister() 関数を呼び出し、続いて Chip_EEPROM_EraseProgramPage() 関数を呼び出します。
Chip_EEPROM_WritePageRegister()関数は、下位6ビットのシフトとブランキングを処理するChip_EEPROM_SetAddr()関数を使用してEEPROMアドレスを設定します。
次に、Chip_EEPROM_WriteData() 関数を使用して、データバイトが EEPROM 書き込みデータレジスタ (WDATA) に書き込まれます。
Chip_EEPROM_EraseProgramPage() 関数は、Chip_EEPROM_SetAddr() 関数を使用してページ アドレスを設定し、消去/ページ プログラム ビットを有効にして、プログラミングが完了するまで待機します。
ページ内の既存のEEPROMデータを読み込んでページを読み取って、ページを読み書き・修正・書き込みを行うコードは見当たりません。
しかし、私のプロジェクトで実証したように、EEPROMページの消去はページ全体を消去するのではなく、書き込みデータレジスタに新しいデータがロードされたアドレスのみを消去するようです。
よろしくお願いします。
アレックス