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?
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”
źródło
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”!
źródło