Pamięć flash: Czy całą stronę należy usunąć przed zapisaniem zaledwie kilku bajtów?

16

Proste pytanie, mam nadzieję! Nie znajduję żadnych ostatecznych odpowiedzi ...

Piszę sterowniki do układu pamięci flash SST25VF064C . Komunikuje się przez SPI.

Podobnie jak cała pamięć flash (o której wiem), należy ją usunąć (wszystkie bity = 1), zanim będzie można ją zapisać (bity = 0). W przypadku tego układu najmniejszy obszar, który można usunąć, to 4 kB.

Jego pamięć jest podzielona na 256-bajtowe strony. Za pomocą jednej instrukcji mogę zapisać w dowolnym miejscu od jednego bajtu do 256 bajtów na określonej stronie. Nie muszę zaczynać od granicy strony: pierwsza zaprogramowana lokalizacja może znajdować się w dowolnym miejscu na stronie.

Ogólną zasadą jest upewnienie się, że strona jest usuwana przed zapisaniem na niej. Ale czy mogę pisać na wcześniej napisanej stronie, jeśli unikam wcześniej napisanych obszarów? Powiedzmy na przykład, że przechowuję dane w bajtach 0–127. Czy mogę później zapisać kolejne 128 bajtów na tej samej stronie, jeśli zacznę od bajtu 128?

bitsmack
źródło

Odpowiedzi:

13

Tak, po każdym skasowaniu możesz użyć dowolnej liczby osobnych operacji do zapisania danych (zmiana bitów z 1 na 0) przed następną operacją kasowania.

Możesz nawet przepisać wcześniej zapisaną lokalizację, o ile usuwasz tylko więcej bitów. Może to być przydatne do utrzymywania takich rzeczy jak bitmapy alokacji.

Dave Tweed
źródło
Wspaniale, dziękuje! Właśnie tego szukałem.
bitsmack,
Zauważ, że niektóre układy nie lubią, gdy piszesz wcześniejszy bajt po późniejszym, patrząc na różne arkusze danych, jednak wydaje się, że różnią się one w zależności od urządzenia.
Vality
1
@Vality: Czy możesz podać przykład tego?
Dave Tweed
3
@DaveTweed NXP LPC21xx i LPC23xx MCU mają bajt sumy kontrolnej na każde 16 bajtów pamięci; musisz zapisać wszystkie 16 bajtów jednocześnie, ponieważ suma kontrolna jest zapisywana w tej operacji. Jeśli przyjdziesz później i spróbujesz zapisać zera w tym samym „wierszu”, zera zostaną zapisane, ale nowa suma kontrolna zostanie również zapisana w stosunku do poprzedniego; są szanse, że ma jakieś 1, gdzie poprzednie miały 0, więc suma kontrolna staje się nieważna. Nie pamiętam, czy MCU pozwala ci odczytać wiersz ze złą sumą kontrolną. W każdym razie byłby to przykład „różnią się w zależności od urządzenia”.
Guillermo Prandi
1
„dowolna liczba oddzielnych operacji do zapisania ... następna operacja usuwania.” Należy pamiętać, że niektóre części, szczególnie wbudowane pamięci flash w MCU, będą określać maksymalną liczbę zapisów, zanim konieczne będzie usunięcie. Przypuszczalnie przekroczenie tego limitu może spowodować uszkodzenie innych obszarów pamięci, dlatego ważne jest, aby uważać na takie limity.
ajb
5

czy mogę pisać na wcześniej napisanej stronie, jeśli unikam wcześniej napisanych obszarów?

Jeśli rozumiem p. 16 z arkusza danych poprawnie, mówi: Za pomocą tego konkretnego układu nie możesz pisać na wcześniej napisanej stronie, nawet jeśli unikniesz już napisanych obszarów.

Detale

Karta danych układu pamięci flash SST25VF064C na str. 16 mówi „Instrukcja programu strony programuje do 256 bajtów danych w pamięci. Wybrany adres strony musi być w stanie wymazanym (FFH) przed rozpoczęciem operacji programu strony”.

Zakładam, że zatem „Cała wybrana strona musi być w stanie wymazanym (każdy bajt na stronie FFh) przed rozpoczęciem operacji programu strony”. Czy SST lub Microchip wydało jakąkolwiek dokumentację wyjaśniającą to irytująco dwuznaczne zdanie?

