Dziwne zachowanie ENC28J60 po softresecie ATmegi

Wprowadzam właśnie niewielkie zmiany do softu w jednym z moich projektów. Jedno z usprawnień umożliwia zapisywanie konfiguracji (m.in numer IP) w pamięci EEPROM i przywracanie ustawień fabrycznych z flasha. Aby dało się to robić wygodnie, potrzebuję sposobu zdalnego resetowania. Skorzystałem z popularnego sposobu - watchdog ustawiony na najkrótszy czas i pętla nieskończona.

Niestety, coś nie działa tak, jak powinno. ATmega najwyraźniej się resetuje, ale ENC28J60 nie chce działać poprawnie.

Najpierw zaraz po resecie dioda połączenia na gniazdku RJ45 (ta, która powinna świecić cały czas po włożeniu kabla Ethernetowego) zaczęła szybko migać. Oczywiście urządzenie nie odpowiadało na pakiety UDP. Dodanie instrukcji opóźnienia na początku programu zlikwidowało miganie, ale nie przywróciło łączności.

Próbowałem też resetować ENC28J60 w przypadku wykrycia resetu przez watchdoga. Próbowałem rozwiązania zarówno z resetem przez stan niski na odpowiednim pinie, jak również przez SPI. Pomogło tyle, że układ najwyraźniej "jakoś" się zainicjował, gdyż migała zielona dioda w odpowiedzi na jakieś pakiety z sieci. Niestety ciągle nie przychodziły odpowiedzi. Co ciekawe ta instrukcja blokowała układ cały czas, bez względu na to czy był resetowany przez WD, czy przez odłączenie zasilania, chociaż reset wykonywałem wewnątrz instrukcji sprawdzajacej stan pinu odpowiadającego za eset watchdog wewnątrz MCUSR.

Ktoś wie co może być powodem takiego dziwnego zachowania?

Nie uśmiecha mi się odpinanie urządzenia od prądu po każdej zmianie ustawień. Poza tym można podejrzewać, że tak samo układ zachowania się po normalnym restarcie przez watchdog. A przecież nie o to chodzi - watchdog ma chronić przez zawieszeniami, a nie zawieszać układ. ;)

Reply to
Atlantis
Loading thread data ...

dziwne rzeczy dzieją się ostatnio z tymi wszystkimi naszymi projektami... do tej pory myślałem, że to przypadek choć miałem świadomość o totalnym sukcesie platformy europejskiej... ale widzę, że Wy też macie jakieś "numery" wałęsy... teraz myślę, że to jednak problem wpływów zewnętrznych...

Reply to
invalid unparseable

To są jeszcze inne trolle, które coś projektują?

Włodek ;-)

Reply to
invalid unparseable

Nie rozumiem, to ten soft do encj nie robi mu reset przy starcie i musiałeś to dodać? Przecież reset przez wdg czy reset po poweron z pkt widzenia softu to inicjalizacja... Miałem podobne problemy z encj, okazało się że pin Vdd nie był przylutowany do pada na płytce, tylko dotykał. Jak się gmerało przy płytce (np. trąciło kabel eth) to encj świrował., co ciekawe led linkon (zielona) paliła się tylko minimalnie słabiej niż jak Vdd stykał "prawidłowo".

Reply to
Marek

W dniu 2014-07-08 01:38, Marek pisze:

Właśnie to jest najdziwniejsze. Procedura inicjująca pracę ENC28J60 zawiera fragment odpowiedzialny za soft reset przez SPI. Przecież po zresetowaniu układu przez watchdoga wsztko leci od nowa i praca układu jest ponownie inicjowana, wykonuje się też reset. Nie wiem więc skąd wzięło się to miganie i dlaczego zniknęło po dodaniu funkcji opóźniającej na początku main(). Nie wiem dlaczego pomimo wszystkich zabiegów po zdalnym resecie tracę łączność z układem...

To na pewno nie to. Układ działał całkowicie poprawnie przez miesiąc lub dwa, zanim zabrałem się za testowanie nowych funkcji programowych. Zmiany są powtarzalne i zachodzą wraz z wprowadzeniem poprawek w kodzie.

Reply to
Atlantis

W dniu 2014-07-08 06:00, Atlantis pisze:

Jak długo trzymasz reset aktywny ?

Adam

Reply to
Adam Górski

Myślisz że ten troll cokolwiek zaprojektował?

Reply to
AlexY

W dniu 2014-07-08 17:27, Adam Górski pisze:

Hmm... Kilkadziesiąt ms? A jak długo powinienem? Istnieje możliwość, że trzymam za długo?

Reply to
Atlantis

jasne, że nic, wszystko ukradł... skąd ty to powcu znasz nie?

Reply to
invalid unparseable

BTW czy reset ENC28J60 w procedurze inicjującej pracę układu jest przeprowadzony prawidłowo?

#define ENC28J60_SOFT_RESET 0xFF (...) enc28j60WriteOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET); _delay_loop_2(0); // 20ms

Reply to
Atlantis

Hmm... Jedno jest pewne, to nie jest problem sprzętowy. Spróbowałem odpalić instrukcję programowego resetu przez watchdoga na drugim egzemplarzu tego samego urządzenia - efekt taki sam. Potem zrobiłem to samo na płytce prototypowej z ENC28J60 i ATmegą 328. Program zachowuje się dokładnie tak samo za każdym razem.

