Kalıcı Belleğe Sık Yazma


10

Sıcaklık değiştikçe fiziksel konumunu otomatik olarak ayarlayan bir cihaz tasarlıyorum. Cihaz kapatıldığı veya güç bağlantısı kesildiği zaman, cihazın son sıcaklık ve konumunu hatırlaması gerekir. Bu değerleri EEPROM'da saklayabiliyorum ama sorun pozisyon ve sıcaklık çok hızlı değişiyor olabilir. Her değiştikten sonra temp ve pos'ı EEPROM'a yazsaydım, (1) bellenimi biraz yavaşlatacak ve (2) muhtemelen bir veya iki yıl sonra EEPROM'u öldürecekti. Gördüğüm gibi seçeneklerim aşağıdaki gibi ...

1) güç kaybolduktan sonra cihazı kısa bir süre güçte tutmak için bir kapasitör / pil kullanın, böylece değerleri sadece o anda EEPROM'a yazabilirim. Bunu sevmiyorum çünkü tahta biraz güç aç ve bu büyük bir başlık gerektirecek. Ve bir ton boş alanım yok. Ve bir pil ve pil tutucusunun / veya büyük bir kapağın ek maliyetini istemiyorum.

2) EEPROM yerine F-RAM kullanın, böylece giymeden trilyonlarca kez yazabilirim. Bu seçeneği sevmiyorum çünkü FRAM EEPROM'dan biraz daha pahalı ve bu bir üretim ürünü için (sadece bir tane değil).

3) Konumu ve sıcaklığı sadece her 5 dakikada bir yazın. Bu şekilde her zaman oldukça yeni bir pozisyonum / temp kaydedildi, ancak her saniye yazmıyorum, böylece programım yavaşlamıyor ve EEPROM o kadar hızlı ölmeyecek. Bu benim en iyi seçeneğim gibi görünüyor.

Düşünmediğim başka bir önerisi olan var mı?


5
Sadece bir soru. Cihaz fiziksel konumunu otomatik olarak ayarlarsa, neden son sıcaklığı hatırlamanız gerekir? Cihazı tekrar açtığınızda, sıcaklık güncellenmeyecek ve konumu ayarlanmayacak mı?
Daniel Grillo

1
Daniel ile aynı fikirdeyim. Gücü kapatırsanız ve ortam sıcaklığı büyük ölçüde değişirse ne olur? Açıldıktan sonra, son kaydedilen sıcaklık / konumu kullandıysanız, yine de yanlış noktada olursunuz ve cihaz ne olursa olsun hareket eder. Sorunuzda listelenmeyen başka bir gereksinim var mı?
Dave

EEPROM spesifikasyonu nedir - kaç yazma döngüsü?
Jason S

Yanıtlar:


10

İhtiyacınız olan şey aşınma tesviye adı verilen bir tekniktir . Verilerinizi her zaman EEPROM'da aynı konuma yazmaz, ancak farklı konumları kullanmak için bazı algoritmalar kullanır. Karmaşık aşınma dengeleme algoritmalarını okudum, ancak aşağıdaki basit yöntemin neden işe yaramadığını bilmiyorum.

Veri bloğunuz örneğin 8 bayt uzunluğunda olacak şekilde verilerinize 24 bit bir sayaç ekleyin. 24AA64'teki sayfalar 32 bayt uzunluğundadır, bu nedenle 64kb EEPROM 256 sayfa alır. Veri sayfasından:

"32 bayttan daha az yazma işlemi yapılırken, sayfanın geri kalanındaki veriler yazılmakta olan veri baytlarıyla birlikte yenilenir. Bu, tüm sayfayı bir yazma döngüsüne dayanmaya zorlar, bu nedenle sayfa başına dayanıklılık belirtilir."

32 bayttan daha küçük veri bloklarını kullanmak mantıklı değil.

İlk sayfanın sayacına bakın. Sıfırsa, o sayfa için maksimum yazma döngüsü kullandınız, böylece bir sonraki sayfaya geçip sayacı kontrol edersiniz. Bir sayaç bulana kadar tekrarlayın> sıfır. Şu anda kullandığınız sayfa budur. Microchip'in EEPROM'ları 1 milyon döngü dayanıklılığa sahiptir ve 64kb EEPROM'da verilen blok başına maksimum 32 bayt örneğiyle 256 milyona yükseltebilirsiniz. Bu, ürünün uzun ömürlü olması için yeterli olmalıdır: Her 5 saniyede bir (!) Yazarsanız 40 yıl.

