Obsługa pamięci szeregowych EEPROM i DataFlash w Bascom, część 2

Obsługa pamięci szeregowych EEPROM i DataFlash w Bascom, część 2
Pobierz PDF Download icon

W wielu systemach cyfrowych, które mają zbierać dane z zewnątrz, powinny być one zapisywane w pamięci nieulotnej o właściwie dobranej pojemności. Pamięci nieulotne są także wykorzystywane do zapamiętywania ustawianych parametrów systemu. W tego rodzaju zastosowaniach ich pojemność może być niewielka – zazwyczaj do 1 kB. Wiele mikrokontrolerów ma wbudowaną pamięć nieulotną, której zazwyczaj niewielka pojemność umożliwia tylko zapamiętanie konfiguracji urządzenia. W przypadku mikrokontrolerów bez wewnętrznej pamięci EEPROM można bez problemu dołączyć pamięć zewnętrzną. Do tego celu nadają się pamięci szeregowe, gdyż do ich dołączenia zazwyczaj nie jest potrzebnych wiele linii mikrokontrolera.

Pamięci szeregowe DataFlash

Gdy w systemie należy zapamiętać duże ilości danych, na przykład wyniki pomiarów zebranych przez czujniki, to potrzebne są pamięci o dużej pojemności, najlepiej nieulotne.

Z dostępnych pamięci nieulotnych można wykorzystać do tego celu pamięci DataFlash, które mają pojemność nawet do kilu MB. Pamięci DataFlash mają wbudowany interfejs kompatybilny z SPI, w którym częstotliwość sygnału zegarowego może wynosić nawet 20 MHz. Obsługę pamięci zilustrujemy na przykładzie AT45DB011B o pojemności 135168 kB.

Rys. 15. Schemat połączenia pamięci DataFlash do mikrokontrolera

Na rys. 15 przedstawiono schemat dołączenia pamięci DataFlash do mikrokontrolera. Linia SI jest liną wejściową danych, linia SCK to linia zegarowa, a linia SO jest liną wyjściową danych.

Pamięć wykorzystana w przykładzie ma także linię zerowania RESET, linię wyboru układu CS oraz linie WP, która umożliwia włączenie blokady zapisu do pamięci. Układ testowy jest zasilany napięciem 3,3 V, gdyż takie jest napięie zasilania pamięci DataFlash.

Rys. 16. Schemat blokowy pamięci AT45DB011B

Na rys. 16 został przedstawiony schemat blokowy pamięci AT45DB011B. Posiada ona 512 stron po 264 bajty. Pamięć ma także bufor o pojemności jednej strony. W pamięciach DataFlash zapis danych następuje stronami, do czego jest wykorzystywany wspomniany bufor. Po zapełnieniu całego bufora danych, należy do pamięci wysłać rozkaz zapisu z adresem strony, do której ma nastąpić zapis. Dostępne pamięci DataFlash mają różne wielkości buforów. Są nawet takie, które mają ich kilka. Zastosowany w pamięciach DataFlash bufor znacząco zwiększa szybkość zapisu do niej danych. Zapis całej strony dla wykorzystywanej pamięci trwa ok. 7 ms. W przypadku typowych pamięci EEPROM zazwyczaj tyle czasu trwa zapis jednego bajta.

Rys. 17. Organizacja pamięci AT45DB011B

Na rys. 17 przedstawiono organizację pamięci AT45DB011B. Można wyróżnić trzy sektory, w skład których wchodzą bloki, bloki z kolei dzielą się na strony – każda z nich ma pojemność 264 bajty. Gdyby pamięć DataFlash miała pracować podobnie jak pamięć EEPROM, czyli z zapisem danej z pominięciem bufora, to jest możliwość zastosowania takiej emulacji (emulacja pamięci EEPROM przez pamięć DataFlash). Zostało to wykorzystane w przykładzie obsługi pamięci AT45DB011.

