eksperyment. Jednak takie podejście często jest narażone na „błądzenie we mgle”.
Postanowiłem przedstawić w tym wątku kilka własnych drobnych rozwiązań,
inspiracji, idei i czasami gotowych rozwiązań. Ta koncepcja już od jakiegoś czasu
mnie nurtowała, to takie dziwne, ulotne wrażenie, że trzeba coś zrobić. Może tych
kilka małych przyczynków połączy się w jedną większą całość i podobnie jak
Archimedesa zainspiruje do okrzyku „eureka”, jakie to proste.
Należy się tu spodziewać bardzo szerokiego spektrum...
Duża pamięć EEPROM z interfejsem SPI
Potrzeba jest matką wynalazku, to już wiadomo. A potrzeba jest taka, by jakiś system z prockiem na pokładzie miał możliwość wprowadzenia i przechowywania całkiem dużo różnych parametrów i nastaw. To oznacza zastosowanie jakiejś pamięci nieulotnej. Tu rzecz jasna pojęcie „dużo” jest wielce mgliste, więc przybliżając temat można stwierdzić, że 128kB (pojemność pamięci 1 megabit) nie jest przesadnie dużą pamięcią, jednak na początek się nadaje. Może z czasem będzie konieczność poszukania innych rozwiązań. Na tę chwilę może być. Musi to być pamięć nieulotna ale zapisywalna przez procka. Rozpatrywałem kilka pomysłów (między innymi pamięci FLASH) i stanęło na pamięci EEPROM. Z dostępnej gamy wylosowałem układ o symbolu M95M01. Jest to pamięć EEPROM z interfejsem SPI (to dosyć istotne, by dostęp do pamięci był szybki). Zaletą jest mały footprint i wymagane niewielkie zasoby mikrokontrolera do jej obsługi, to tylko 5 drutów. Jest pamięcią o dostępie szeregowym, więc nie może być użytkowana jako „stała” pamięć włączona w przestrzeń adresową procka. No ale taka jest transakcja wiązana: coś za coś (pamięć równoległa to dużo drutów).Układ EEPROM wymaga kilku sygnałów do jej obróbki:
- CS – chip select – sygnał wyboru układu,
- SDO – serial data output – wyjściowe (z punktu widzenia pamięci) dane szeregowe,
- CLK – sygnał zegarowy,
- SDI – serial data input – wejściowe (z punktu widzenia pamięci) dane szeregowe,
- WP – write protect – sygnał ochrony przez zapisem,
- HOLD – sygnał do wstrzymywania pracy pamięci,
- GND i VCC – do zasilania.
- 0000 0110 – aktywacja zezwolenia na zapis, każde polecenie wymaga zezwolenia na zapis, bez tego nic nie przeniknie do wnętrza pamięci,
- 0000 0100 – deaktywacja zezwolenia na zapis, po każdej zakończonej operacji zapisu, zezwolenie również deaktywuje się samo, dy dostać się do środka ponownie należy uzyskać zezwolenie, czytać można do woli,
- 0000 0101 – odczyt statusu pamięci, jeżeli wystąpił zapis do pamięci, to dopóki akcja ta nie zostanie zakończona, układ EEPROM ignoruje wszystko, wykonanie kolejnego kroku wymaga zakończenia poprzedniego, odczytując ten status można się dowiedzieć, czy akcja zapisu się zakończyła, odczyt może być realizowany w każdej chwili, czyli: kto pyta, nie błądzi,
- 0000 0001 – zapis do rejestru statusowego (konieczne jest posiadanie zezwolenia), można określić jakie rejony przestrzeni mają swoją indywidualną ochronę,
- 0000 0011 – odczyt pamięci, po podaniu adresu, pamięć można czytać dowolnie długo (dopóki jest aktywny sygnał wyboru), pamięć sama wykonuje autoinkrementację adresu wskazującego na czytaną komórkę,
- 0000 0010 – zapis do pamięci (tradycyjnie konieczny jest glejt, inaczej nie przejdzie), po podaniu kodu i w dalszej kolejności adresu, każde kolejne dane są zapisywane w pamięci z autoinkrementacją adresu.
Przed każdą operacją zapisu należy uzyskać prawo do grzebania w pamięci. Zezwolenie jest jednorazowego użytku, więc przez kolejną zadymą należy ponownie wystąpić o prawo do zapisu. Jest to jedynie wysłanie kodu polecenia do pamięci.Operacja zapisu danych to trochę inna bajka. Po przesłaniu kodu polecenia zapisu do pamięci należy w dalszej kolejności wysłać adres pod jaki należy dostarczyć dane (jest to liczba 24-bitowa) i potem już tylko same dane.Operacja odczytu jest podobna, tylko kto inny zgarnia dane (inna noga).
Każdy eksperyment nie jest nic wart dopóki nie zostanie zrealizowany fizycznie. Moje środowisko laboratoryjne to niewielki systemik z ATMEGA32 ma pokładzie.System ten łączy się z pamięcią za pośrednictwem portu PORTC. Użyty jest moduł z prockiem ATMEGA32 (szczegóły jego styków są pokazane poniżej).Procek jest przypięty do małej PCB z przylutowanym układem M95M01. By było widać co się dzieje, do modułu via serial przyłączony jest ekran kompa. Obsługa pamięci jest w dużej mierze sparametryzowana. Pozwala to na dużą elastyczność, każdy wariant staje się możliwy. W eksperymencie łączenia były następujące (sygnał HOLD jest na stałe podpolaryzowany do +5V, pozostałe są przypięte do procka):
Kod: Zaznacz cały
#define EEPROMDataCSPort PORTC
#define EEPROMDataCSDirPort DDRC
#define EEPROMDataCSPin 7
#define EEPROMDataSDOPort PORTC
#define EEPROMDataSDODirPort DDRC
#define EEPROMDataSDOPin 3
#define EEPROMDataSCKPort PORTC
#define EEPROMDataSCKDirPort DDRC
#define EEPROMDataSCKPin 4
#define EEPROMDataSDIPort PINC
#define EEPROMDataSDIDirPort DDRC
#define EEPROMDataSDIPin 6
#define EEPROMDataWPPort PORTC
#define EEPROMDataWPDirPort DDRC
#define EEPROMDataWPPin 5
Po pierwszym włączeniu poprosiłem o zapis do pamięci:Po tej akcji należy przejść do kolejnego etapu dopiero po zakończeniu poprzedniego. Ze śledzenia na ekranie widać, że program w operacji zapisu miał zezwolenie (bit b1 statusu) oraz w chwili zapytania był zajęty porządkowaniem swego środka (bit b0 statusu). To nie trwało długo, bo kolejne zapytanie dało już inną odpowiedź. Przy okazji widać, że pamięć sama sobie wycofała zezwolenie za zapis. W programie nie ma takiej operacji, natomiast z wyświetlonej informacji jasno wynika: było i magicznie wcięło.
Kolejna operacja to odczyt danych.Program wyświetlił co ma zapisane w pamięci. Jeżeli uważne oko dostrzega różnicę, to znaczy, że dobrze widzi. W programie celowo zapis i odczyt (tej samej wielkości bloku) został zrealizowany w różne obszary (ale mające część wspólną).
No to pozostał do wykonania najbardziej istotny test: wyłączyć prąd, odczekać chwilę i ponownie włączyć.
Dane zapisane nie zginęły. Fabrykant twierdzi, że kostka może przechowywać informacje w nieskończoność (z punktu widzenia człowieka, więcej niż 100 lat to już nieskończoność).
Eksperymentalny program: