Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Mikrokontroler pracuje bez podłączenia zasilania? Ruszamy na samym GND i UART, zagadka.

p.kaczmarek2 14 May 2023 09:57 1665 25
Optex
  • Mikrokontroler pracuje bez podłączenia zasilania? Ruszamy na samym GND i UART, zagadka.
    Witajcie, dziś krótka ciekawostka - mikrokontroler pracujący bez podłączenia jego pinów VDD. Praktyczna prezentacja oraz wyjaśnienie jak to jest możliwe. Sam mikrokontroler z tematu ruszył po samym podłączeniu mu masy oraz linii UART, czyli RX i TX. Okazało się być to w pełni wystarczające by uruchomić go w trybie bootloadera i nawet by odczytać jego pełny wsad flash, całe 2MB, bez żadnych błędów CRC. Jak to możliwe? Przekonajmy się!

    Układ testowy
    Pacjentem jest czujnik ruchu PIR z komunikacją WiFi, zrealizowany w oparciu o moduł WiFi CBU, czyli układ BK7231N, ale od razu zaznaczam, że opisywane tu zjawisko spotkacie też w normalnych, popularnych mikrokontrolerach. Z zewnątrz ktoś mógłby pomyśleć, że ten czujnik PIR ma po prostu wsadzone bateryjki, a całość to żart, ale na filmie widać, że slot na nie jest pusty.
    Oto wspomniany filmik:



    Na filmiku korzystam z mojego flashera BK7231 GUI Flash Tool:
    https://github.com/openshwprojects/BK7231GUIFlashTool

    Nie chcecie oglądać filmu? Nie ma problemu, oto sprawozdanie z akcji, krok po kroku:
    1. Tutaj podłączony jest UART (w trybie 3.3V) oraz masa, VDD (normalnie 3.3V) wisi w powietrzu:
    Mikrokontroler pracuje bez podłączenia zasilania? Ruszamy na samym GND i UART, zagadka.
    Mikrokontroler pracuje bez podłączenia zasilania? Ruszamy na samym GND i UART, zagadka.
    2. Na komputerze rozpoczynam procedurę programowania, a raczej oczekiwania na rozpoczęcie programowania
    3. Tu zwieram do masy VDD od modułu WiFi, aby ten wykonał potem reboot, gdyż bootloader w tych układach tylko w momencie rebootu daje o sobie znać i czeka ułamek sekundy na handshake
    Mikrokontroler pracuje bez podłączenia zasilania? Ruszamy na samym GND i UART, zagadka.
    4. VDD zostawiam w powietrzu, a mimo to trwa odczyt pamięci flash, czyli MCU pracuje:
    Mikrokontroler pracuje bez podłączenia zasilania? Ruszamy na samym GND i UART, zagadka.
    5. Odczyt flash kończy się powodzeniem, nawet udaje się mojemu narzędziu (flasherowi) odczytać konfigurację GPIO Tuya:
    Mikrokontroler pracuje bez podłączenia zasilania? Ruszamy na samym GND i UART, zagadka.
    6. Pokazuję dla formalności, że nie ma ukrytych bateryjek:
    Mikrokontroler pracuje bez podłączenia zasilania? Ruszamy na samym GND i UART, zagadka.

    Wyjaśnienie zagadki
    Raczej tutaj każdy jest już przekonany, że MCU ruszył na samym podłączeniu masy oraz RX i TX. Tylko dlaczego?
    Odpowiedź umieszczam w spoilerze. Jeśli, czytelniku, chcesz, to sam się zastanów a potem dopiero sprawdź poniżej, czy miałeś rację.
    Spoiler:

    BK7231 jest dość egzotyczny, więc nie szukajmy nawet jego dokumentacji, tylko weźmy na stół coś bardziej popularnego.
    Może by Atmega8? Atmegi chyba każdy zna, chociażby dzięki Arduino.
    Co mówi nota katalogowa Atmegi na temat jej portów IO?
    Mikrokontroler pracuje bez podłączenia zasilania? Ruszamy na samym GND i UART, zagadka.
    Wszystkie IO mają ochronne diody do VDD i GND, które niejako "ścinają" wyższe napięcia... te diody są w środku Atmegi, one nie są obok na płytce. Tylko co jeśli nie podłączymy zasilania? Wtedy jedna z tych diod, ta "ścinająca" do zasilania, może zacząć przewodzić...
    Mikrokontroler pracuje bez podłączenia zasilania? Ruszamy na samym GND i UART, zagadka.
    Oczywiście ta dioda ma swój spadek napięcia, ale z reguły ten spadek nie jest na tyle duży, by napięcie pojawiająca się na VDD nie było wystarczające do wystartowania układu. Na wejściu jest 3.3V, spadek to, powiedzmy, 0.7V. 3.3-0.7 to 2.6, 2.6V jeszcze powinno starczyć by MCU ruszył.
    Zostaje jeszcze jedna kwestia - czy sygnał UART, który siłą rzeczy raz jest w stanie niskim, a raz wysokim, jest w stanie utrzymać zasilanie na takim poziomie by BK7231 nie wykonał ani jednego rebootu w trakcie całej procedury zasilania?
    Tutaj moim zdaniem ratują nas kondensatory na VDD. To one utrzymują MCU w stanie pracy nawet gdy chwilowo nie dostaje on zasilania przez GPIO.
    Wiem jeszcze z doświadczenia, że te zjawisko nie występuje gdy moduł z BK7231 jest poza układem, tj. nie ma kondensatorów na VDD, jest wylutowany z płytki-matki.

    Na koniec jeszcze jedna uwaga - te diody ochronne są w wielu układach, nie tylko w mikrokontrolerach:
    Mikrokontroler pracuje bez podłączenia zasilania? Ruszamy na samym GND i UART, zagadka.
    Nie zawsze jest o nich mowa w notach katalogowach, ale wydaje mi się, że z reguły są one dostępne. Zresztą można to łatwo sprawdzić.


    Podsumowanie
    Taka sytuacja może co najmniej bardzo zaskoczyć początkujących, bo z zewnątrz może wydawać się bardzo nieintuicyjna, dopiero wiedza o budowie układu scalonego w środku w pełni wyjaśnia sprawę. Mnie to raczej nie zaskoczyło i z doświadczenia wiem, że w przypadku omawianych tu modułów WiFi sytuacja ma tylko miejsce gdy programowany BK7231 ma na VDD jakiś kondensator, jeśli wylutujemy go całkiem z układu to UART nie daje rady go utrzymać przy życiu.
    Dajcie znać, czy spotkaliście się z tego typu zjawiskiem, które choć może wydawać się być problemem, jest jak najbardziej zrozumiałe - nie chciałbym, by GPIO moich MCU nie miały wbudowanej ochrony.
    Na koniec dodam, że przedstawiona sytuacja z BK7231 może być wyjątkowo problematyczna i zaskakująca, bo ten MCU uruchamia bootloader tylko na chwilę po reboocie, więc ktoś może być bardzo zdziwiony, że wykonanie cyklu "podpięcie i odpięcie zasilania" nie uruchamia tego bootloadera. A wszystkiemu winne jest... wiadomo, zgodnie z opisem ze spoilera. Jedyne co pomaga tu wykonać reboot to chwilowe zwarcie VDD ze strony MCU do masy, choć też nie jest to zbyt dobry pomysł, bo de facto to zwiera sygnał UART przez wspomnianą diodę do masy...

    Cool? Ranking DIY
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
    About Author
    p.kaczmarek2
    Moderator Smart Home
    Offline 
  • Optex
  • #2
    rubik123
    Level 21  
    Może po prostu wewnątrz procka są rezystory podciągające RX i TX do VCC i jeśli kondensator zewnętrzny się przez nie naładuje to procek ma na tyle niski pobór prądu, że kondensator wystarcza do zasilania. Ja bym sprawdził jakie napięcie jest w tym przypadku w trakcie programowania na tym kondensatorze..
  • #3
    Janusz_kk
    Level 36  
    rubik123 wrote:
    Może po prostu wewnątrz procka są rezystory podciągające RX i TX do VCC

    Są odłączone, to tylko diody tak jak Autor opisał, robią to zasilanie, nazywa się go pasożytniczym.
  • Optex
  • #4
    tmf
    Moderator of Microcontroller designs
    Tak samo pasożytniczo mogą być zasilane inne urządzenia z pinów IO procka. Osoby, które nie mają świadomości takich rzeczy mogą się wpakować w problemy. Pierwszy pojawia się dosyć często - dlaczego producent deklaruje, że procek w sleep ma pobierac x nA, a pobiera 1000xwięcej - help :) Czasami to pasożytnicze zasilanie powoduje, że układ działa ale nie do końca poprawnie. Np. przy normalnej pracy procek pobiera minimalny prąd, napięcie się utrzymuje ok i wszystko działa. Ale włączamy jakiś układ peryferyjny i wszystko siada, procek robi cuda, program ma dziwne błędy - help.
    To przy okazji pokazuje, że nie wystarczy wiedza z wiki (w wersji nowszej z chatGPT), niestety ciągle trzeba się uczyć i to od podstaw, aby uniknąć właśnie takich niespodzianek.
  • #5
    khoam
    Level 42  
    tmf wrote:
    Pierwszy pojawia się dosyć często - dlaczego producent deklaruje, że procek w sleep ma pobierac x nA, a pobiera 1000xwięcej - help

    Dobrze więc, kiedy w MCU jest możliwość "odpięcia" pinów od wewnętrznych układów tak, jak np. w układach serii ESP32.
  • #6
    tmf
    Moderator of Microcontroller designs
    khoam wrote:
    Dobrze więc, kiedy w MCU jest możliwość "odpięcia" pinów od wewnętrznych układów tak, jak np. w układach serii ESP32.

    Co ci da, że je "odepniesz" od układów wewnętrznych, jeśli masz diodę zabezpieczającą na wejściu, której nie odepniesz i to przez nią płynie prąd?
    Poza tym chyba każdy układ, który ma muliplekser sygnałów ma możliwość przepięcia pinów. Możesz sprecyzować o co chodzi?
  • #7
    khoam
    Level 42  
    tmf wrote:
    Co ci da, że je "odepniesz" od układów wewnętrznych, jeśli masz diodę zabezpieczającą na wejściu, której nie odepniesz i to przez nią płynie prąd?

    To zabezpieczenie jest też odpinane od wewnętrznej domeny zasilania. Może popłynąć prąd, co najwyżej rzędu kilkunastu nA.
  • #9
    krzbor
    Level 25  
    Te diody często fachowo nazywane "clamping diode" mają bardzo małe prądy. Trudno znaleźć informacje o ich maksymalnych prądach, ale często czytałem o wartościach rzędu 1-5mA. Choć przy procesorach PIC czytałem nawet o 20mA. Tu ciekawy wpis użytkownika @dondu : Link
    W każdym razie te legalne 1-5mA to bardzo mało, aby zasilić taki procesor. Szukałem informacji o prądach tych diod dla ESP8266 ale nic jednoznacznego nie znalazłem.
    Dlaczego ta informacja jest przydatna? Otóż można łączyć układy zasilane napięciami 5V i 3.3V tylko za pomocą rezystora. 3.3V jest zwykle wystarczające aby układ 5V rozpoznał stan wysoki. W drugą stronę po podaniu 5v na wejście 3,3V zadziała dioda "clamp". Rezystor powinien być większy niż 1k. Układy powinny być w tym przypadku zasilane z tego samego źródła, a na zasilaniu układu z napięciem 3,3V powinien być kondensator elektrolityczny - chodzi o to aby wyeliminować zjawisko opisane w tym artykule - czyli aby układ nie był zasilany ze zbyt wysokiego napięcia.
  • #10
    pawelr98
    Level 39  
    Dlatego w pewnych zastosowaniach daje się bufory 74244 na wejściu lub w wersji bardziej chamskiej, rezystory w szeregu.
    Żeby przypadkiem komunikacja z szafy obok nie była w stanie zasilić podzespołów.
  • #11
    Janusz_kk
    Level 36  
    krzbor wrote:
    Układy powinny być w tym przypadku zasilane z tego samego źródła, a na zasilaniu układu z napięciem 3,3V powinien być kondensator elektrolityczny

    Kondensator to za mało, powinna być dioda Zenera.

    Dodano po 1 [minuty]:

    pawelr98 wrote:
    rezystory w szeregu.

    Lepszy jest N-mosfet logic-level.

    Dodano po 2 [minuty]:

    U Chińczyka można nawet kupić gotowe układy na 4 kanały.
    https://pl.aliexpress.com/item/1005001621749928.html
  • #12
    tmf
    Moderator of Microcontroller designs
    krzbor wrote:
    Trudno znaleźć informacje o ich maksymalnych prądach, ale często czytałem o wartościach rzędu 1-5mA.

    W nocie Atmela jest informacja, że prąd takiej diody to 0,5 mA.
  • #13
    khoam
    Level 42  
    krzbor wrote:
    Szukałem informacji o prądach tych diod dla ESP8266 ale nic jednoznacznego nie znalazłem.

    Max. prąd to 0.5 mA. Niestety, nie ma tej informacji w ogólnie dostępnej dokumentacji.
  • #14
    Janusz_kk
    Level 36  
    Ja w nocie Atmela na temat detekcji zera sieci widziałem opornik 1M na wejściu procka co dla nap sieci w szczycie (310-320V) dawało prąd ~0,3mA, czyli z odpowiednim zapasem.
  • #16
    Urgon
    Level 38  
    AVE...

    Dobre 10+ lat temu widziałem projekt emulatora tagu RFID na mikrokontrolerze PIC, który to układ zawierał tylko cewkę nadawczo-odbiorczą, rzeczony mikrokontroler i kondensator między pinami VDD i GND. Cewka była podłączona do dwóch pinów IO, z czego jeden to było wejście CLKIN zegara...
  • #17
    khoam
    Level 42  
    krzbor wrote:
    Jak widać mówimy o poziomie 1mA dla diod zabezpieczających, a to na pewno nie wystarczy do zasilania tego 32bitowego procesora.

    Ale może popłynąć większy prąd przez krótki czas więcej i nic się złego nie stanie, wystarczy aby naładować kondensator:
    Quote:
    sytuacja ma tylko miejsce gdy programowany BK7231 ma na VDD jakiś kondensator, jeśli wylutujemy go całkiem z układu to UART nie daje rady go utrzymać przy życiu.

    Ten kondensator zapewni z kolei, też pewnie przez krótki czas, odpowiedni prąd zasilania dla MCU.
  • #18
    Jacek Rutkowski
    Level 27  
    krzbor wrote:
    Jak widać mówimy o poziomie 1mA dla diod zabezpieczających, a to na pewno nie wystarczy do zasilania tego 32bitowego procesora.

    To jest tylko prezentacja sztuczki :) Przy większym zegarze czy przy korzystaniu z ADC musisz zapewnić solidne zasilanie z dobrym filtrowaniem a nie na stałe pozbyć się pinów zasilania...
  • #19
    viayner
    Level 42  
    Witam,
    doloze mala cegielke do tematu, kiedys dawno jak "byly poczatki RFID" robilo sie uklady (osobiscie na PIC'ach) gdzie, mikrokontroler byl jednoczesnie "zasilany" wlasna antena nadawczo/odbiorcza, ilosc energii zgromadzonej wystarczala na odpowiedz. Te diody byly wlasnie do tego wykorzystywane.
    Pozdrawiam
  • #20
    tronics
    Level 38  
    Jak coś to poczytajcie o prototypie ARM ;) Bo dokładnie ten sam problem ponad 30 lat temu...
  • #21
    Janusz_kk
    Level 36  
    tronics wrote:
    Bo dokładnie ten sam problem ponad 30 lat temu..

    Ale jaki?arm się 'zasilał' z peryferii?
  • #22
    tronics
    Level 38  
    Dokładnie, mierzyli pobór z VCC który przez chyba błąd był albo niepodłączony, albo w ogóle w design był błąd... a mikroprocesor wstał przez zasilanie z I/O ... tak tą historię opisywał jeden z bardzo leciwych inżynierów projektujących ten procesor.
  • #24
    Janusz_kk
    Level 36  
    tronics wrote:
    Dokładnie, mierzyli pobór z VCC który przez chyba błąd był albo niepodłączony, albo w ogóle w design był błąd... a mikroprocesor wstał przez zasilanie z I/O ...

    Dobre :) to że amator może taki błąd zrobić to normalne ale że firma tak potrafi dać ciała? :)
  • #25
    tronics
    Level 38  
    Janusz_kk wrote:

    Dobre :) to że amator może taki błąd zrobić to normalne ale że firma tak potrafi dać ciała? :)

    I tu jest pies pogrzebany, bo ta firma w tym okresie nie miała de facto nikogo z doświadczeniem w projektowaniu CPU :) Po prostu zebrała się garstka ludzi i uznali, że nie, że 6502 to już był, że 65C816 z WDC (taka firma z siedzibą przypominającą przeciętny amerykański garaż) to jednak nie to czego chcą i skoro WDC zrobiło CPU w takich warunkach to oni też dadzą radę. No i co tu dużo ukrywać, zasadniczo dali... A, że są w czasie prototypowania faile? No panie, z 3 zestawów chipsetu AAA do Amigi (który nie miał okazji wyjść) de facto nie działał żaden ;) W CIA do C64 był bug, który powodował, że nie można było wykorzystać sprzętowej transmisji szeregowej tylko walić bit po bicie (co znacząco ograniczało możliwą prędkość - w tym prędkość stacji dyskietek). To nie tak, że firma nie robi bugów. W Atmega8 AVcc i Vcc były w środku fizycznie połączone.
  • #26
    Janusz_kk
    Level 36  
    tronics wrote:
    Po prostu zebrała się garstka ludzi

    Czyli zgodnie z przysłowiem nie wiedzieli że się nie da :) co się powozili to ich ,ale zrobili.
    Z tego pierwszego wpisu Twojego wnioskowałem że to była poważniejsza firma niż grupa zapaleńców, stąd moje zdziwienie nad tak banalnym błędem.

    tronics wrote:
    W Atmega8 AVcc i Vcc były w środku fizycznie połączone.

    To wiem, ale Atmel to i tak mało ich miał, właśnie przeczytałem artykuł Urgona na temat Pic-ów i dziękuje Bogu że się kiedyś nimi nie zainteresowałem :)