Programowanie w układzie pamięci FLASH SPI

Pytania techniczne oraz porady dotyczące programowania pamięci oraz funkcjonalności programatora.
APBserwis
Posts: 3
Joined: Tue Oct 13, 2015 4:19 pm
Has thanked: 1 time

Programowanie w układzie pamięci FLASH SPI

Postby APBserwis » Tue Oct 13, 2015 4:40 pm

Jestem użytkownikiem Państwa programatora od blisko dwóch lat. Jestem usatysfakcjonowany i chciałbym podziękować i jednocześnie pochwalić za darmowe aktualizacje - w szczególności ostatnią po której programator programuje nieporównywalnie szybciej. Zdarza mi się dużo programować pamięci FLASH SPI w układzie (bez wylutowania) - są to różne urządzenia RTV (kamery,telewizory, płyty główne w notebookach itd.). Wiele układów programuje bezproblemowo. Jednak są też takie, gdzie odczyt jest poprawny a nie chce wyczyścić i zapisać, jak również są takie gdzie odczyt jest losowy (po wylutowaniu pamięci i umieszczeniu w podstawce - wszystko działa poprawnie). Podejrzewam że jest to problem z zakłóceniami/zbyt długimi połączeniami. Próbowałem programować na krótszej taśmie (10cm zamiast około 30cm) i to czasem pomaga, ale nie zawsze. Zaobserwowałem też, że czasem pomaga obniżenie lub podwyższenie napięcia programowania. Wydaje mi się że może to być też problem danego układu - wiele z nich posiada wiele elementów, wielowarstwową płytę (długie scieżki) i nie wykluczone że jakieś dodatkowe elementy na liniach od programowania co ciężko stwierdzić. Czy posiadają Państwo jeszcze jakieś inne wskazówki, które mogłyby pomóc podczas programowania w układzie?

ArT
Posts: 1538
Joined: Wed Mar 25, 2015 8:54 am
Location: Warsaw, Poland
Has thanked: 56 times
Been thanked: 166 times

Re: Programowanie w układzie pamięci FLASH SPI

Postby ArT » Tue Oct 13, 2015 6:02 pm

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 SPI
Zdarza 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ładzie
Linia 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łowych
Czę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
spi_terminators.jpg (30.71 KiB) Viewed 9081 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.

APBserwis
Posts: 3
Joined: Tue Oct 13, 2015 4:19 pm
Has thanked: 1 time

Re: Programowanie w układzie pamięci FLASH SPI

Postby APBserwis » Tue Oct 13, 2015 7:28 pm

Dziękuje serdecznie za wyczerpującą odpowiedź. Przetestuję i podzielę się spostrzeżeniami.

APBserwis
Posts: 3
Joined: Tue Oct 13, 2015 4:19 pm
Has thanked: 1 time

Re: Programowanie w układzie pamięci FLASH SPI

Postby APBserwis » Mon Oct 19, 2015 12:37 pm

Potestowałem trochę i muszę przyznać że wskazówki okazały się bardzo pomocne.

Przypadek 1. W wielu kamerkach w których zmieniamy firmware oprócz pamięci jest procesor który komunikuje się z tą pamięcią (oznaczony jako STM32F4...). Na każdej płycie jest wyprowadzone złącze do programowania tego procesora (tzw. JTAG), a w tym złączu jest linia RESET. Faktycznie, po podłączeniu linii RESET do masy, programator zaczął poprawnie czytać i zapisywać pamięć, a więc był to problem konfliktu na magistrali.

Przypadek 2. Mamy bardziej rozbudowane płyty główne od sterowania "inteligentnymi" domami. Ciężko się połapać co jest czym na takiej płycie bo elementów jest dużo a schematu nie mamy (wygląda to bardziej jak mała płyta główna od PC z portami we/wy). Tutaj czasem programował flasha poprawnie (w szczególności na możliwie krótkiej taśmie), a czasem odczytywał losowo, więc wygląda na problem zakłóceń. I tutaj też wskazówki okazały się pomocne. Z ciekawości przetestowałem kilka wariantów. W moim przypadku najbardziej niezawodne jest umieszczenie wspomnianych rezystorów odkłócających w szereg linii CS, MOSI, SCK po stronie układu (przy samym klipsie). Akurat nie miałem 470 ohm, ale na 120 ohm wszystko pięknie działa, tyle tylko że na krótkiej taśmie. Na dłuższe taśmie już nie, jednak zmiana rezystorów na 560 ohm i zaczęło wszystko działać na taśmie długiej takiej z 30 cm, ale jednocześnie przestało działać na taśmie krótkiej. Czyli jak widać jeżeli chodzi o pozbywanie się zakłóceń to sprawa jest dość indywidualna zależna od samego układu i długości połączeń. I tutaj rodzi mi się następujący pomysł a jednocześnie pytanie: a gdyby tak dodać możliwość obniżenia prędkości z jaką komunikuje się programator, to może wtedy całość byłaby bardziej odporna na zakłócenia i nie trzeba by było tego odkłócać w układzie? Oczywiście kosztem szybkości programowania.

ArT
Posts: 1538
Joined: Wed Mar 25, 2015 8:54 am
Location: Warsaw, Poland
Has thanked: 56 times
Been thanked: 166 times

Re: Programowanie w układzie pamięci FLASH SPI

Postby ArT » Mon Oct 19, 2015 2:31 pm

Możliwość obniżenia taktowania magistrali SPI będzie dostępna od kolejnej aktualizacji (v1.4 która już jest ukończona i oficjalnie pojawi się na stronie za 2 dni). Pomysł jest dobry, ale on się sprawdzi w innym przypadku (np. przy większych pojemnościach układu). W przytoczonym przykładzie 2 moim zdaniem problemem są odbicia fali. Zjawisko to może wystąpić przy niedopasowanej impedancji układu. Powodem jest nie tyle wysoka częstotliwość taktowania SPI, co szybka zmiana zbocza (krótki czas narastania podczas zmiany stanu). Szybkie układy (a takimi mogą być pamięci FLASH SPI) są w stanie wychwycić odbity impuls i zinterpretować go jako szybką zmianę stanu (jeżeli zjawisko to wystąpi na linii CS to komunikacja zostanie zerwana). Dlatego właśnie zastosowanie w szeregu rezystorów odprzęgających (wartością dopasowanych do impedancji układu) tłumi te odbicia. Z problemem można sobie radzić jeszcze w inny sposób - poprzez wydłużenie czasów narastania/opadania stosując np. kondensatory odprzęgające rzędu pF, ale jeżeli te czasy zostaną zbyt wydłużone (zbyt duża pojemność), wtedy właśnie może być niezbędne obniżenie częstotliwości taktowania samej magistrali SPI. Niektóre układy mają już na płycie umieszczone kondensatory rzędu 3-33pF na liniach MOSI/MISO/SCK i czasem nawet do 1-100nF na linii CS - w takim przypadku obniżenie częstotliwości SPI też może okazać się pomocne.

edit: po ostatnich aktualizacjach została wprowadzona możliwość zmniejszenia prędkości transmisji, jak również zmniejszone są czasy narastania zboczy dla najwolniejszych transmisji - powyższy post z poradami został zaktualizowany o powyższe zmiany.


Return to “Wsparcie Techniczne”

Who is online

Users browsing this forum: No registered users and 1 guest