Flash bellek: Sadece birkaç bayt yazmadan önce tüm sayfanın silinmesi gerekiyor mu?


16

Umarım kolay bir soru! Kesin cevap bulamıyorum ...

SST25VF064C flash bellek yongası için sürücüler yazıyorum . SPI üzerinden iletişim kurar.

Bildiğim tüm flash bellekler gibi, yazılabilmesi için önce (tüm bitler = 1) silinmesi gerekir (bitler = 0). Bu yonga için silinebilecek en küçük alan 4kB'dir.

Belleği 256 baytlık sayfalara ayrılmıştır. Bir komutla, bir bayttan 256 bayta herhangi bir yere belirtilen bir sayfaya yazabilirim. Bir sayfa sınırında başlamak zorunda değilim: programlanacak ilk konum bir sayfanın herhangi bir yerinde olabilir.

Genel kural, sayfaya yazmadan önce sayfanın silindiğinden emin olmaktır. Ancak, önceden yazılmış alanlardan kaçınırsam, önceden yazılmış bir sayfaya yazabilir miyim? Örneğin, veriyi 0-127 baytta sakladığımı varsayalım. Daha sonra byte 128'den başlarsam aynı sayfaya başka bir 128 bayt yazabilir miyim?

Yanıtlar:


13

Evet, herhangi bir silme işleminden sonra, bir sonraki silme işleminden önce veri yazmak (bitleri 1'den 0'a değiştirmek) için istediğiniz sayıda ayrı işlemi kullanabilirsiniz.

Yalnızca daha fazla biti temizlediğiniz sürece önceden yazılmış bir konumu yeniden yazabilirsiniz. Bu, ayırma bitmapleri gibi şeyleri korumak için kullanışlı olabilir.


Mükemmel, teşekkürler! Aradığım şey buydu.
bitsmack

Bazı yongaların, daha sonra çeşitli veri sayfalarına baktıktan sonra daha eski bir bayt yazmanızı sevmediğini unutmayın, ancak bu, cihazlar arasında değişiklik gösterebilir.
Vality

1
@Vality: Buna bir örnek verebilir misiniz?
Dave Tweed

3
@DaveTweed NXP LPC21xx ve LPC23xx MCU'ların her 16 bayt bellek için bir sağlama toplamı baytı vardır; bu işlemde sağlama toplamı yazıldığından, 16 baytın tümünü aynı anda yazmalısınız. Daha sonra gelir ve sıfırları aynı "satırda" yazmaya çalışırsanız, sıfırlar yazılır, ancak öncekinin üzerine de yeni bir sağlama toplamı yazılır; şansı, önceki 0'ların olduğu bazı 1'lere sahip olması, bu nedenle sağlama toplamı geçersiz olur. MCU'nun sağlama toplamı kötü olan bir satırı okumanıza izin verip vermediğini hatırlamıyorum. Her neyse, bu "cihazlar arasında değişiklik" e bir örnek olacaktır.
Guillermo Prandi

1
"herhangi bir sayıda ayrı işlem yazmak ... sonraki silme işlemi." Bazı parçaların, özellikle de MCU'lara gömülü flash belleklerin, bir silme işlemine gerek kalmadan maksimum sayıda yazma olduğunu belirtir. Muhtemelen bu sınırı ihlal etmek, hafızanın diğer alanlarını bozma riski taşıyacaktır, bu nedenle bu sınırlara dikkat etmek önemlidir.
ajb

5

önceden yazılmış alanlardan kaçınırsam, önceden yazılmış bir sayfaya yazabilir miyim?

Anlarsam s. Veri sayfasının 16'sı doğru bir şekilde söylüyor: Bu özel çip ile, önceden yazılmış alanlardan kaçınsanız bile önceden yazılmış bir sayfaya yazmamalısınız.

ayrıntılar

SST25VF064C flaş bellek yongası veri sayfası p. 16 "Sayfa-Program talimatı, bellekte 256 bayta kadar veri programlamaktadır. Sayfa-Program işlemini başlatmadan önce seçilen sayfa adresinin silinmiş durumda (FFH) olması gerekir."

Bu nedenle "Sayfa Programı işlemini başlatmadan önce seçilen sayfanın tamamı silinmiş durumda olmalıdır (sayfadaki her bayt)." SST veya Microchip bu çılgınca belirsiz cümleyi açıklayan herhangi bir belge yayınladı mı?

