Kompendium pamięci zewnętrznych: EEPROM, FLASH, FRAM

Kompendium pamięci zewnętrznych: EEPROM, FLASH, FRAM

Wybór rodzaju używanej pamięci zewnętrznej ma wpływ na działanie całego urządzenia. Jak dobrać pamięć, która pozwoli na szybki odczyt, zapewni bezawaryjność i pomieści wszystkie dane?

Kompendium pamięci zewnętrznych to zbiór porad, które znacznie ułatwiają wybór pomiędzy technologiami EEPROM, FLASH oraz FRAM.

Większość obecnie produkowanych mikrokontrolerów jest wyposażonych w wewnętrzną pamięć FLASH do przechowywania kodu programu. Część z nich posiada również nieulotną pamięć EEPROM do przechowywania dodatkowych danych, np. informacji konfiguracyjnych urządzenia.

Rozmiar wbudowanej pamięci jest ograniczony - w przypadku najprostszych i najtańszych układów jest to zwykle kilka(dziesiąt) kilobajtów pamięci FLASH oraz kilka kilobajtów pamięci EEPROM. W przypadku droższych i bardziej rozbudowanych układów możemy mówić o kilku megabajtach pamięci FLASH i kilkudziesięciu kilobajtach pamięci EEPROM.

Fragment dokumentacji popularnego układu ATmega328 (znanego z Arduino UNO)

Jednak istnieją projekty, które wymagają przechowywania znacznie większej ilości danych - np. plików dla interfejsu graficznego, a nawet dodatkowego oprogramowania (np. BIOS). Właśnie wtedy najlepiej skorzystać z dodatkowej, zewnętrznej pamięci.

Jak wybrać konkretną pamięć zewnętrzną?

Zanim zdecydujemy się na wybór dodatkowej pamięci należy odpowiedzieć na kilka ważnych pytań:

  • Jaki typ pamięci wybrać: EEPROM, FRAM, FLASH?
  • Jaki protokół transmisji zastosować (szeregowy/równoległy)? 

Oprócz tego pomocne będą również pytania dodatkowe:

  • Jak dużo pamięci będzie potrzebne?
  • Ile pinów mikrokontrolera można wykorzystać do komunikacji?
  • Jak szybki dostęp do danych będzie potrzebny?
  • Jakie potrzebne są minimalne prędkości odczytu i zapisu?
  • Czy dane będą zapisywane rzadko i dużymi blokami, czy często i małymi partiami?
  • Czy potrzebna będzie możliwość programowania pamięci z zewnątrz (np. podczas produkcji)?

Każde zadanie wymaga wyboru odpowiedniej technologii

Praktyczne różnice: EEPROM, FRAM, FLASH

Wyróżniamy 3 główne rodzaje pamięci nieulotnych: EEPROM, FRAM i FLASH. Ze względu na praktyczny charakter artykułu pominiemy kwestie naukowo-teoretyczne i skupimy się na praktycznych różnicach.

Zasadnicza różnica pomiędzy pamięciami EEPROM i FLASH jest taka, że w układach EEPROM mamy możliwość zapisania (nadpisania) pojedynczych bajtów, zaś w układach FLASH czyszczenie oraz zapis musimy przeprowadzać zbiorczo.

Układy FLASH wymagają specjalnych procedur dostępu oraz dodatkowych zmiennych (buforów) do przechowywania większych ilości danych (a co za tym idzie więcej pamięci RAM mikrokontrolera), aby podczas zmiany kilku bajtów w pamięci nie utracić pozostałych danych przechowywanych na tej samej stronie/sektorze pamięci. Układy EEPROM z kolei będą częściej wykorzystywane tam gdzie wymagany jest sekwencyjny zapis pojedynczymi bajtami.