Listing 5. 'Program komunikujący się z pamięcia DataFlash AT45DB011B - pojemność 135168 bajtow (1081344 bitow) 'Pamiec posiada 512 stron z ktorych kazda sklada sie z 264 bajtow. 'Pamiec ma takze wbudowany jeden bufor o pojemnosci 264 bajtow do ktorego mozna zaladowac jedna strone pamieci 'Komunikacja z pamiecia odbywa sie przy pomocy magistrali SPI 'Mikrokontroler ATMEGA8 taktowany czestotliwoscia 8MHz 'W programie do pamieci (komorki 0...135168) wpisywane sa wartosci liczbowe od 0 do 255, 'nastepnie dane zapisane do pamieci sa odczytywane i weryfikowane pod wzgledem poprawnosci zapisu 'zarowno wartosci danych zapisywanych jak i odczytywanych sa wysylane do terminala poprzez interfejs RS232. 'Predkosc komunikacji przez RS232 wynosi 38400 bodow. 'W przypadku bledu zapisu do pamieci wysylany jest do terminala stosowny komunikat 'Ze wzgledu na znaczna pojemnosc pamieci zarowno odczyt jak i zapis calej pamieci moze potrwac kilkanascie minut. 'W programie pamiec DataFlash zostala skonfigurowana jako typowa pamiec EEPROM, 'czyli jest mozliwosc zapisania danej pod dowolnie wybrany adres pamieci 'Taki tryb pracy pamieci powoduje dos dlugotrwaly zapis jednej komporki pamieci, 'niz ma to miejsce w przypadku zapisu strony z wykorzystaniem bufora. 'Marcin Wiązania 'marcin.wiazania@ep.com.pl $regfile = "m8def.dat" 'informuje kompilator o pliku dyrektyw mikrokontrolera $crystal = 8000000 'informuje kompilator o częstotliwości oscylatora taktujacego mikrokontroler $baud = 38400 'informuje o predkosci transmisji interfejsu RS232 Config Pinb.2 = Output 'linia PB2 jako wyjsciowa (CS) Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Ss = None , Clock = Portb.5 'konfiguracja interfejsu SPI Declare Sub Zap_eeprom(byval Adres As Long , Byval Dana As Byte) 'procedura zapisu danej do pamieci Declare Sub Odc_eeprom(byval Adres As Long , Dana As Byte) 'procedura odczytu danej z pamieci Dim Adres As Long 'zmienna adresu komorki pamieci Dim Dana As Byte 'zmienna zmienna na odczytana lub zapisana dana do pamieci Dim I As Long 'zmienna licznikowa Dim Temp As Byte 'zmienna pomocnicza Dim Temp1 As Byte 'zmienna pomocnicza Dim Temp2 As Byte 'zmienna pomocnicza Dim Temp3 As Byte 'zmienna pomocnicza Dim Zm_pom As Word 'zmienna pomocnicza Dim Temp4 As Long 'zmienna pomocnicza Dim J As Byte 'zmienna licznikowa Sck Alias Portb.5 'przypisanie nazwie Portb.5 aliasu Sk Cs Alias Portb.2 'przypisanie nazwie Portb.2 aliasu Cs Spiinit 'inicjacja interfejsu SPI Set Cs 'ustawienie linii Cs Reset Sck 'zerowanie linii Sck Waitms 200 'opoznienie 200 ms Print "Zapis" 'wyslanie do terminala tekstu J = 0 'wyzerowanie zmiennej J For I = 0 To 135167 'petla wykonywana dla I=0 do I=135167 Call Zap_eeprom(i , J) 'zapis do EEPROM wartosci zmiennej I pod adres wskazywany przez I Print Hex(j) ; " "; 'wyslanie do terminala wartosci zapisywanej do EEPROM w postaci szesnastkowej Incr J 'zwiekszenie o jeden wartosci J Next I 'zwiekszenie o 1 wartosci I Print 'wyslanie do terminala wiersza odstepu Print "Odczyt i weryfikacja" 'wyslanie do terminala tekstu J = 0 'wyzerowanie zmiennej J For I = 0 To 135167 'petla wykonywana dla I=0 do I=135167 Call Odc_eeprom(i , Dana) 'odczytanie z EEPROM wartosc z komorki o adresie wskazywanym przez I If Dana = 3 Then '--weryfikacja danych-- jesli Dana = I to Print Hex(dana) ; " "; 'wyslanie do terminala odczytanej wartosci z pamieci w postaci szesnastkowej Else 'w przeciwnym razie Print "Dane nieprawidlowe" 'wyslanie do terminala tekstu Exit For 'opuszczenie petli For End If Incr J 'wyzerowanie zmiennej J Next I 'zwiekszenie o 1 wartosci I End 'koniec programu Sub Zap_eeprom(byval Adres As Long , Byval Dana As Byte) 'procedura zapisu danej do EEPROM Temp4 = Adres / 264 'obliczenie adresu strony Zm_pom = Temp4 'przepisanie adresu strony Temp1 = 0 'wyzerowanie Temp1 Temp1.1 = Zm_pom.8 'zapis do bitu 1 zmiennej Temp1 bitu 8 zmiennej Zm_pom Temp1.0 = Zm_pom.7 'zapis do bitu 0 zmiennej Temp1 bitu 7 zmiennej Zm_pom Adres = Adres Mod 264 'obliczenie adresu w stronie Shift Zm_pom , Left , 1 'przesuniecie wartosci w zm_pom o jedna pozycje w lewo (mnozenie przez 2) Temp2 = Low(zm_pom) 'przepisanie do Temp2 mniej znaczacej wartosci zmiennej zm_pom Temp2.0 = Adres.8 'zapis do bitu 0 zmiennej Temp2 bitu 8 zmiennej Adres Zm_pom = Adres 'przepisanie wartosci z Adres do Zm_pom Temp3 = Zm_pom 'przepisanie wartosci z zm_pom do Temp3 Set Sck 'ustawienie linii Sck Reset Cs 'zerowanie linii Cs Temp = &H53 'kod rozkazu odczytu strony do bufora pamieci Spiout Temp , 1 'wyslanie rozkazu Spiout Temp1 , 1 'wyslanie adresu Spiout Temp2 , 1 'wyslanie adresu Spiout Temp3 , 1 'wyslanie adresu Set Cs 'ustawienie linii Cs Delay 'opoznienie Set Sck 'ustawienie linii Sck Reset Cs 'zerowanie linii Cs Temp = &H82 'kod rozkazu zapisu strony do pamieci EEPROM (poprzez bufor) Spiout Temp , 1 'wyslanie rozkazu Spiout Temp1 , 1 'wyslanie adresu Spiout Temp2 , 1 'wyslanie adresu Spiout Temp3 , 1 'wyslanie adresu Spiout Dana , 1 'wyslanie zapisywanej danej Set Cs 'ustawienie linii Cs Waitms 28 'opoznienie 28 ms End Sub 'koniec procedury Sub Odc_eeprom(byval Adres As Long , Dana As Byte) 'procedura odczytu danej do EEPROM Temp4 = Adres / 264 'obliczenie adresu strony Zm_pom = Temp4 'przepisanie adresu strony Temp1 = 0 'wyzerowanie Temp1 Temp1.1 = Zm_pom.8 'zapis do bitu 1 zmiennej Temp1 bitu 8 zmiennej Zm_pom Temp1.0 = Zm_pom.7 'zapis do bitu 0 zmiennej Temp1 bitu 7 zmiennej Zm_pom Adres = Adres Mod 264 'obliczenie adresu w stronie Shift Zm_pom , Left , 1 'przesuniecie wartosci w zm_pom o jedna pozycje w lewo (mnozenie przez 2) Temp2 = Low(zm_pom) 'przepisanie do Temp2 mniej znaczacej wartosci zmiennej zm_pom Temp2.0 = Adres.8 'zapis do bitu 0 zmiennej Temp2 bitu 8 zmiennej Adres Zm_pom = Adres 'przepisanie wartosci z Adres do Zm_pom Temp3 = Zm_pom 'przepisanie wartosci z zm_pom do Temp3 Reset Sck 'zerowanie linii Sck Reset Cs 'zerowanie linii Cs Temp = &H52 'kod rozkazu odczytania danej z pamieci pod wybranym adresem Spiout Temp , 1 'wyslanie rozkazu Spiout Temp1 , 1 'wyslanie adresu Spiout Temp2 , 1 'wyslanie adresu Spiout Temp3 , 1 'wyslanie adresu Temp = 0 'zrowanie wartosci Temp Spiout Temp , 4 'wyslanie 4 bajtow o wartosci 0 Spiin Dana , 1 'odczyt danej z pamieci EEPROM Set Cs 'ustawienie linii Cs End Sub 'koniec procedury