Deneyimlerime göre, tüm MLC flaş yongalarının ve bazı yeni SLC flaş yongalarının üreticisi, bir sayfa yazıldıktan sonra, sadece bir bit biraz değiştirmek istiyorsanız bile, sayfanın o sayfa tekrar yazılmadan önce silinmesi gerektiğini zorunlu kılar. 0 bit. (Bu denir "yazma kez kuralı" in YAFFS makalesinde .)

Benim tecrübeme göre, tüm eski flash yongaları, bir bitin bir döngüde veya hatta sıfır olarak programlanmış başka bitleri olan bir baytta olsa bile, 1 biti silme döngüsü olmadan 0 bit olarak değiştirmenize izin verir. flaş sayfası silme işlemleri arasında birden çok kez programlanabilir. (Buna YAFFS makalesinde "çoklu yazma" denir).

Üreticinin veri sayfası, üreticinin size verdiği koşullu bir vaattir. Tüm veri sayfası önerilerine uyduğunuz sürece, üretici çipin belirtilen şekilde çalışacağına söz verir. Önceden yazılmış bir sayfayı programlarsanız, önceden yazılmış alanlardan kaçınırsanız, anında okumanın beklediğiniz verileri verebileceğinden daha iyi bir şans olduğunu düşünüyorum - yeni yazılmış baytlar az önce yazdığınız değerlerdir, ve diğer baytlar muhtemelen değişmez. Ancak, bu veri sayfası önerilerine uymadığından, veri sayfasındaki tüm vaatlere artık güvenemezsiniz. Böyle bir yaptırım uygulanmayan etkinliğin, programın bozulması, aşırı programlama, şarj tuzağı, DRAM satır çekiçine benzer etkiler nedeniyle veri saklama süresinin ve dayanıklılığının acı çekmesine neden olduğu söylentilerini duyuyorum .

"Bellek kullanım şeması bit hata oranını etkiler. Kısmi sayfa programlama, blok içinde sıralı olmayan sayfa programlama, silme olmadan blok başına aşırı okuma ve tek bir blokta eşit olmayan okuma işlemi okuma sayısını artırır hataları bozun. " - Michal Jedrak. Msgstr "Gömülü sistemlerde NAND Flash bellek".

"Program bozukluğu, bir sayfa programlama olayı sırasında bir bit yanlışlıkla" 1 "den" 0 "a programlandığında meydana gelir. Bu bit hatası, programlanan sayfada veya bloktaki başka bir sayfada oluşabilir. sayfa programlama sırasında blok, yakındaki bellek hücrelerine küçük miktarda akım tüneline neden olabilir. Tekrarlanan kısmi sayfa programlama girişimleri bu durumu şiddetlendirmeye devam edecektir. " - Douglas Sheldon ve Michael Freie. Msgstr "Flash Anılarda Rahatsız Etme Testi" . s. 8, 9.

"Bir programlama işlemi sırasında istem dışı bir şekilde programlandığında (1 - 0) program bozukluğu meydana gelir. ... Bu durum, blokta rastgele programlama ve sayfalara birden fazla kısmi yazma uygulanarak daha da kötüleşir." "Yaffs NAND flaş arıza azaltma"


0

Kullandığınız programlama yazılımının zaten "gerekli" 256 bayt yazması muhtemeldir. Sana onun bir ila 256 bayt yazma yeteneği veriyor gibi görünüyor, ama onun yaptığının 256 "FF" bir "maske" ile istediğiniz bayt (lar) OR-ing olduğundan şüpheleniyorum. Bu doğruysa, tüm 4K baytları silmek zorunda kalmadan herhangi bir baytı bir kez "güvenli bir şekilde" yazabilirsiniz . Bir sağlama toplamı denetiminizin dışında yazılırsa, büyük olasılıkla, önceden yazılmış bir segmente başka bir bayt yazdığınızda geçersiz bir sağlama toplamı oluşturulur. Bunun sonuçları çip bağımlıdır.

Programlama yazılımınız "OR-ing" yapmazsa, bunu kendiniz yapabilirsiniz. 256 baytlık bir segmenti temizleyin, bayt (lar) ı doğru pozisyon (lar) a VEYA 256 baytlık bir FF maskesi ile segmenti istediğiniz sayfaya yazın.

Her iki yöntemin belirli bir yonga ile çalışıp çalışmadığı kolayca sizin tarafınızdan belirlenebilir. İlk 128 bayta yazın, ikinci 128 bayta yazın, ilk 128 baytın "dağınık" OLMADIĞINI doğrulayın!

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.