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

Programowanie pamięci flash z interfejsem równoległym

Silkboy 11 Mar 2015 18:50 783 6
  • #1 11 Mar 2015 18:50
    Silkboy
    Poziom 11  

    Chcę zrobić programator pamięci flash na USB.

    Czytając dokumentację, na tyle na ile znam angielski, czyli słabo. ;)
    Mam pewien kłopot odnośnie sposobu programowania pamięci flash typu NOR.

    A więc:

    Pyt. 1. Czy po wprowadzeniu układu pamięci w tryb programowania, mogę zapisać tylko jeden bajt/słowo,
    a potem ponownie wprowadzać rozkaz programowania i kolejny bajt/słowo?
    Czy raz wprowadzony tryb programowania pozwala na zapis całego sektora?

    Pyt. 2. Czy sektor jest automatycznie kasowany przed zapisem, czy trzeba go kasować?

    Pyt. 3. W nocie katalogowej coś było napisane o inicjacji układu.
    Jeśli to tyczy się czegoś więcej niż odczytu rodzaju układu, prosił bym o wyjaśnienie tematu.

    To są najważniejsze pytania, jeśli mi coś jeszcze przyjdzie do głowy to zapytam w trakcie dyskusji.

    Bardzo proszę o nie udzielanie odpowiedzi typu "kup pan se programator"!

    Dodam, że odpowiedź na te pytania pozwoli mi zbudować programator bez pracochłonnego testowania. Nie jest to wiele dla osoby znającej temat a bardzo pomoże mi skrócić czas realizacji.

    0 6
  • #2 13 Mar 2015 20:54
    RitterX
    Poziom 36  

    Ogólnie FLASH-e są przeznaczone do operacji sektorowych. Kasowanie odbywa się w trybie sektorowym albo całego układu.
    Zapis również może być dokonywany w trybie sektorowym. Wtedy zaoszczędzasz na czasie programowania gdyż po dokonaniu zapisu sektora a nie bajtu układ pamięci przechodzi w tryb zajętości rzędu 2ms.
    Pamięci pod względem programowania nie są zunifikowane choć posiadają bardzo dużą część wspólną rozkazów i czasów. Dlatego trzeba przejrzeć specyfikacje producentów gdy ktoś ma zamiar budować programator.

    0
  • #3 13 Mar 2015 21:09
    Silkboy
    Poziom 11  

    To właśnie wiem, zadaje pytania w kwestii niejasności noty katalogowej dla mnie.
    Wiem, że gdy zapiszę bajt to układ zapisze sektor.

    Pytanie moje, czy po wprowadzeniu trybu zapisu, przez komendy, mogę wprowadzać dane bajt po bajcie jak w pamięci RAM, aż do zapisu sektora, czy muszę całą procedurę wykonać, dla kolejnego bajtu, ponownie?
    A czas między wprowadzeniem sekwencji zapisu stanowi o tym, że wprowadzanie danych się nie zakończyło lub zakończyło? <- Zmieniono, dla zwiększenia jasności pytania!

    Uff długie zdanie. :D

    Chodzi mi o to by układ nie zapisywał mi sektora 64000 razy (zależnie od pojemności) tylko raz. Tego nie mogę się doczytać z noty katalogowej.

    0
  • #4 14 Mar 2015 23:31
    RitterX
    Poziom 36  

    Zastanów się, jeżeli zapisujesz bajt danych to aby móc korzystać z zapisanej danej musisz przejść procedurę programowania pamięci czyli wygenerować impuls zapisujący 2ms. Jeżeli robisz to za każdym razem po zapisie pojedynczego bajtu to bardzo szybko przekroczysz maksymalną liczbę zapisów, które producent podaje w karcie katalogowej. Wartość 10000 wcale nie jest taka ogromna. Widziałem program magika :), który zrobił sobie bufor wyświetlacza we FLASH-u...
    Jeszcze raz i wyraźnie. FLASH-e są dostosowane do zapisu sektorowego, kasowania sektorowego a tym samym działania sektorowego. Zapisujesz sektor, przesyłasz dane do wewnętrznego bufora pamięci poczym wydajesz komendę programowania.
    Programowanie metodą: bajt, cykl zapisu(2ms), bajt, cykl zapisu(2ms),... to bardzo zły, by nie rzec głupi, sposób zapisu FLASH-y.
    Dla przykładu, w pamięci mikrokontrolera tworzysz bufor RAM i po jego zapełnieniu wysyłasz dane ciurkiem do bufora pamięci FLASH. Wielkość bufora zależy od wiekości, organizacji oraz producenta pamięci.
    Jak zapełnisz bufor we FLASH wydajesz komendę programowania - cykl zapisu (2ms).
    W tym trybie nie dość, że przenosisz więcej danych w jednym cyklu zapisu, czyli oszczędzasz czas, to dodatkowo wolniej zużywasz pamięć z uwagi na ograniczoną liczbę cykli zapisu.

    0
  • #5 16 Mar 2015 05:24
    Silkboy
    Poziom 11  

    Gdyby w datashet-ach było napisane tak jak Ty piszesz to było by jasne, ale tak nie jest.
    Stąd mam niejasności, ponieważ komendę zapisu wysyła się najpierw a dopiero po niej dane.
    Nie wiem tylko czy po komendzie dane wysyła się, non stop aż do zapełnienia bufora, czy przed każdym bajtem danych zawsze musi być komenda a odpowiednio krótki czas stanowi o tym czy wprowadzanie danych do zapisu się zakończyło.
    Już trzeci raz piszę jedno i to samo. :D
    Dobra nie ma co się kłopotać, mikrokontroler zawsze można przeprogramować.
    Przetestuję sobie tryb zapisu z dwoma słowami i wszystko będę wiedział.
    Przeprowadzę zapis " komenda-addr0x00-word1-addr0x02-word2" po zapisie " komenda-addr0x02-word3-addr0x04-word4" i będę miał od razu odpowiedzi na trzy pytania.
    Jeśli zapis będzie poprawny pod adresem 0x00 będzie słowo nr 1 pod adresem 0x02 będzie słowo nr3 pod adr. 0x04 będzie słowo 4.
    Jeśli słowo nr 4 będzie zapisane testy można uznać za zakończone.
    Jeśli nie, przed każdym słowem, bo akurat mam pamięć 16bit, musi być menda-komenda drugi test odpowie mi czy sektor sam się kasuje ( z tego co wyczytałem to sam się kasuje jeśli zapisywane dane nie są takie same ) bo sposób wprowadzania danych będzie znany.
    Widzisz teraz przyszła mi do głowy jeszcze jedna niewiadoma, może być, że pod adresem 0x00 nic nie znajdę, będzie tylko zapisany 0x02 i lub nie 0x04.
    Dzięki za starania. :)

    0
  • #6 16 Mar 2015 20:43
    RitterX
    Poziom 36  

    W nocie katalogowej do pamięci serii 29.. firmy Micron jest wyraźnie napisane na samym początku, że dzięki wewnętrznemu buforowi można zapisaź 512 słów za pomocą jednej sekwencji zapisu. Wim, że nie przekonam :) . Sprawdź...
    Ważne byś się upewnił jakiej wielkości jest sektor a jakiej bufor. Tak by przenoszenie danych odbywało się zgodnie z tym co zaleca dany producent.

    0
  • #7 17 Mar 2015 03:40
    Silkboy
    Poziom 11  

    Nie dogadamy się, piszesz o jednym a ja o czymś innym.
    Już nawet dałem przykład co będę sprawdzał, a Ty dalej tłumaczysz coś co ja wiem.

    Popatrz to jest wyciąg. właśnie z datashet f-my Micron:

    Cytat:

    PROGRAM Command

    The PROGRAM command can be used to program a value to one address at a time. The
    command requires four bus WRITE operations. The final WRITE operation latches the
    address and data, and starts the program/erase controller.


    If the address falls in a protected block, then the PROGRAM command is ignored, the
    data remains unchanged. The status register is never read and no error condition is given.
    During the PROGRAM operation, the memory will ignore all commands. It is not possible
    to issue any command to abort or pause the operation. Typical program times are
    given in READ CFI QUERY Command. READ operations during the PROGRAM operation
    will output the status register on the data I/Os. (See Registers.)
    After the PROGRAM operation has completed, the memory returns to read mode, unless
    an error has occurred. When an error occurs, the memory continues to output the
    status register. A READ/RESET command must be issued to reset the error condition
    and return to read mode.
    Note that the PROGRAM command cannot change a bit set at 0 back to 1. One of the
    ERASE commands must be used to set all the bits in a block, or in the whole device,
    from 0 to 1.


    Pogrubionym tekstem zaznaczyłem, to co dotyczy się sposobu programowania za pomocą komendy.
    Weźmy pierwsze zdanie które mówi:
    Komenda programowania może być użyta do zaprogramowania wartości pod jeden adres w danym momencie.
    Sugeruje to że można wprowadzić słowo a można też wprowadzić kilka słów a nawet zapełnić bufor. A może trzeba to traktować, że jedna komenda jedna dana, następna komenda kolejna dana...

    Przykład:
    operacja 1operacja 2operacja 3operacja 4a dalej co???
    adr - dataadr - dataadr - dataadr - dataadr - data
    555 - AA2AA - 55555 - A0 PA - PD PA+n - PD+n


    A może?

    sekwencja od 1-3 + PA PD| zaraz po tym | sekwencja1-3 + (PA+n) (PD+n)

    i jedno nie pasuje i drugie nie pasuje bo jak stanowi trzecie zdanie:
    Ostatnia operacja zapisu zatrzaskuje adres i dane oraz rozpoczyna procedurę zapisu. I czeski film bo drugie zdanie mówi, że rozkaz programowania składa się z czterech cykli zapisu magistrali, więc nie ma jak wprowadzać kolejnych danych. :/

    Jak widzisz niejasność jest w sposobie wypełniania bufora.
    Tyle się rozpisali o programowaniu bajtu a guzik napisali jak wypełnić bufor.

    Cytat:
    W nocie katalogowej do pamięci serii 29.. firmy Micron jest wyraźnie napisane na samym początku, że dzięki wewnętrznemu buforowi można zapisaź 512 słów za pomocą jednej sekwencji zapisu. Wim, że nie przekonam Smile . Sprawdź...






    Nie musisz mnie przekonywać do czegoś co wiem. :)

    A taką sekwencje znalazłem w nocie katalogowej AMD.
    I teraz nie wiem, jakimi kryteriami ten wbudowany algorytm się sugeruje.


    Programowanie pamięci flash z interfejsem równoległym



    Edytuj

    Wygląda na to, że zapis, sekwencja i słowo po tym sekwencja i słowo, jest poprawny.

    Już chyba wiem o co tu biega, nagle mnie oświeciło. :idea:
    Jest napisane że układ można maksymalnie 1 000 000 razy zapisywać/kasować.
    To nie znaczy że każdy zapis jest zapisem wymagającym kasowania.
    Jeśli skasujemy ustawiamy w sektorze same jedynki, więc można zapisywać bajt po bajcie, czy słowo po słowie pod warunkiem że zmieniamy 1 na 0 a nie odwrotnie.
    I tam wszędzie coś takiego jest napisane, a nie jakiś bufor.
    Gdy chcemy w danych zapisać 0 na 1 to wyskoczy błąd i trzeba kasować sektor.
    Więc dziś można zapisać pól sektora a jutro drugie pól i będzie to jeden zapis/kasowanie. O i tyle. :D

    Nawet gdyby bufor miał 512 słów jak napisałeś daje to tylko 1KB a gdzie 64KB/sektor to masz 64 zapisy na dzień dobry.
    Więc zapisywać sobie można byle by nie nadpisywać bo tego się nie da bez kasowania chyba, że zmiana będzie tyczyła się 1 na 0 w bajcie lub słowie.

    No i teraz wszystko zrobiło się jasne.

    0