W przypadku układów FLASH przed zapisem danych wymagane jest wykonanie procedury czyszczenia pamięci, a minimalny obszar jaki możemy wyczyścić to pojedynczy sektor. Sekwencja zapisu kilku bajtów do pamięci FLASH powinna być następująca:

  1. odczyt danych z sektora do bufora,
  2. wyczyszczenie sektora w pamięci
  3. modyfikacja bajtów w buforze,
  4. zapis danych do sektora.

W przypadku układów EEPROM możemy czyścić oraz zapisywać nawet pojedyncze bajty w pamięci. Niestety, tego typu pamięci są wolniejsze zarówno w odczycie jak i zapisie od FLASH.

Istnieje też trzecia grupa pamięci – FRAM, powszechnie nazywana nieulotną pamięcią RAM. W praktyce rozwiązanie to daje możliwość czyszczenia i zapisu pojedynczych bajtów z prędkością nawet wyższą niż w przypadku pamięci FLASH. Niestety do wad tej technologii należy zaliczyć wyższą cenę układów oraz ograniczenia w maksymalnych rozmiarach pamięci.

Pojemności i interfejsy komunikacyjne

Pamięci EEPROM są przeznaczone do przechowywania niewielkiej ilości danych – najczęściej spotykane pojemności to od 64kb do 1Mb, czyli w praktyce jeśli myślimy o przechowywaniu większej ilości danych niż 1Mbit (128 kilobajtów) to nie będą one dobrym wyborem. Po drugiej stronie są pamięci FLASH, których rozmiary zaczynają się od kilkuset kilobitów, a kończą nawet kilku gigabitach.

W tym miejscu musimy jeszcze bardziej skomplikować sprawy i dokonać dodatkowych podziałów:

  • na pamięci szeregowe i równoległe,
  • na pamięci FLASH NOR oraz FLASH NAND.

Pamięci równoległe

Pamięci z interfejsem równoległym wymagają wielu linii komunikacyjnych. Ich zaletą jest krótszy czas dostępu i szybsza transmisja, jednak okupione to jest poświęceniem zacznie większej liczby pinów mikrokontrolera do komunikacji z taką pamięcią oraz cennego miejsca na płytce PCB ze względu na znacznie większe gabaryty takich układów.

Pamięci szeregowe

Po drugiej stronie mamy pamięci szeregowe z takimi protokołami jak I2C, SPI, Microwire, czy 1-wire, które oprócz zasilania wymagają tylko od 1 do 4 wyprowadzeń mikrokontrolera. W dzisiejszych czasach coraz szybszych szeregowych protokołów komunikacyjnych to właśnie pamięci szeregowe zyskują ogromną popularność i są obecnie wykorzystywane w zdecydowanej większości projektów. Znajdziemy je w komputerach (pamięci BIOS), tabletach, telewizorach, routerach i całej gamie sprzętu elektroniki użytkowej. To na nich głównie się skupimy w tym artykule.

Wybór pamięci szeregowej niesie ze sobą więcej plusów: wymagana niewielka liczba linii sterujących z mikrokontrolera, niższe zużycie energii, małe wymiary fizyczne (potrzebna niewielka ilość miejsca na PCB) i stosunkowo szybka transmisja – w szczególności dla protokołu SPI.

Kolejnym ważnym aspektem jest opcja zaprogramowania pamięci z zewnątrz. W przypadku pamięci szeregowych jest większa dostępność programatorów. Często jest też możliwe programowania pamięci w układzie (bez wylutowania), co może być istotne już na etapie produkcji urządzeń.

Pamięci szeregowe SPI

Jeżeli tylko istnieje możliwość poświęcenia 4 wyprowadzeń mikrokontrolera to protokół SPI będzie najlepszym wyborem. Oferuje on wielokrotnie szybszą komunikacje niż pozostałe interfejsy. Urządzenia SPI można łączyć w sieć (każde kolejne urządzenie będzie wymagało jednej dodatkowej linii sterującej).

Pamięci szeregowe 1-Wire

