ENC28J60 nie działa (a powinien)

Jun 10, 2016 19 Replies

Skleciłem sobie ostatnio płytkę do eksperymentów z PIC32. Na pokładzie siedzi PIC32MX270F256B, ENC28J60, AT45DB641, gniazdko do podłączenia PenDrive'a i parę innych drobiazgów. Zabrałem się za oprogramowywanie poszczególnych elementów i problem pojawił się przy sieci.



Użyłem najnowszej dostępnej biblioteki z MLA od Microchipa (ta z 2013 roku). Zmiany jakie wprowadziłem są kosmetyczne - właściwie tylko tyle, że skopiowałem wyłącznie potrzebne mi pliki i zmodyfikowałem ścieżki w include'ach, dostosowując je do własnej struktury katalogów. Poza tym jest to dokładnie ten sam, standardowy kod. Projekt się skompilował, jednak po wgraniu go do MCU okazało się, że pingi nie wracają, a w tabeli ARP routera nie pojawia się wybrany przeze mnie adres MAC układu. Niemniej komunikacja po SPI działa prawidłowo, a sterownik od ENC raportuje pomyślne zakończenie inicjalizacji po włączeniu zasilania.



Po wykonaniu paru eksperymentów przekonałem się, że chociaż diody na gniazdku RJ45 zachowują się prawidłowo, funkcja MACIsLinked() za każdym razem zwraca false, bez względu na to, czy kabel jest podłączony, czy nie.



A akcie chwilowej desperacji wymieniłem nawet gniazdko RJ45 (standardowy HanRun z trafem) i ENC28J60 - podejrzewając, że któryś z tych elementów może być wadliwy. Przy okazji pomierzyłem ścieżki, w razie gdyby gdzieś było jakieś małe zwarcie, które pominąłem. Niestety, żadna z tych operacji nie przyniosła rezultatu - układ ciągle nie działa.



Połączenia sprawdzałem już kilkanaście razy, zresztą fragment schematu z ENC został przekopiowany z innego, działającego układu. Jedyna różnica jest taka, że tym razem nieco poprawiłem projekt płytki (menadry na liniach różnicowych RX i TX Ethernetu + lepiej umiejscowione rezystory na tych liniach).



Ktoś ma jakiś pomysł? Może jednak mimo wszystko problem jest programowy?


A skąd to założenie, że biblioteka od microchipa nie jest wadliwa?

jp

W dniu 2016-06-10 o 22:04, jacek pozniak pisze:

Bo całe mnóstwo ludzi używa jej w takiej samej konfiguracji sprzętowej?

Kilka kolejnych obserwacji:

1) Wymieniłem prawie wszystkie przyległości ENC i gniazdka RJ45. Na dobrą sprawę z niewymienionych elementów pozostały tylko kondensatory odsprzęgające na VCC oraz te przy kwarcu. 2) Na próbę podłączyłem płytkę bezpośrednio z pecetem za pomocą scrossowanego kabla. Na płytce świeci się zielona dioda, a żółta miga. Na pececie widać miganie żółtej, ale zielona się NIE świeci.

Układ ścieżek wygląda następująco:

formatting link

W dniu 11.06.2016 o 11:44, Atlantis pisze:

Nie wiem jak się zachowuje ENC28j60, ale nie pamiętam już kiedy musiałem stosować scrossowany kabel. Podobna konfiguracja diodek kojarzy mi się kiedy miałem zamieniony zielony z biało-zielonym w jednej wtyczce. Co ciekawe - z jednym switchem to działało (zrywało co jakiś czas, ale można było tego nie zauważyć).

W dniu 2016-06-11 o 13:08, Mirek pisze:

Na zwykłem, niecorssowanym (zresztą fabrycznym) kablu układ zachowuje się dokładnie tak samo.

Zrobiłem już chyba wszystko, co mogłem zrobić:

1) Wymieniłem wszystkie elementy feralnego bloku, za wyjątkiem kilku odsprzęgających na linii VCC. 2) Zwarłem meandry na liniach różnicowych RX i TX. 3) Wylutowałem układ AT45DB641, współdzielący z ENC magistralę SPI. 4) Upewniłem się, czy kwarc się wzbudza. Zarówno licznik częstotliwości jak i oscyloskop pokazują sygnał na pinach OSC2 (25MHz) i CLKOUT (6,25MHz). 5) Upewniłem się, że nie ma zwarć ani przerw. Kilkanaście razy obejrzałem płytkę pod lupą i sprawdziłem miernikiem. 6) W akcie desperacji spróbowałem nawet na szybko przeportować stos Tuxgraphics, z którego korzystałem na AVR-ach. Po uwzględnieniu rzeczy specyficznych dla PIC32, kawałki kodu z Atmegi skompilowały się. Efekt był jednak dokładnie taki sam.

Ktoś ma jakiś pomysł? Może jednak stosowanie meandrów nie było zbyt dobrym pomysłem? Już rezygnacja z mostków po drugiej stronie płytki wiązała się z wydłużeniem ścieżek, a celem zapewnienia miejsca na menadry trzeba było jeszcze bardziej odsunąć ENC od gniazdka. Może jednak lepiej mieć jak najkrótsze ścieżki, nie martwiąc się brakiem idealnej linii różnicowej?