İlk kullanımda EEPROM'unuzu başlatmak isteyeceksiniz. Bunun ne zaman olduğunu nereden biliyorsun. Başlatma sırasında benzersiz bir imza yazmak için son sayfayı kullanın. Her açılışta imzanın olup olmadığını kontrol edin. Değilse cihazın başlatılması gerekir. Sayacı her sayfada 0xF4240 (1 milyon için) ile önceden ayarlayabilir veya her şeyi 0xFF olarak temizleyebilir ve sayfayı ilk kullandığınızda 0xF4240 yazabilirsiniz.
Bir EEPROM'un başlatılması gereklidir, çünkü bazen üretim / test sürecinde belirli bir örüntü yazılır.

düzenlemek
Aşınma tesviye sorunları çözmek gerekir, ama yine de kapasitör çözümü hakkında yorum yapmak istiyorum. Kartın güce aç olduğunu söylüyorsunuz, ancak mikrodenetleyicinin / EEPROM'un gücünü kartın geri kalanından bir diyotla izole edebilirsiniz. Yani ana güç bittiğinde muhtemelen sadece birkaç mA'ya ihtiyacınız olacak. 24AA64, 5ms'den daha az bir sayfa, daha sonra 10mA ve 100mV'lık izin verilen bir voltaj düşüşünde bir sayfa yazar

C=ItΔV=10mA5ms100mV=500μF

Küçük bir üst kapak ile kolay.

ek okuma
veri sayfası 24AA64
EEPROM Dayanıklılık Eğitimi


EEPROM'un dayanıklılığı sayfa başına verilir (en azından 24AA64 ve kullandığım diğer EEPROM'lar için). 24AA64, 32 baytlık bir sayfa belirtir, bu nedenle sayı blok başına değil sayfa başına olmalıdır.
Saad

@Saad - Doğru. Cevabım düzeltildi.
stevenvh

4

1) Yazma işlemine başladıktan sonra, yalnızca MCU / EEPROM'a güç vermeniz ve kontrol çizgilerinin aksak olmadığından emin olmanız gerekir - I2C muhtemelen bunun için SPI'yı tercih eder. Birkaç milisaniye boyunca sadece birkaç mA'ya ihtiyaç vardır, bu nedenle büyük bir başlık olmamalıdır ve yazma başlatıldıktan sonra MCU'yu uyku moduna geçirebilirsiniz. 3) muhtemelen bir zeka uygulayabilirsiniz, örneğin bir engel - yazıldıktan sonra, her zaman belirli bir zaman alır, çünkü başka bir yazma gerçekleşebilir. Veya yazmadan önce değerin bir süre sabit kalmasını bekleyin.
Verileri çeşitli konumlara yayarak dayanıklılığı artırabilirsiniz. Mikroçip, eepromlarının dayanıklılığını hesaplamak için yararlı olabilecek bazı araçlara ve notlara sahiptir.


4
Dayanıklılık ile ilgili Microchip Uygulaması notu: ww1.microchip.com/downloads/en/AppNotes/01019A.pdf Appnote'tan, çalışma voltajını 5v'den 3.5v'ye düşürerek dayanıklılığı yaklaşık 2 kat artırabilirsiniz.
vandee

1
İlk yönteminizi kullanırsanız, kalıcı belleğe yazmanın, başladıktan sonra sisteminizdeki en yüksek öncelik olduğundan emin olun. kesintiler, değerlerinizin orta yazımın değişmesine veya mikro'nun zamanınız tükenmesine neden olan başka bir işlem başlatmasına neden olamaz. Gücü kapatırken bozuk değerler yazmamanız çok önemlidir. Ayrıca, değerlerin üzerinde bir CRC, bozulmanın olmadığını doğrulamanıza yardımcı olur, ancak varsa varsayılanları kullanmak gibi ne yapacağınıza karar vermeniz gerekir.
Martin

3