Gdy liczba wyprowadzeń jest priorytetem to idealnym rozwiązaniem będzie 1-Wire, gdzie po jednym przewodzie możemy się komunikować z wieloma urządzeniami (pamięciami) podrzędnymi - transmisja ta jest jednak bardzo powolna.

Pamięci szeregowe I2C

Dobrym kompromisem może się okazać interfejs I2C, który wymaga tylko dwóch linii komunikacyjnych. Jest on zdecydowanie szybszy od 1-Wire, ale również zdecydowanie wolniejszy od SPI. Na magistrali I2C możemy podłączyć w sieci zwykle od 1 do 8 urządzeń.

Podłączenie wielu urządzeń do magistrali I2C w praktyce

Pamięci szeregowe Microwire 

Protokół Microwire podobnie jak SPI wymaga 4 linii komunikacyjnych, jednak jest dużo wolniejszy od SPI i nie jest popularny (możemy się natknąć na niego w niektórych starszych pamięciach EEPROM). 

Pamięci FLASH NOR oraz FLASH NAND

Pamięci FLASH NAND oraz NOR różnią się rodzajem zastosowanych bramek (zanegowane bramki AND lub OR). W praktyce pamięci NAND oferują kilkukrotnie wyższą gęstość pojemności i znacznie szybszy proces czyszczenia komórek pamięci.

Do obsługi takich pamięci stosuje się zaawansowane kontrolery, które dbają o to, aby każda z komórek była zapisana porównywalną ilość razy, a uszkodzone sektory są odpowiednio zaznaczane i wyłączane z użytku. Ze względu na bardzo krótki czas dostępu i duże pojemności to właśnie pamięci FLASH NAND są powszechnie stosowane jako magazyny danych, np. w dyskach SSD. Nie nadają się one jednak do przechowywania oprogramowania lub kodu wykonawczego dla mikrokontrolera.

Po drugiej stronie mamy pamięci FLASH NOR – szybsze w odczycie, ale wolniejsze w czyszczeniu i zapisie. Ich największą zaletą jest trwałość, dlatego powszechnie są stosowane do przechowywania danych gdzie najważniejsza jest ich integralność (np. dodatkowy program wykonawczy dla uC, BIOS urządzenia, dane pomiarowe z urządzeń itd).

Co wybrać: EEPROM, FRAM czy FLASH?

Zasadniczo jako próg pojemności możemy przyjąć 1Mbit. Jeżeli potrzebna jest większa pojemność, to pamięci EEPROM w takim rozmiarze są niedostępne, a naszym wyborem powinny być pamięci FLASH. Jeżeli jednak nie potrzebujemy większej pojemności to lepszym wyborem może okazać się EEPROM.

Jeżeli specyfika projektu w sposób naturalny wymaga zapisu danych większymi partiami i możemy wygospodarować dodatkowy RAM na bufor wtedy lepszym wyborem będzie pamięć FLASH.

Jeśli jednak szybki zapis i odczyt są kluczowe, a jednocześnie musi być możliwość zapisu pojedynczych bajtów, wtedy optymalnym wyborem będą pamięci FRAM.

Porównanie pamięci EEPROM, FRAM oraz FLASH

Tabela - porównanie pamięci EEPROM, FLASH, RAM.

Tabela - porównanie opisywanych pamięci.

Przegląd pamięci EEPROM 1-Wire/I2C/SPI

Decydując się na zastosowanie pamięci EEPROM nadal można pogubić się w dostępnych układach. Jeśli najważniejszym aspektem jest minimalizacja liczba wyprowadzeń, to warto się przyjrzeć układom, które pracują na 1-Wire. Mowa o serii DS, np. DS2430A (256bit), DS2431 (1kbit), DS24B33+ (4kbit).

Przykładowa pamięć DS2430A

Problemem tych pamięci są niewielkie pojemności oraz bardzo niska prędkość transmisji (w praktyce ok. 2kB/s w trybie standardowym oraz ok. 8kB/s dla pamięci wspierających tryb "overdrive"), która dodatkowo spada wraz z rosnącą ilością układów na magistrali 1-Wire.