Z mojego doświadczenia wynika, że ​​producent wszystkich układów flash MLC i niektórych nowszych układów flash SLC nakazuje, że po napisaniu strony strona musi zostać skasowana przed ponownym zapisaniem tej strony, nawet jeśli chcesz zmienić tylko 1 bit na 0 bit. (Jest to tak zwana „zasada jednokrotnego zapisu” w artykule YAFFS ).

Z mojego doświadczenia wynika, że ​​wszystkie starsze układy flash pozwalają zmienić dowolny 1 bit na 0 bez cyklu kasowania, nawet jeśli ten bit znajduje się na stronie lub nawet w bajcie, w którym inne bity zostały już zaprogramowane na zero - a stronę flasha można programować wielokrotnie między skasowaniami. (W artykule YAFFS nazywa się to „wielokrotnym zapisem”).

Arkusz danych producenta jest obietnicą warunkową złożoną mu przez producenta. O ile przestrzegasz wszystkich zaleceń zawartych w arkuszu danych, producent obiecuje, że układ będzie działał zgodnie z przeznaczeniem. Podejrzewam, że jeśli zaprogramujesz wcześniej napisaną stronę, unikając obszarów już napisanych, istnieje duża szansa, że ​​natychmiastowe ponowne odczytanie może dać oczekiwane dane - nowo zapisane bajty to właśnie zapisane wartości, a pozostałe bajty prawdopodobnie nie ulegną zmianie. Ponieważ jednak nie jest to zgodne z zaleceniami arkusza danych, nie można już polegać na wszystkich obietnicach zawartych w arkuszu danych. Słyszę pogłoski, że takie nie sankcjonowane działanie powoduje cierpienie czasu retencji i wytrzymałości, z powodu zakłóceń programu, nadmiernego programowania, pułapki ładowania, efektów podobnych do młota wierszowego DRAM itp.

„Schemat wykorzystania pamięci wpływa na współczynnik błędów bitowych. Programowanie częściowe, niesekwencyjne programowanie stron w bloku, nadmierny odczyt na blok bez kasowania, a także nierównomierna liczba operacji odczytu w jednym bloku zwiększają liczbę odczytów zakłócić błędy. ” - Michał Jedrak. „Pamięć flash NAND we wbudowanych systemach”.

„Zakłócenie programu występuje, gdy bit jest przypadkowo zaprogramowany z„ 1 ”na„ 0 ”podczas zdarzenia programowania strony. Ten błąd bitu może wystąpić na stronie programowanej lub na innej stronie bloku. Warunki napięcia polaryzacji w blok podczas programowania strony może powodować przenikanie niewielkiej ilości prądu do pobliskich komórek pamięci. Powtarzające się częściowe próby programowania strony będą nadal pogarszać ten stan. ” - Douglas Sheldon i Michael Freie. „Testowanie zakłóceń w pamięciach flash” . p. 8, 9.

„Zakłócenie programu ma miejsce, gdy bit jest przypadkowo zaprogramowany (1 do 0) podczas operacji programowania. ... Ten stan pogarsza się przez losowe programowanie w bloku i stosowanie wielu częściowych zapisów na stronach.” „Łagodzenie awarii flash Yaffs NAND”

Davidcary
źródło
0

Jest wysoce prawdopodobne, że używane oprogramowanie do programowania już zapisuje „wymagane” 256 bajtów. Wygląda na to, że daje możliwość pisania od jednego do 256 bajtów, ale podejrzewam, że to, co robi, to OR-bajt (y), które chcesz, z „maską” 256 „FF”. Jeśli jest to poprawne, możesz „bezpiecznie” zapisać jeden bajt jeden raz , bez konieczności kasowania całego bajtu 4K. Jeśli suma kontrolna jest zapisywana poza twoją kontrolą, najprawdopodobniej niepoprawna suma kontrolna zostanie utworzona, gdy zapiszesz inny bajt w poprzednio zapisanym segmencie. Konsekwencje tego są zależne od chipów.

Jeśli twoje oprogramowanie do programowania nie wykonuje „OR”, możesz to zrobić sam. Wyczyść 256-bajtowy segment, zapisz bajty w odpowiednich pozycjach, LUB za pomocą 256-bajtowej maski FF i zapisz segment na żądanej stronie.

To, czy któraś z metod działa z dowolnym konkretnym układem, może być łatwo ustalone przez ciebie. Napisz do pierwszych 128 bajtów, napisz do drugich 128 bajtów, sprawdź, czy pierwsze 128 bajtów NIE zostało „pomieszane”!

Guill
źródło