Bir blok yönelimli flaş cihazı kullanmanızı ve her bloktan bir bayt mod modu olarak kullanmanızı öneririm. Hemen hemen tüm mod bayraklarının programlanacağını bir değişmez olarak koruyun; mod bayrağının programlanmadığı, ancak önceki bloğun (gerekirse sarma) olduğu tek bir blok olacaktır. Bu blok en son verilere sahip blok olacaktır. Bu blok dolduğunda, aşağıdaki bloğu silin (silinen bloğun silme döngüsü sırasında herhangi bir veri kombinasyonunu tutabileceğini ve değişmezin hala tutabileceğini unutmayın), ardından silme işlemi tamamlandıktan sonra, son blok olun.

Bir bayt programlama girişiminin tamamının başarılı olmasını veya başarısız olmasını sağlamak için flaşın beslemesini yeterince iyi korumak gerekir, ancak bir silme döngüsünün rastgele verilerle dolu bir blok bırakarak kesilmesi önemli değildir, çünkü bir veri girişi yazma girişimi bu bloğu yeniden silecektir.

Verileriniz 16 bit ise, 64Kx8 yongası 32.000'den fazla girişi tutacaktır. Saniyede bir giriş yazmak çipi yaklaşık 2.7 kez dolduracaktır. "Sadece" 10K silme döngüsüne dayanıklı bir çip bile 10 yıldan fazla sürecekti. Daha büyük bir çipin veya 100K dayanıklılığa sahip bir çipin kullanılması, kullanım ömrünü orantılı olarak artıracaktır.


2

1) Donanım değişiklikleri gerektirse de, muhtemelen en basit seçenek. Bunu daha önce PBC modifikasyonları olmadan sadece ayırma kapaklarını artırarak ve kahverengileşmeyi keserek başardım.

2) Belirttiğiniz gibi, FRAM ile ilgili sorun fiyattır!

3) Sıcaklık ve konum verilerinizin oynaklığına bağlı olarak, dayanıklılığı yalnızca değer değiştiğinde yazarak artıracaksınız. Sıcaklığı saniyede bir kez örnekliyor olabilirsiniz, ancak yalnızca 5 dakikada bir değişirse sorun çözülür.


1

Projemdeki bu sorunu şu şekilde çözdüm:

Kullanılmayan yuvaların bir bit maskesini ve değer için bir dizi yuva tutmak için 1 sektör flaş ayırın.

Kullandığım bitmask 16 bayt uzunluğundaydı, bu yüzden değerler koymak için 128 yuvam vardı.

Bitmask, flash terimlerle silinen durum olan herkese başlatılır.

Yeni bir değer yazmak istediğinizde, bit maskını okuyun ve ilk biti bulun. Bu, değeri yazacağınız yuva numarasıdır. Kullanıldığı gibi işaretlemek için bu biti sıfıra değiştirin ve bit maskesini önce silmeden tekrar flaşa yazın. Ardından, bitmaskinden sonra değeri flaşı silmeden de yuvaya yazın.

Bu şekilde, yeni bit maskını yalnızca bir taneden sıfıra değiştirerek yazarak flaş yazma döngülerini 128 kat uzatırsınız.

Tüm bitmask 0 ise, flaş sektörünü silin ve yeni başlayın.


3
Sizi hayal kırıklığına uğratabilirim, ancak biraz parladığınızda, tüm sektörün üzerine yazılır. Çözümünüz 'bitmask' sektörünü çok yakında ölecek.
Andrejs Cainikovs

1
Flaşı silmezseniz, sektör için 10K silme döngülerinden birini kullanmazsınız. 0x7F değerine sahipseniz ve 0x3F değerini yazarsanız, sonuç 0x3F olur. Bu, bit maskesini güncel tutar, ancak flaşı silmez. Silme işlemi yalnızca tüm bitmask 0 olduğunda gerçekleşir.
Robert

Eğer yanılıyorsam, tartışalım. Burada kötü cevaplar istemiyorum ve projemde gerçekten kötü bir tasarım istemiyorum.
Robert

Bence Robert haklı. Mikrodenetleyicimde, bir seferde yalnızca 4 bayt yazabilirsiniz, ancak gerekli bitler sıfıra ayarlanır. Onları 1'lere geri getirmenin tek yolu 1k bloğunu boşaltmaktır. Bu sadece flaş giyen silme döngüleri ...
Tim

Her bellek türü ve hatta bellek satıcısı için farklı olabilir. EEPROM'ların sayfayı silmesi ve her yazma için yeniden yazması gerektiğini gördüm. Sayfayı silmeden hala 1 olan bitler yazabileceğiniz flash bellek gördüm.
mjh2007
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.