Używam biblioteki Tuxgraphics, a moje urządzenia są wzorowane na schematach płytek z tej strony (MCU taktowany z pinu CLKOUT ENC28J60).

Gdzieś musi być błąd. Tylko jaki błąd może powodować takie zachowanie urządzenia? Po włączeniu zasilania inicjacja przebiega normalnie, ale po resecie przez watchdoga już nie...

Reply to
Atlantis

Użytkownik "AlexY" snipped-for-privacy@irc.pl napisał w wiadomości news:lph7hj$ks2$ snipped-for-privacy@dont-email.me...

<Wiech mode>

Pewne stronkie internetowe... </Wiech>

Reply to
ACMM-033

ENC28J60).

Tak trochę z imnej beczki ale może Cię zainteresuje: do swojej płytki z encj dołożyłem moduł wifi mrf24wg (współdzieli spi z encj) i jeśli chodzi o uzyskane transfery to ten moduł wifi jest bez porównania szybszy niż encj przy połowie prędkości spi (wifi 10Mhz, encj

20Mhz). Pewnie dlatego, że driver do mrf używa przerwań a nie pooling jak encj...
Reply to
Marek

W dniu 2014-07-08 20:40, Atlantis pisze:

Poproszę trochę obszerniej z tym źródłem. Ale bez przesady. Mogę się domyślać że argumenty to opcode,addres,databyte ..... Ale dlaczego enc28j60WriteOp(0xff, 0, 0xff) ? Jakieś maski ? Databyte nie występuje .... czyli

  1. Cs w dół.
  2. byte 0xff
  3. Cs w górę

Czekać na startup.

Ale co robi enc28j60..... to ja nie wiem bo to Twoje dzieło.

Pzdr

Adam

Reply to
Adam Górski

W dniu 2014-07-09 00:18, Adam Górski pisze:

Sama funkcja wygląda następująco:

void enc28j60WriteOp(uint8_t op, uint8_t address, uint8_t data) { CSACTIVE; // issue write command SPDR = op | (address & ADDR_MASK); waitspi(); // write data SPDR = data; waitspi(); CSPASSIVE; }

Makrodefinicja ADDR_MASK to 0x1F

Część odpowiadająca za soft reset układu przy inicjalizacji jest zrobiona prawidłowo? Bo myślałem nawet o przesiadce na uIP, ale tego co widzę, to sterownik ENC28J60 z tej biblioteki ma bardzo podobhnie zrealizowaną funkcję resetu.

BTW Jak powinno się resetować układ za pomocą pinu RESET? Bo próbowałem czegoś takiego:

RSTACTIVE; //makrodefinicja ustawiająca stan niski na odpowiedniej linii _delay_loop_2(0); RSTPASSIVE; _delay_loop_2(0);

W efekcie nawet nie zaświeciła się żadna dioda na gniazdku RJ45...

Reply to
Atlantis

W dniu 2014-07-09 05:57, Atlantis pisze:

Hmm... Tak się przyglądam temu i coś mi tu nie pasuje. W nocie katalogowej ENC28J60 na stronie 28 i 32 podano informację, że za komendę soft resetu odpowiada wysłanie sekwencji ośmiu bitów "1".

Tymczasem wywołanie tej funkcji jako enc28j60WriteOp(0xFF, 0, 0xFF) spowoduje wysłanie 16 "jedynek". Bo najpierw wysyłamy wynik operacji:

0xFF | (0x00 & 0x1F) Co daje 0xFF. Potem jeszcze raz wysyłamy 0xFF.

Czy w takim razie reset nie jest przeprowadzany w zły sposób? A może ja coś pomieszałem?

Reply to
Atlantis

W dniu 2014-07-09 10:19, Atlantis pisze:

Wysyłasz za dużo. Czy to ma znaczenie - nie wiem.

Adam

Reply to
Adam Górski

W dniu 2014-07-09 12:37, Adam Górski pisze:

Ciągle nie to. :/ Spreparowałem funkcję wysyłającą 0xFF. Układ ruszył tak samo jak przedtem, i tak samo zawiesił się po resecie. :/

Swoją drogą jak prawidłowo zresetować sprzętowo ENC28J60? Na jak długo mam ustawić RESET na stan niski? Bo przy _delay_loop_2(0) jakby nie wstawał w ogóle - nie świecą się diody.

Reply to
Atlantis

W dniu 2014-07-09 20:27, Atlantis pisze:

1) Co to znaczy : "się zawiesił". Nie istnieje takie pojęcie. Zawiesić to się może jak zegar zniknie. Wisi gdzieś czekając na coś. Na co ? 2)Gdzieś widziałem w dokumentacji minimum 2us.

Pzdr

Adam

Reply to
Adam Górski

W dniu 2014-07-09 20:50, Adam Górski pisze:

Tak jak mówiłem - po zresetowaniu ATmegi przez watchdoga nie mogę ponownie nawiązać połączenia z układem, a jedna z diod na gniazdku RJ45 (ta, która normalnie świeci cały czas) dość szybko miga. Pomaga dopiero ponowne uruchomienie układu przez chwilowe odcięcie zasilania.

A jest jakieś maksimum? Bo próbowałem resetu sprzętowego, ustawiając pin na stan nisku na kilkadziesiąt-kilkaset ms. Układ w ogóle nie łączył się z siecią - to znaczy nawet nie zaświeciła się żadna dioda.

Reply to
Atlantis

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.