Cieszymy się że jest Pan usatysfakcjonowany. Jak Pan słusznie zaobserwował wiele zależy od samego układu. Z wieloma przypadkami można sobie całkiem skutecznie radzić. Poniżej przedstawiam parę porad z mojego doświadczenia, które powinny okazać się pomocne. W poniższych poradach zakładam że problemem nie są rzeczy trywialne - typu niepoprawne połączenia, złe zasilanie, niekontaktujące piny czy uszkodzona pamięć (
programowanie w podstawce musi przebiegać poprawnie)
1. Współdzielona magistrala SPI.Na wielu płytach głównych oprócz samej pamięci, jest również procesor sterujący oraz inne układy. Wszystkie się komunikują między sobą przy wykorzystaniu współdzielonej magistrali SPI (współdzielone linie MOSI, MISO, SCK oraz dedykowana linia CS dla każdego z układów). Jeżeli spróbujemy odczytać lub zapisać pamięć kiedy na magistrali SPI odbywa się komunikacja - to wystąpi konflikt. Objawem jest najczęściej losowy odczyt, błąd czyszczenia i zapisu. W takim przypadku nie jesteśmy jeszcze skazani na wylutowanie pamięci. Ważne jest, aby każdy układ podrzędny (SLAVE) miał podciągniętą linie CS (Chip Select) do zasilania przez rezystor podciągający (tzw. pull-up o wartości od 4.7k do 10k) - wtedy każdy z układów podrzędnych jest domyślnie nieaktywny i nie będzie zakłócał komunikacji. Ponadto, główny procesor sterujący (jeżeli występuje) powinien być w stanie RESET - wtedy nie będzie sterował w/w liniami i programator bez problemu skomunikuje się z pamięcią. Często na płytach jest wyprowadzone złącze programujące dla procesora a w nim jest m.in. linia RESET która wystarczy zewrzeć do masy na czas programowania. Innym popularnym trickiem jest obniżenie napięcia zasilania na tyle, aby procesor nie wystartował a zasilanie pamięci było wystarczające (w REVELPROG-IS można ustawić tzw. napięcie użytkownika w zakresie 1.0 - 5.0V ze skokiem 0.1V). Inną możliwością może być uruchomienie urządzenia z własnego zasilania, odczekanie aż procesor przestanie wykonywać sekwencje startową i przestanie komunikować się z pamięcią (zwykle od kilku sekund do 2-3 minut) i dopiero wtedy podłączenie się z programatorem i próba odczytu.
2. Dodatkowe elementy na liniach SPIZdarza się, że w układzie są zamontowane dodatkowe elementy, które uniemożliwią komunikację z pamięcią w układzie. Mogą to być np. diody, dodatkowe podciągnięcia czy kondensatory które uniemożliwią programowanie "z zewnątrz". Spotkałem się też z bramkami/bus-switchami które są sterowane przez główny procesor (np. linie MOSI/MISO/SCK domyślnie są wykorzystane jako zwykłe linie I/O obciążone innymi elementami, a dopiero w razie potrzeby są przełączane przez procesor sterujący) - w takim przypadku jedynym sensownym rozwiązaniem jest wylutowanie pamięci z układu i zaprogramowanie w podstawce.
3. Zbyt niskie napięcie zasilania lub konflikt napięćPamięć może być zasilana z programatora lub z układu. Należy pamiętać, że zasilając pamięć z programatora zasilamy tak naprawdę wszystkie układy podłączone pod tą linie zasilania. Czasem należy ręcznie podnieść wartość napięcia gdyż w przypadku zwiększonego poboru prądu trzeba liczyć się ze spadkami napięcia w układzie (np. 3.6V będzie wciąż bezpieczne dla pamięci 3V). Jeżeli układ już posiada podłączone swoje zasilanie (a co za tym idzie pamięć już jest zasilana) to w takim przypadku należy w programatorze ustawić dokładnie takie samo napięcie VPP co w układzie na pamięci - w przeciwnym razie wystąpi konflikt napięć na linii zasilania. Programator posiada wbudowane zabezpieczenie na zbyt duży pobór prądu i może się okazać że bez podłączenia zewnętrznego zasilania pamięci nie zaprogramujemy.
4. Chip Select (CS) w układzieLinia CS w układzie powinna być zawsze podciągnięta do zasilania przez rezystor podciągajacy (pull-up). Po stronie programatora wszystkie linie od SPI są podciągnięte przez 10k do napięcia zasilania pamięci - jednak to może nie wystarczyć. W układzie linia CS zawsze musi być podciągnięta przez rezystor rzędu 4.7k - 10k - a nie zawsze tak jest. Zdarza się że wybór układu podrzędnego poprzez linie CS jest realizowany programowo (pull-up/pull-down z procesora sterującego) lub podciągnięcie jest zbyt słabe i w takim przypadku przy zbyt długich przewodach nie uda się zaprogramować pamięci w układzie. W takim przypadku można spróbować podłączyć rezystor 4.7k - 10k w układzie między linią CS a zasilaniem pamięci (w przypadku pamięci FLASH SPI są to odpowiednio piny 1 i 8). Czasem przy zbyt słabym podciągnięciu nie są dostatecznie tłumione zakłócenia - w takim przypadku powinien pomóc kondensator odprzęgający między linią CS a zasilaniem lub masą (33pF-220pF powinno wystarczyć).
5. Zakłócenia i odbicia fali na liniach sygnałowychCzęstym problemem są tzw. odbicia (np. na skutek zmiany stanu linii). Tutaj należałoby najpierw spróbować zmniejszyć prędkość transmisji (Ustawienia -> Hardware -> FLASH SPI zegar SCK na 10%), a jak nie pomoże to dopasować impedancje układu (oraz przewodów) i to wytłumić, np. poprzez zastosowanie rezystorów odprzęgających podłączonych szeregowo na liniach CS, MOSI, SCK (zwracam uwagę że nie ma tu linii MISO, która jako jedyna jest wyjściem z układu). W programatorze już jest wbudowane odprzęganie i odkłócanie na magistrali SPI - jednak w przypadku programowania w układzie może to nie wystarczyć. Niestety nie ma tutaj jednej uniwersalnej wartości. Każdy układ jest inny, są różne długości ścieżek (i przewodów), różne pojemności itd. Nie wdając się w szczegóły, z praktycznego punktu widzenia zastosowanie w szereg dodatkowych rezystorów rzędu 100Ohm - 1000 Ohm powinno w zupełności wystarczyć:
- spi_terminators.jpg (30.71 KiB) Viewed 9002 times
Proponuje spróbować z rezystorami 100Ohm, 470Ohm oraz 1kOhm. Czasem wystarczy tylko na linii CS, czasem na CS i MOSI, a czasem na CS, MOSI i SCK. Jeżeli skrócenie taśmy lub zmiana napięcia zasilania miały pozytywny skutek, to jest wielce prawdopodobne że problem tkwi w odbiciach/zakłóceniach i w/w rozwiązanie okaże się pomocne.
Programowanie w układzie potrafi być problematyczne dlatego mam nadzieję że w/w informacje będą również pomocne dla innych. Uzupełniliśmy też rozdział 5 w instrukcji o dodatkowe wskazówki. Zapraszam do dzielenia się doświadczeniami - w razie potrzeby będę uzupełniał ten temat o dodatkowe informacje.