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 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio marzec - kwiecień 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje marzec 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna marzec 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich kwiecień 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów