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.

[C][PIC16F720]Zapis odczyt do zewnętrznej pamięci FLASH SST25VF016

mgiro 07 Lip 2012 12:17 2251 5
  • #1 07 Lip 2012 12:17
    mgiro
    Poziom 22  

    Witam,

    Od kilku dni walczę z zapisem odczytem do zewnętrznej pamięci FLASH. Wykorzystuję mikrokontroiler PIC16F720. Gdy SDO połączę z SDI to odbieram to co wysyłam.

    Tutaj zamieszczam kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zapis
    [C][PIC16F720]Zapis odczyt do zewnętrznej pamięci FLASH SST25VF016

    Odczyt
    [C][PIC16F720]Zapis odczyt do zewnętrznej pamięci FLASH SST25VF016

    Jeszcze coś powinienem skonfigurować czy ustawić?

    0 5
  • #3 08 Lip 2012 09:30
    mgiro
    Poziom 22  

    Nie wiedziałem, że coś takiego jest. W pliku są wszystkie funkcje do programowego SPI i zapisu/odczytu danych do scalaka oraz ustawianie rejestrów.
    I teraz aby coś w do pamięci FLASH zapisać i następnie odczytać co co trzeba zrobić po kolei.

    Próbowałem właśnie zapisać rejestr wartością 0b01000000 i następnie jakoś wartość pod adres. Później chciałem odczytać tą wartość z tego adresu. Ale nie działa mi to poprawnie.

    0
  • #4 12 Lip 2012 14:30
    Marico
    Poziom 19  

    A jak jest skonfigurowany SPI? 16F720 akurat nie używałem ale mam przetestowany SST25VF016 z picami 18F. Ten flash jest "wrażliwy" na kilka parametrów SPI, u mnie działa poprawnie tylko taka konfiguracja:
    - SLEW RATE CONTROL=OFF, jeśli 16F720 ma SRC należy to wyłączyć dla portu na którym jest SPI
    - SMP=0 Input data sampled at middle of data output time
    - CKE=0 Output data changes on clock transition from idle to active
    - CKP=1 Idle state for clock is a high level

    No oczywiście nie wspominam o SSPM i SSPEN oraz odpowiednie kierunki portów na których jest SDI/SDO ale zakładam, że jest ustawiony prawidłowo...?

    0
  • #5 13 Lip 2012 17:17
    mgiro
    Poziom 22  

    Ustawiłem SPI tak jak napisałeś, ale dalej nie działa. Mógłbyś napisać co robisz po kolei.

    Ja robię tak:
    -ustawiam zapis dostepny
    -czekam, aż bit BUSY będzie zerem
    -zapisuje rejestr konfiguracyjny (0x00)
    -czekam, aż bit BUSY będzie zerem
    -robie chip erase
    -czekam, aż bit BUSY będzie zerem
    -ustawiam zapis dostępny
    -czekam, aż bit BUSY będzie zerem
    - zapisuje do pamięci
    -czekam, aż bit BUSY będzie zerem

    Odczytuję danę tak, jak przedstawia funkcja odczyt() w pierwszym poscie

    0
  • #6 13 Lip 2012 22:02
    Marico
    Poziom 19  

    Może zacznij od weryfikacji czy komunikacja z układem działa prawidłowo, np. odczytaj chip ID (instrukcja 0x9f), powinieneś dostać 3 bajty w odpowiedzi: 0xbf, 0x25,0x41. Jeśli na tym etapie jest problem z odczytem ID oznacza to problemy z SPI. Warto też zapytać jak podłączyłeś flash, jeśli nie używasz HOLD i WP to oba powinny być podłączone do VDD. Acha i zauważyłem, że przy zapisie w Twoim kodzie nie ma wywołań instrukcji "write enable" (0x6) przed każdym zapisem/kasowaniem (cyt. z datasheet: The WREN instruction must be executed prior to any Write (Program/Erase) operation.). Sekwencja kasowania powinna być taka:
    1. CS=0; // chip select
    2. wysylasz 0x6
    3. CS=1;
    4. CS=0;
    5. wysylasz 0x60 //erase
    6. CS=1;
    7. sprawdzasz BUSY
    Zapis podobny ale w pkt 5 wysylasz 0xad+ adres (3 bajty) + dwa bajty danych.

    0