Schemat tutaj:

formatting link

widzisz, nie pomogłeś mi z USB dla PICów...

ale ja Ci spróbuję pomóc - WIRESHARK!!!

a jakby tak podpiąć gotowy modulik z ENC pod SPI? będzie wiadomo, czy wina softu czy może układu...

W dniu 2016-06-12 o 16:37, platformowe głupki pisze:

Wczoraj też mi to przyszło do głowy i w ten sposób udało mi się ustalić, że problem nie jest sprzętowy. Z pomocą jednego z kolegów z grupy (jeszcze raz dziękuję) udało mi się ustalić, że biblioteka do obsługi Ethernetu najwyraźniej gryzie się z biblioteką do USB MSD. Dlaczego? Jeszcze nie mam pojęcia...

W dniu 2016-06-12 o 18:01, Atlantis pisze:

kiedyś ogólną teorię gryzienia stosowało się do wyjaśniania problemów z konfliktami IRQ jak do peceta wsadziło się za dużo kart na ISA'ę ;)

a w temacie - są jakieś sekcje krytyczne w tych libach? dobrze obsłużone?

a.

nie znam tych bibliotek, ale na przykład w stmie to wyraźnie są dołączane jakieś bzdety stdlib... może zdublowałeś jakieś pliki?

Kompilator na pewno mają wadliwy, więc czemu ne bibliotekę? :-)

A do rzeczy, to sprawdziłeś błędy trywialne? Ja ostatnio spędziłem kilka godzin z analizatorem szukając błędów w transmisji I2C, bo najprostszy przecież PCF8574 w przedziwny sposób czasem działał, a czasem nie, a okazało się, że nie podłączyłem mu VDD i był zasilany pasożytniczo. :-/

Pozdrawiam, Piotr

W dniu 2016-06-13 o 13:26, Piotr Wyderski pisze:

Akurat od strony sprzętowej to sprawdziłem go na wszystkie możliwe sposoby. Łącznie z demontażem i ponownym upewnieniem się, czy na pewno pod żadnym układem nie przeoczyłem jakiegoś zwarcia/niedotrawienia. Wymieniłem też wszystkie elementy poza kilkoma kondensatorami odsprzęgającymi. Dopiero podłączenie zewnętrznego modułu z ENC28J60 utwierdziło mnie w przekonaniu, że problem NIE jest sprzętowy.

Jak już pisałem w innym miejscu - okazuje się, że biblioteka od TCP/IP gryzie się z biblioteką USB MSD. Wystarczy, że usunę z pętli głównej wywołanie funkcji USBTask(), a płytka pojawia się w sieci. Jest to o tyle dziwne, że z tego co mi wiadomo ludzie korzystają z tych bibliotek jednocześnie...

Spróbuj zostawić USBTask() ale tak aby nigdy nie była wołana; np. uzależnić wywołanie od jakiejś zmiennej volatile. Jeśli nie będzie układ działał to może być jakiś problem linkera.

jp

W dniu 2016-06-13 o 17:27, jacek pozniak pisze:

main {

volatile uint8_t test = 0; //Sporo innych instrukcji

while { if (test) USBTasks(); //Sporo innych instrukcji //Miedzy innymi funkcje obsolugi stosu TCP/IP } }

Tak wyglądający program działa prawidłowo. Wystarczy jednak, że zmienna test zostanie zdefiniowana z wartością 1, a program się wykrzacza. Tak więc winę musi ponosić coś, co się dzieje wewnątrz tej funkcji.

  1. Optymalizator 'za bardzo' zoptymalizował RAM -spróbuj z innymi ustawieniami.
  2. Ten USBTask wali gdzieś po pamięci (błąd biblioteki)
  3. Albo linker przydzielił te same obszary RAM, to można podglądać w plikach co je linker generuje.

Spróbowałbym pierwszej opcji, na początek jp

W dniu 2016-06-12 o 18:01, Atlantis pisze:

Może Ci ramu brakuje? albo się pokrywają bo któraś bibloteka ma błąd.

W dniu 2016-06-14 o 22:56, janusz_k pisze:

Problem okazał się dużo bardziej kuriozalny. Użyty port SPI oraz USB współdzielą pewien pin, który może pełnić funkcję linii USBID. Ponieważ nie korzystam z funkcjonalności USB OTG, miałem tę funkcję wyłączoną. To znaczy wydawało mi się, że miałem.

W kodzie znalazła się jedna, mała pomyłka. Zamiast "#pragma config FUSBIDIO = OFF" napisałem po prostu "#pragma FUSBIDOO = OFF". O dziwo taka konstrukcja została przyjęta, nie został nawet wygenerowany żaden warning, po prostu fusebit pozostawał w domyślnie ustawionym stanie. W efekcie dochodziło do zakłócenia komunikacji, bo obydwa interfejsy próbowały korzystać z tej samej linii.

No hmm u mnie warning był, ustaw sobie odpowiedni poziom warningów. A może nie szukasz warningów tam gdzie trzeba w Twoim narzędziu.

no to skoro już problem z głowy to czy możemy liczyć na wyliczenie pliczków dokumentacji do USB w PICach i ethernetu w PICach?

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required