Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

eeprom 24c32 zasada zapisu stronami.

03 Wrz 2011 13:26 3695 12
  • Poziom 12  
    Witam kolegów postanowiłem wykorzystać interfejs i2c do komunikacji z układami peryferyjnymi jak pamięć eeprom 24c32. Samą komunikację interfejsu i2c znam ,lecz zatrzymałem się na etapie zapisu stronami do pamięci 24c32 .Proszę o wyjaśnienie ,pojęcia zapisu stronami i sposób jego adresowania , abym mógł w sposób automatyczny zapisać lub odczytać całą pamięć e2prom 24c32 stronami .
    W artykułach które czytałem jest lakoniczne wyjaśnienie zapisu i odczytu a noty są po angielsku .

    np zapis, lakoniczne objaśnienie :

    * start
    * wysili adres urządzenia
    * wysili adres komórki pamięci ( pierwszy bajt msb później bajt lsb )
    * wysili po kolei dane
    * stop

    Co przyjmujemy za adres komórki podczas zapisu stronami , jak wyślemy jedną porcję danych jak inkrmentowany jest adres stron . Jak po takim zapisie będę wiedział w jakich sektorach są dane , za odpowiedz tylko w sposób przejrzysty dziękuje . Interesuje mnie tez literatura na temat pamięci w postaci książek które można kupić. W polskiej literaturze są tylko wzmianki o pamięci eeprm że coś takiego istnieje i poświęca się kilka zdań które są przepisane z noty . W różnych kursach znalazłem tylko opis najmniejszych pamięci 24c02 gdzie jest najprostsze adresowanie od 0 do 255 .
  • Moderator na urlopie...
    Po pierwsze tam WSZYSTKO jest opisane i nawet na rysunkach narysowane, szczególnie strony 11 i kolejne: http://www.atmel.com/dyn/resources/prod_documents/doc0336.pdf

    Wygląda to tak jak napisałeś, zapis stronami polega na tym, że adres jest automatycznie inkrementowany i można wysyłać całe pakiety. Adres jest inkrementowany (zwiększany o 1) po zapisie każdej komórki. Czyli np.:
    1. START
    2. Adres układu
    3. 2 bajty adresu komórki (np. 0x0010)
    4. dane - pierwsza wysłana dana zostanie zapisana pod adresem 0x0010, druga pod adresem 0x0011, trzecia - 0x0012 i tak dalej. Oczywiście trzeba pamiętać o timeoucie na zapisanie każdej komórki - zwykle jest to czas do 5ms
    5. stop
  • Poziom 28  
    Pamięć 24C32 ma rozmiar strony 32 bajty. Zapis stronami odbywa się w ten sposób, że po wysłaniu na magistralę adresu układu i dwubajtowego adresu komórki można wysłać maksymalnie 32 bajty (przy założeniu, że nie chcemy zapisywać kilkakrotnie do tych samych komórek pamięci podczas tego jednego zapisu). Pamięć - po odebraniu i zapisaniu każdego bajtu - inkrementuje tylko ostatnie 5 bitów adresu (32=2^5), nie zmieniając pozostałych bitów nawet po przekroczeniu zakresu liczby 5-bitowej. Oznacza to, że jeżeli zapisujemy 6 bajtów, a zapis rozpoczynamy na 3 bajty przed końcem strony, to pozostałe bajty zostaną zapisane na początku strony.
    Tak będą wyglądały kolejne adresy przy zapisie 6 bajtów począwszy od adresu 0x003D:
    Code:

    0b0000000000111101    0x003D
    0b0000000000111110    0x003E
    0b0000000000111111    0x003F
    0b0000000000100000    0x0020
    0b0000000000100001    0x0021
    0b0000000000100010    0x0022

    Jeżeli chcemy, aby ostatnie 3 bajty po adresie 0x003F zostały zapisane w kolejnych komórkach, czyli 0x0040, 0x0041 i 0x0042, to należy zatrzymać transmisję po wysłaniu trzeciego bajtu i rozpocząć ponownie podając tym razem jako adres komórki 0x0040.
  • Poziom 12  
    Dziękuje za odpowiedz
    Widzę po formie zapisu liczby że kolega programuje w języku C . Przestrzeń adresowa tego kładu to od 0 do 4095 (w systemie dziesiętnym) , jeżeli pierwszy adres będzie 0 to mogę kolejno wysłać 4095 bajtów gdzie adres będzie inkrementowany .Taimouty stosuje chyba się w C bo w Bascom sę biblioteki do obsługi . Tak to zrozumiałem .


    W nocie jest Podawana informacja :
    organization :
    24c32 4kx8 (128 pages of 32 bytes) , do czego ta informacja ma służyć .





    Możesz spojrzeć i powiedzieć o co chodzi poniżej na obrazku :
    eeprom 24c32 zasada zapisu stronami.
  • Poziom 38  
    Nie ważne jaki język. Po przekroczeniu zapisie danej do jakiejś strony trzeba odczekać 10ms(sprawdzić w datasheet) przed zapisem do innej strony.
  • Poziom 28  
    ontario4 napisał:

    ...jeżeli pierwszy adres będzie 0 to mogę kolejno wysłać 4095 bajtów gdzie adres będzie inkrementowany ...

    No właśnie napisałem, że nie można zapisać więcej, niż wynosi rozmiar strony, czyli w przypadku pamięci 24C32 jest to 32 bajty (przynajmniej tak ma pamięć ATMELa).
    Jeżeli zaczniesz zapisywać od adresu 0, zapiszesz 32 bajty (pamięć będzie inkrementować do adresu 31) i wysłałbyś kolejny 33 bajt, to byłby on zapisany ponownie pod adresem 0, bo pamięć z rozmiarem strony 32 nie potrafi zliczyć do 33 ;). Jeśli zapiszesz 32 bajty pod adresami od 0 do 31 i chcesz zapisać kolejne 32 bajty pod kolejnymi adresami od 32 do 63, to musisz zatrzymać transmisję (po 32 bajcie) wysyłając STOP i rozpocząć od nowa tak samo, tylko tym razem zamiast adresu komórki 0 podajesz 32. Po wysłaniu kolejnych 32 bajtów zatrzymujesz transmisję, rozpoczynasz od nowa wpisując adres 95 itd.

    Zobacz jeszcze raz, jak zmieniają się adresy binarne podczas inkrementowania adresu przez pamięć, jeżeli zaczniemy zapisywać od adresu 32:

    0b0000000000100000 (adres 32) bajt 1
    0b0000000000100001 (adres 33) bajt 2
    ..................................
    0b0000000000111101 (adres 61) bajt 30
    0b0000000000111110 (adres 62) bajt 31
    0b0000000000111111 (adres 63) bajt 32
    ---- tutaj następuje powrót do początku strony (adres 32) ----
    0b0000000000100000 (adres 32) bajt 33
    0b0000000000100001 (adres 33) bajt 34
    0b0000000000100010 (adres 34) bajt 35

    Kolorem czerwonym zaznaczyłem część adresu, która ulega zmianie. Pozostałe bity nie zmieniają się - pozostają takie, jakie wysłałeś na początku transmisji

    tadzik85 napisał:

    ...trzeba odczekać 10ms...

    Słuszna uwaga, po wysłaniu serii bajtów należy odczekać odpowiednią ilość czasu potrzebną na zapis strony (czas jest zależny od typu pamięci i należy go odczytać z noty katalogowej) lub "odpytywać" pamięć sprawdzając bit potwierdzenia (podczas zapisu pamięć nie będzie go wysyłać).
  • Poziom 12  
    Sumując ,aby adresować całą przestrzeń pamięci e2prom 24c32 potrzebuję
    12bit adresu 2^12 =4096 bajtów . Czyli przestrzeń adres komórek wynoś od
    0 do 4095 i w trybie pojedynczego zapisu bajtu danych podaje numer komórki tego zakresu . Przy zapisie stronami po 32 bajty adres jest inkrementowany w obrębie strony.
    Panie Andrzeju wspomniał Pan o adresowaniu 0 do do 31 nie rozumiem skąd pan wziął 33 bajt .Nie powiedział pan czy to jest poprawny zapis.

    0---- 31 inkremntacja
    wysyłam adres 32
    32----63 inkrementacja
    wysyłam adres 64
    64----95 inkrementacja
    wysyłam adres 96
    96 -----127 inkrementacja
    wysyłam adres 128
    128 ----159 inkrementacja

    wysyłam adres 4064
    4064 ---- 4095 inkrementacja

    w adresie 4095 jest koniec pamięci .Moim zdaniem jest to poprawne adresowanie . Świadczy nawet to np że 5 bitów młodszego adresu nie zadresuje większej liczby od 63 =2^5 + 2^4+ 2^3+2^2+2^1+2^0


    Każdym zapisie strony 32 bajty daje komodę stop czekam 10ms i rozpoczynam nową sekwencję zapisu zwiększając adres komórki pamięci o 32 . Lepiej chyba zacząć zapis od komórki 0 Ponieważ przy odczycie granica odczytu wypada na 4095 bajcie co daje 4096 bajtów . Wątek jeszcze odczytu jak wpisze za pierwszy
    adres 0 to kolejne są inkrementowane do 4095 czy tez w obrębie strony do 32.



    eeprom 24c32 zasada zapisu stronami.
    eeprom 24c32 zasada zapisu stronami.
  • Poziom 12  
    Powyższy post trochę zmodyfikowałem ,jak koledzy mogą proszę powiedzieć czy mój tok myślenia odnośnie pamięci24c32 jest słuszny .
  • Poziom 28  
    ontario4 napisał:

    Powyższy post trochę zmodyfikowałem...

    Znacznie zmodyfikowałeś :) Już pisałem sprostowanie, ale widzę że chyba już załapałeś :)

    ontario4 napisał:

    ...lepiej zacząć adresowanie stronami od 1 strony...

    Ściślej mówiąc, od pierwszej komórki danej strony, bo wtedy można zapisać maksymalną ilość danych (w naszym przypadku 32 bajty) w komórkach o kolejnych adresach - nie nastąpi w międzyczasie powrót ("cofnięcie" się adresu) do początku strony.

    ontario4 napisał:

    ...adresy kolejnych komórek przy zapisie stronami będą 32 ,64,96,128,192 czyli 2^n jak zacznę od komórki 0 adresy będą 2^n-1...

    Adresy podałeś prawidłowo (chociaż na pierwszym miejscu powinno być zero), ale wzory powinny wyglądać raczej tak:
    sposób obliczenia adresu pierwszej komórki strony
    (rozmiar strony) * n

    zakres adresowania strony to:
    od (rozmiar strony) * n do [(rozmiar strony) * (n+1)]-1

    gdzie n jest numerem strony (indeksowanie od zera).

    ontario4 napisał:

    ...daje komodę stop czekam 10ms i rozpoczynam nową sekwencję zapisu...

    Trzeba pamiętać, że te 10ms to nie jest uniwersalny parametr. Ten czas należy sprawdzić w nocie katalogowej, bo może być inny (nawet dla tej samej pamięci w zależności od wartości napięcia zasilającego). Alternatywnie można sprawdzać zajętość pamięci poprzez sekwencję:
    1. START
    2. adres urządzenia (pamięci)
    3. sprawdzenie bitu potwierdzenia
    4. jeśli brak - STOP i powrót do punktu 1
    jeśli pamięć wysłała potwierdzenie można kontynuować transmisję

    ontario4 napisał:

    adres 0 to kolejne są inkrementowane do 4095 czy tez w obrębie strony do 32.

    Odczyt nie jest obarczony takimi ograniczeniami, jak zapis. Jest to związane z tym, że zapis jest dużo wolniejszy. Pamięć nie nadąży zapisywać danych z taką prędkością, z jaką je odbiera. Musi więc zapisywać je w buforze tymczasowym. Rozmiar tego bufora decyduje o rozmiarze 1 strony. Dane można więc odczytywać w sposób ciągły (bez limitów związanych z rozmiarem strony), przy czym należy pamiętać, że nie wszystkie pamięci "przewijają" adres do 0 po przekroczeniu przestrzeni adresowej. Przykładowo Microchip pisze tak:
    Cytat:

    The address pointer, however, will not roll over from address 07FF to address 0000. It will roll from 07FF to unused memory space.

    a Atmel tak:
    Cytat:

    When the memory address limit is reached, the data word address will “roll over” and the sequential read will continue.
  • Poziom 12  
    Jeszcze raz go zmodyfikowałem jak Pan Pisał odpowiedz haha:D , chyba teraz lepiej
    postaram się teraz kolejno odpisywać .Informacje od Pana w znaczny sposób pomogły.
  • Pomocny post
    Poziom 28  
    ontario4 napisał:

    Nie powiedział pan czy to jest poprawny zapis.

    0---- 31 inkremntacja
    wysyłam adres 32
    32----63 inkrementacja
    wysyłam adres 64

    Tak jest poprawnie, pamiętając oczywiście o tym, że przed każdym wysłaniem adresu musi być START i adres pamięci.

    ontario4 napisał:

    Panie Andrzeju wspomniał Pan o adresowaniu 0 do do 31 nie rozumiem skąd pan wziął 33 bajt

    To był tylko przykład, co się stanie, gdyby ktoś próbował zapisać więcej bajtów naraz, niż wynosi rozmiar strony. Chodzi o to, że wtedy te końcowe bajty nie zostaną zapisane w kolejnych komórkach, tylko wskaźnik adresu powróci do początku strony i zostaną nadpisane bajty wysłane w pierwszej kolejności.
  • Poziom 12  
    Fajnie w końcu zrozumiałem zapis do pamięci 24c32 wielkie podziękowania Panu Andrzejowi.
    Pamięć e2prom będzie kolejnym układem peryferyjnym w moim urządzeniu oraz nauka obsługi pamięci szeregowych Data flasch at45db011b i eeprom 93c64 ,ekspander wejścia- wyjścia na i2c poznałem . Ala wiem teraz do kogo się zwrócić . Dzisia Postaram się jeszcze napisać program w BASCOM do obsługi pamięci 24c32.:D