Na list. 5 został przedstawiony przykład obsługi pamięci DtataFlash. Jego działanie jest podobne do programów z poprzednich listingów. Program umożliwia zapisanie oraz odczyt danej z pamięci DataFlash spod wskazanego adresu o zakresie 0...135168. W programie do komórek pamięci są wpisywane kolejno wartości od 0 do 255. Po zapisaniu całej pamięci następuje odczyt wraz z weryfikacją. Ze względu na dosyć sporą pojemność pamięci, zarówno zapis jak i odczyt trwa dosyć długo. W programie zostały utworzone dwie procedury. Jedna do zapisu danych pod wskazany adres oraz druga do odczytu danych spod wskazanego adresu.

Komunikacja z pamięcią DataFlash, podobnie jak z pamięcią 93C46, odbywa się za pośrednictwem komend.

W tab. 3 przedstawiono komendy dostępne w pamięci AT45DB011B. Niektóre z nich zostały wykorzystane w przykładowym programie. W procedurze zapisu danej do pamięci, po obliczeniu adresu zostaje wysłana komenda mająca adres &H53 (Main Memory Page to Buffer Transfer). Komenda ta wczytuje wybraną stronę do bufora pamięci.

Rys. 18. Przebiegi sygnałów podczas wykonywania komendy &H53

Na rys. 18 przedstawiono przebiegi sygnałów przy wysyłaniu komendy &H53. Po wysłaniu komendy zostaje wysłany dwubajtowy adres strony. W procedurze zapisu danej do pamięci jest wysyłana kolejna komenda o adresie &H82 (Main Menory Page Program through Buffer), która jest komendą zapisu danej do bufora wraz z późniejszym jego zapisaniem do zaadresowanej strony. Po modyfikacji zawartości bufora jest zapisywana do zaadresowanej strony pamięci.

Rys. 19. Przebiegi sygnałów podczas wykonywania komendy &H82

Na rys. 19 przedstawiono przebiegi sygnałów podczas wysyłania komendy o adresie &H82. Po wysłaniu komendy wysyłany jest adres strony oraz adres w buforze, pod którym będzie zapisywana dana. Następnie, narastającym zboczu sygnału na linii CS, zawartość bufora zostaje przepisana do wybranej strony.

W procedurze odczytu danych z pamięci, po obliczeniu adresu, wykorzystano komendę o adresie &H52 (Main Menory Page Read). Jest to komenda odczytu strony pamięci z pominięciem bufora.

Rys. 20. Przebiegi sygnałów podczas wykonywania komendy &H52

Na rys. 20 przedstawiono przebiegi odnoszące się do komendy &H52. Po wysłaniu komendy wysyłany jest adres strony, po którym wysyłany jest adres słowa dla danej strony. Czyli można za jej pomocą zaadresować i odczytać dowolne słowo pamięci DataFlash.

Wykorzystywanie pamięci DataFlash pracującej podobnie jak pamięć EEPROM powoduje znaczne spowolnienie zapisu danych. Zapis każdej komórki będzie trwał kilkanaście ms. W przypadku wymagania szybkiego zapisu danych należy więc wykorzystać zawarty w niej bufor, a dane zapisywać stronami (po zapełnieniu bufora).

Podsumowanie

Zaprezentowane w artykule procedury obsługi pamięci EEPROM i DataFlash przygotowane w Bascomie, mogą być stosowane w programach odwołujących się do tych pamięci. Są bowiem często stosowane w różnych systemach, gdyż mają dużą trwałość, wystarczającą do wieloletniej pracy. Dosyć uniwersalne pamięci z rodziny AT24Cxx mogą być stosowane zarówno do zapamiętywania danych konfiguracyjnych jak i w przypadku zapamiętywania sporych ilości danych. Pamięci 93Cxx są odpowiednie do wykorzystania ich do zapamiętywania danych konfiguracyjnych urządzenia.

Pamięci DataFlash będą idealne dla zapamiętywania dużych ilości danych. Specyficzny dla nich buforowy zapis danych (stronami) przyśpiesza operację zapisu.

Marcin Wiązania
marcin.wiazania@ep.com.pl

Artykuł ukazał się w
Grudzień 2005
DO POBRANIA
Pobierz PDF Download icon
Materiały dodatkowe
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik marzec 2025

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio marzec - kwiecień 2025

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje marzec 2025

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna luty 2025

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich marzec 2025

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik marzec 2025

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio marzec - kwiecień 2025

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje marzec 2025

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna luty 2025

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich marzec 2025

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik marzec 2025

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio marzec - kwiecień 2025

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje marzec 2025

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna luty 2025

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich marzec 2025

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów