Sering Menulis ke Memori Non-volatile

10

Saya merancang perangkat yang secara otomatis menyesuaikan posisi fisiknya saat suhu berubah. Jika perangkat itu mati atau daya terputus, perangkat perlu mengingat itu suhu terakhir dan posisi. Saya memiliki kemampuan untuk menyimpan nilai-nilai ini di EEPROM tetapi masalahnya adalah posisi dan suhu bisa berubah dengan sangat cepat. Jika saya menulis temp dan pos ke EEPROM setelah setiap kali mereka berubah yang akan (1) memperlambat firmware sedikit, dan (2) kemungkinan membunuh EEPROM setelah satu atau dua tahun. Jadi seperti yang saya lihat, opsi saya adalah sebagai berikut ...

1) menggunakan kapasitor / baterai untuk menjaga daya perangkat untuk waktu yang singkat setelah daya hilang sehingga saya dapat menulis nilai-nilai ke EEPROM pada saat itu saja. Saya tidak suka ini karena papan agak lapar daya dan ini akan membutuhkan topi besar. Dan saya tidak punya banyak ruang kosong. Dan saya tidak ingin biaya tambahan baterai dan dudukan baterai / atau topi besar.

2) gunakan F-RAM bukan EEPROM sehingga saya bisa menulis triliunan kali tanpa memakainya. Saya tidak suka opsi ini karena FRAM sedikit lebih mahal daripada EEPROM dan ini untuk produk produksi (bukan hanya satu).

3) Hanya tulis posisi dan suhu setiap 5 menit atau lebih. Dengan begitu saya selalu memiliki posisi / temp yang baru direkam tetapi saya tidak menulis setiap detik sehingga program saya tidak melambat dan EEPROM tidak akan mati secepat itu. Ini sepertinya pilihan terbaik saya.

Adakah orang lain yang memiliki saran yang tidak saya pikirkan?

PICYourBrain
sumber
5
Hanya sebuah pertanyaan. Jika perangkat secara otomatis menyesuaikan posisi fisiknya, mengapa Anda perlu mengingat suhu terakhir? Ketika Anda menghidupkan lagi perangkat, itu tidak akan memperbarui suhu dan menyesuaikan posisinya?
Daniel Grillo
1
Saya setuju dengan Daniel. Bagaimana jika Anda mematikan dan suhu sekitar berubah secara drastis? Setelah powerup, jika Anda menggunakan temp / posisi yang disimpan terakhir, Anda akan berada di tempat yang salah, dan perangkat akan berakhir bergerak terlepas. Apakah ada persyaratan lain yang tidak tercantum dalam pertanyaan Anda?
Dave
Apa spesifikasi EEPROM - berapa banyak siklus tulis?
Jason S

Jawaban:

10

Yang Anda butuhkan adalah teknik yang disebut leveling pakaian . Itu tidak menulis data Anda setiap kali di lokasi yang sama di EEPROM, tetapi menggunakan beberapa algoritma untuk menggunakan lokasi yang berbeda. Saya telah membaca tentang algoritme perataan level keausan yang kompleks, tetapi saya tidak akan tahu mengapa metode sederhana berikut tidak bekerja.

Tambahkan ke data Anda penghitung 24-bit, sehingga blok data Anda misalnya panjangnya 8 byte. Halaman pada 24AA64 panjangnya 32 byte, sehingga EEPROM 64kb menampung 256 halaman. Dari lembar data:

"Ketika melakukan penulisan kurang dari 32 byte, data di seluruh halaman di-refresh bersama dengan byte data yang sedang ditulis. Ini akan memaksa seluruh halaman untuk bertahan dalam siklus penulisan, karena alasan ini daya tahan ditentukan per halaman."

jadi tidak masuk akal untuk menggunakan blok data yang lebih kecil dari halaman 32 byte.

Lihatlah penghitung halaman pertama. Jika nol, Anda menggunakan jumlah maksimum siklus tulis untuk halaman itu, jadi Anda pindah ke halaman berikutnya dan periksa penghitung itu. Ulangi sampai Anda menemukan penghitung> nol. Itu adalah halaman yang sedang Anda gunakan. EEPROM Microchip memiliki daya tahan 1 juta siklus, yang dapat Anda tingkatkan hingga 256 juta dengan contoh maksimum 32 byte per blok dalam EEPROM 64kb. Itu seharusnya cukup untuk bertahan lebih lama dari produk Anda: 40 tahun jika Anda menulis sekali setiap 5 detik (!).

Anda ingin menginisialisasi EEPROM Anda saat pertama kali digunakan. Bagaimana Anda tahu kapan itu terjadi? Gunakan halaman terakhir untuk menulis tanda tangan unik saat inisialisasi. Periksa setiap power-up jika tanda tangan ada di sana. Jika bukan perangkat harus diinisialisasi. Anda dapat mempra-setel penghitung di setiap halaman dengan 0xF4240 (untuk 1 juta) atau menghapus semuanya menjadi 0xFF dan menulis 0xF4240 saat pertama kali menggunakan halaman tersebut.
Inisialisasi EEPROM diperlukan karena kadang-kadang pola tertentu ditulis untuk itu dalam proses produksi / pengujian.

sunting
Leveling keausan harus menyelesaikan masalah Anda, tetapi saya masih ingin mengomentari solusi kapasitor. Anda mengatakan papan agak haus daya, tetapi mungkin Anda dapat mengisolasi mikrokontroler / kekuatan EEPROM dari sisa papan dengan dioda. Jadi, Anda mungkin hanya perlu beberapa mA ketika daya utama hilang. The 24AA64 menulis halaman dalam waktu kurang dari 5ms, kemudian pada 10mA dan penurunan tegangan yang diijinkan sebesar 100mV yang Anda perlukan

C=sayatΔV=10mSEBUAH5ms100mV=500μF

Mudah dengan supercap kecil.

lanjut membaca
datasheet 24AA64
EEPROM Tutorial Endurance

stevenvh
sumber
Daya tahan EEPROM diberikan per halaman (setidaknya untuk 24AA64 dan EEPROM lain yang saya gunakan). 24AA64 menentukan halaman 32-byte, jadi hitungannya harus per halaman dan bukan per blok.
Saad
@ Saad - Benar. Memperbaiki jawaban saya.
stevenvh
4

1) Setelah Anda memulai proses penulisan, Anda hanya perlu memberi daya pada MCU / EEPROM dan memastikan garis kontrol tidak salah - I2C mungkin lebih baik daripada SPI untuk ini. Hanya perlu beberapa mA untuk beberapa milidetik jadi jangan menjadi topi besar, dan Anda bisa membuat MCU tertidur setelah penulisan dimulai. 3) Anda mungkin dapat menerapkan beberapa kecerdasan, misalnya penangguhan - setelah ditulis itu selalu memiliki waktu tertentu sebelum penulisan lain dapat terjadi. Atau tunggu sampai nilai stabil untuk sementara waktu sebelum menulis.
Anda juga dapat meningkatkan daya tahan dengan menyebarkan data ke sejumlah lokasi. Microchip memiliki beberapa alat & catatan aplikasi untuk menghitung daya tahan untuk eeprom mereka, yang mungkin berguna.

mikeselectricstuff
sumber
4
Catatan Microchip App tentang daya tahan: ww1.microchip.com/downloads/en/AppNotes/01019A.pdf Dari Appnote, Anda juga dapat meningkatkan daya tahan sekitar 2x dengan mengurangi tegangan operasi dari 5v ke 3.5v.
vandee
1
Jika Anda menggunakan metode pertama Anda, pastikan bahwa menulis ke memori nonvolatile adalah prioritas tertinggi dalam sistem Anda setelah dimulai, yaitu. interupsi yang tidak dapat menyebabkan nilai Anda berubah pada pertengahan penulisan atau mikro untuk memulai beberapa pemrosesan lain yang membuat Anda kehabisan waktu. Yang paling penting adalah Anda tidak menulis nilai korup saat Anda mematikannya. Selain itu, CRC pada nilai-nilai akan membantu Anda mengkonfirmasi bahwa korupsi tidak terjadi, tetapi Anda harus memutuskan apa yang harus dilakukan jika itu terjadi, seperti menggunakan default.
Martin
3

Saya menyarankan menggunakan perangkat flash berorientasi blok, dan menggunakan satu byte dari setiap blok sebagai flag mode. Pertahankan sebagai invarian bahwa hampir semua flag mode akan diprogram; hanya akan ada satu blok di mana flag mode tidak diprogram tetapi blok sebelumnya (pembungkus jika perlu) adalah. Blok itu akan menjadi yang memiliki data terbaru. Ketika blok itu terisi, hapus blok berikut (perhatikan bahwa blok yang terhapus dapat menampung kombinasi data selama siklus hapus, dan invarian akan tetap bertahan), maka setelah penghapusan dilakukan memprogram mode flag pada apa yang digunakan untuk menjadi blok terakhir.