Zaletą tych układów jest fakt, że każdy z nich posiada 64-bitowy unikalny numer identyfikacyjny, którego nie da się zmienić (jest wypalany laserem na etapie produkcji) i można go wykorzystać np. jako numer seryjny urządzenia. Przykład odczytania takiego 64-bitowego ID z pamięci DS przy pomocy zewnętrznego programatora REVELPROG-IS widoczny jest poniżej:

Jeżeli jesteśmy w stanie poświęcić 2 linie procesora dla transmisji I2C to warto się przyjrzeć wszystkim pamięciom zaczynającym się oznaczeniem 24xx. Oferują one pojemności do 1Mbit (np. 24LC1024) oraz prędkość transmisji od ok 10kB/s w trybie 100kHz do ok 40kB/s w trybie 400kHz. Niektóre pamięci wspierają szybsze tryby transmisji I2C, ale wtedy ograniczeniem już jest sam czas dostępu i zapisu komórek pamięci (około 5ms na pojedynczą sekwencje zapisu), więc w praktyce transmisja podczas zapisu będzie niewiele szybsza.

Jeżeli tylko możesz poświęcić 4 linie procesora dla transmisji SPI (lub więcej w przypadku wielu układów na pojedynczej magistrali), to jeszcze lepszym wyborem będą pamięci EEPROM SPI – ich oznaczenia zaczynają się na 25xx. Oferują one podobnie jak układy I2C pojemności do 1Mbit (np. 25LC1024) oraz zwykle wyższą prędkość transmisji. Niestety, podobnie jak w przypadku pamięci I2C, ograniczaniem będzie czas potrzebny na zapis komórek (~5ms na pojedynczą sekwencje zapisu całej strony – czasem nawet do 256 bajtów co da teoretyczną prędkość zapisu na poziomie do 50kB/s).

Przegląd pamięci FRAM I2C/SPI

Pamięć EEPROM byłaby idealnym wyborem, gdyby tylko nie zbyt niska prędkość transmisji? W takim przypadku warto przyjrzeć się pamięciom FRAM I2C (FM24xx) lub szybszym FRAM SPI (FM25xx).

Przykładowo pamięć FM25V10 posiada pojemność 1Mbit i może pracować z częstotliwością 40MHz. Układy te oferują natychmiastowy zapis (w takt zegara na magistrali, bez opóźnień, podobnie jak w przypadku pamięci RAM), więc w praktyce można osiągnąć zapis na poziomie kilku MB/s!

Przykładowe pamięci FRAM

Ponadto pamięci te występują w rozmiarach aż do 4Mbit (np. CY15B104Q). Listę przykładowych pamięci FRAM znaleźć można na forum REVELTRONICS (producenta programatora, który był używany we wcześniejszym demie).

Sprawdź listę pamięci FRAM »

Przegląd pamięci FLASH SPI

Jest to najbardziej rozbudowany segment pamięci. Największe pojemności, najwięcej producentów i największy wybór. Obecnie dostępne są pamięci FLASH SPI NOR o pojemności do 2Gb, zaś FLASH SPI NAND do 4Gb (a niebawem 8Gb). Możliwa częstotliwość pracy nie rzadko przekracza tu 100MHz, a dzięki możliwości pracy w tzw. trybie QUAD-SPI dodatkowo możliwy jest 4x szybszy odczyt pamięci, który może wynosić nawet kilkanaście MB/s.

W przypadku pamięci NOR czyszczenie pojedynczego sektora zajmuje 50-150ms, a czas zapisu pojedynczej strony to 0,1-3ms co przekłada się na transfer zapisu rzędu od ok 100kB/s do ok. 2MB/s w przypadku najszybszych pamięci. W przypadku pamięci NAND najmniejszym obszarem możliwym do wyczyszczenia jest cały blok (który składa się zwykle z 64 stron). Mimo to, czas ten jest znacznie krótszy i wynosi zwykle 3-5ms na blok, co w praktyce daje od kilkunastu do kilkudziesięciu razy szybszą operacje czyszczenia pamięci FLASH NAND w stosunku do FLASH NOR. Zapis do komórek pamięci NAND również jest szybszy, jednak różnica ta już nie jest tak znacząca.

W przypadku pamięci FLASH NAND ciekawe propozycje to:

  • MICRON MT29F1G01 (1Gb), MT29F1G02 (2Gb),
  • GigaDevice GD5FxGQ4UF (1/2/4 Gb).

Problemu z degradacją komórek nie ma w przypadku pamięci NOR. Oznaczenia pamięci FLASH SPI zaczynają się zwykle na 25xx (podobnie jak w przypadku pamięci EEPROM SPI) lub 26xx.

Kilka ciekawych propozycji FLASH NOR to:

  • Winbond W25Q64FV (64Mb),
  • Micron N25Q128A13 (3.3V 128Mb), N25Q128A11 (1.8V 128Mb), MT25QU02G (1.8V 2Gb),
  • Atmel/Adesto AT25SF081 (8Mbit),
  • Adesto AT45DB161D (16Mbit) - pamięci AT45xx wyróżniają się wbudowanym dodatkowym buforem pomocniczym, który zmniejsza zapotrzebowanie na pamięć RAM.

Programator dla pamięci szeregowych

Programator pamięci może być przydatny w wielu przypadkach, ale nie jest niezbędny. Jeśli w naszym urządzeniu pamięć zewnętrzna służy jako dodatkowy bufor pamięci dla uC (np. do trzymania danych z czujników), a do tego mamy zaimplementowany protokół komunikacyjny z uC, to programator nie jest konieczny (ale znacznie ułatwi proces projektowania i debugowania).

Przykład programowania pamięci kontrolera dysku HDD

W przypadku produkcji urządzeń z pamięcią przechowującą część oprogramowania programator będzie niezbędny. Na rynku jest olbrzymi wybór programatorów, od amatorskich konstrukcji po profesjonalne. Do pamięci szeregowych, równoległych oraz mikroprocesorów różnych producentów.

Kiedy wiemy już jaką pamięć musimy zaprogramować to wybór naturalnie zostanie ograniczony do programatorów wspierających tą pamięć. W przypadku pamięci szeregowych EEPROM, FRAM, FLASH warto zainteresować się programatorem REVELPROG-IS, który potrafi obsłużyć większość dostępnych układów komunikujących się przez interfejsy I2C, SPI, 1-Wire oraz MicroWire. Ponadto posiada on możliwość komunikacji (tzw. "programowanie skryptowe") z zewnętrznymi modułami I2C/SPI, które mogą wymagać dodatkowej konfiguracji (np. moduły RTC, GPS itd.)

Podsumowanie

Mimo długiego wpisu, zostały tu poruszone tylko podstawowe kwestie dotyczące przechowywania danych w zewnętrznej pamięci. Informacje te powinny być jednak wygodnym kompendium dla osób, które stają przed wyborem odpowiedniego układu.

Wpis powstał dzięki współpracy z firmą REVELTRONICS - producentem pokazanego tu programatora REVELPROG-IS. Porady zostały więc udzielone przez osobę, która praktycznie cały czas pracuje przy urządzeniach operujących na bardzo różnych pamięciach zewnętrznych. W razie pytań lub niejasności zachęcamy do pozostawiania komentarzy, Artur z REVELTRONICS będzie starał się udzielić odpowiedzi na dodatkowe pytania.

Autor:
mgr inż. Artur Kaczmarczyk
www.REVELTRONICS.com

Redakcja tekstu: Damian Szymański. Wpis sponsorowany na podstawie informacji przesłanych przez firmę REVELTRONICS, producenta programatora pamięci szeregowych REVELPROG-IS.

eeprom, flash, fram, mikrokontrolery, pamięć, programowanie