Penting untuk melindungi pasokan ke flash dengan cukup baik untuk memastikan bahwa setiap upaya untuk memprogram byte akan berhasil atau gagal secara keseluruhan, tetapi itu tidak masalah jika siklus penghapusan terganggu meninggalkan blok yang penuh dengan data acak, karena upaya selanjutnya untuk menulis entri data akan menghapus kembali blok itu.

Jika data Anda 16 bit, sebuah chip 64Kx8 akan menampung lebih dari 32.000 entri. Menulis satu entri per detik akan mengisi chip sekitar 2,7 kali. Bahkan sebuah chip dengan daya tahan "hanya" siklus penghapusan 10K akan bertahan lebih dari 10 tahun. Penggunaan chip yang lebih besar, atau yang memiliki daya tahan 100K, akan meningkatkan masa manfaat secara proporsional.

supercat
sumber
2

1) Mungkin opsi paling sederhana, meskipun mungkin membutuhkan perubahan perangkat keras. Saya telah mencapai ini sebelumnya tanpa modifikasi PBC hanya dengan meningkatkan tutup decoupling dan menyela brown-out.

2) Seperti yang telah Anda tunjukkan, masalah dengan FRAM adalah harganya!

3) Bergantung pada volatilitas data suhu dan posisi Anda, Anda akan meningkatkan daya tahan dengan hanya menulis jika nilainya telah berubah. Anda mungkin mengambil sampel suhu sekali setiap detik, tetapi jika itu hanya berubah setiap 5 menit, masalahnya terpecahkan.

Tim
sumber
1

Inilah cara saya memecahkan masalah ini dalam proyek saya:

Cadangan 1 sektor flash untuk memegang bitmask slot yang tidak digunakan dan sejumlah slot untuk nilainya.

Bitmask yang saya gunakan panjangnya 16 byte, jadi saya punya 128 slot untuk memasukkan nilai.

Bitmask diinisialisasi ke semua yang, yang dalam istilah flash adalah status terhapus.

Saat Anda ingin menulis nilai baru, baca bitmask dan temukan bit pertama yang bernilai satu. Ini adalah nomor slot tempat Anda akan menuliskan nilainya. Ubah bit itu menjadi nol untuk menandainya seperti yang digunakan dan tulis bitmask kembali ke flash tanpa terlebih dahulu menghapusnya. Selanjutnya, tulis nilai ke slot setelah bitmask juga tanpa menghapus flash.

Dengan cara ini, Anda memperpanjang siklus penulisan flash sebanyak 128 kali dengan menulis bitmask baru hanya dengan perubahan dari yang satu ke nol.

Jika seluruh bitmask adalah 0, maka hapus sektor flash dan mulai segar.

Robert
sumber
3
Saya mungkin mengecewakan Anda, tetapi ketika Anda flash sedikit, seluruh sektor ditimpa. Solusi Anda akan membuat sektor 'bitmask' mati segera.
Andrejs Cainikovs
1
Jika Anda tidak menghapus flash, Anda tidak menggunakan salah satu dari siklus 10K hapus untuk sektor ini. Jika Anda memiliki nilai 0x7F dan Anda menulis nilai 0x3F, hasilnya adalah 0x3F. Ini membuat bitmask tetap mutakhir, tetapi tidak menghapus flash. Penghapusan hanya terjadi setelah seluruh bitmask adalah 0.
Robert
Jika saya salah, mari kita bahas. Saya tidak ingin jawaban buruk di sini dan saya benar-benar tidak ingin desain yang buruk dalam proyek saya.
Robert
Saya pikir Robert benar. Pada mikrokontroler saya, Anda hanya dapat menulis 4 byte pada satu waktu, tetapi bit yang diperlukan diatur ke nol. Satu-satunya cara untuk mengembalikan mereka ke angka 1 adalah dengan mengosongkan blok 1k. Satu-satunya siklus penghapusan yang memakai flash ...
Tim
Mungkin berbeda untuk setiap jenis memori dan bahkan mungkin vendor memori. Saya telah melihat EEPROM harus menghapus halaman kemudian menulis ulang untuk setiap penulisan. Saya telah melihat memori flash Anda dapat menulis bit yang masih 1 tanpa menghapus halaman.
mjh2007