Witam.
Podłączyłem dzisiaj układ ENC28J60 korzystając ze schematu i programu dostępnego tutaj: http://tuxgraphics.org/electronics/200606/article06061.shtml .
W programie zmieniłem jedynie konfigurację portów. Wszystko działa, jednak układ gubi pakiety i to całkiem sporo, ok. 15%.
Wywaliłem z pętli głównej niepotrzebne rzeczy, zostawiłem jedynie odpowiedź na ICMP i ARP. W celach testowych włączyłem UART oraz przerwania w ENC28J60 i uaktywniłem zewnętrzne przerwanie w AVRze. W chwili otrzymania pakietu następuje przerwanie, które zliczam. Przy pingowaniu co sekundę dioda LEDB mruga równo co sekundę, natomiast przerwanie nie występuje za każdym razem, tylko w około 85% przypadków.
Co może być przyczyną tego, że pakiety są gubione, nie pojawiają się w buforze, natomiast dioda sygnalizująca ruch mruga?
Schemat: http://tuxgraphics.org/common/src2/article06061/eth-remote-device.pdf
U mnie ATMega32 jest zasilana z 5V (ENC toleruje 5V na wejściach). i nie ma zabezpieczenia przed EMI (środki transformatora od strony wyjściowej nie są podłączone, w dokumentacji ENC jest wspomniane o połączeniu obu środków przez rezystory 75ohm do masy przez wspólny kondensator 1nF/2kV).
Transformator jakiego użyłem to TEM-300D-J (dostępny w TME); Interfejs na płytce stykowej:
Przewody: AVR-ENC ok. 7-9cm, ENC-separator ok. 3-5cm, separator-gniazdo ok. 6-7cm, gniazdo-switch - próbowałem trzech, od kilkunasto-centymetrowego patchcorda po 40-metrowy - za każdym razem tak samo, strata ~15%.
EDIT: pominałem transformator, połączyłem (T|R)D(+|-) bezpośrednio z gniazdem 8p8c - problem nadal występuje.
Dodano po 2 [godziny] 54 [minuty]:
Po długiej walce i frustracji znalazłem rozwiązanie - napisze je tutaj, może się komuś przyda.
Problem był spowodowany błędem w projekcie scalaka. Automatyczne wykrywanie polaryzacji nie działa jak należy (jest o tym napisane w erracie) i nie dogaduje się za dobrze z moim domowym routerem gubiąc pakiety. Wystarczyło zamienić sygnały TPIN+ i TPIN-.
Dodatkowo znalazłem też inny błąd związany z wyjściem CLKOUT, z którego taktowałem procka. W erracie wspomnieli, że wyłącza się w trybie uśpienia. U mnie dodatkowo zaczyna świrować po kilku minutach pracy układu, po jakiejś większej ilości odczytów z rejestrów. Zatrzymuje się całkiem lub zawiesza na chwilę - nie polecam taktowania mikrokontrolera z tego wyjścia. Przy własnym taktowaniu pojawia się inny problem również opisany w erracie - mogą występować problemy w komunikacji SPI przy zegarze <8MHz i zalecane jest taktowanie z CLKOUT
.
Podłączyłem dzisiaj układ ENC28J60 korzystając ze schematu i programu dostępnego tutaj: http://tuxgraphics.org/electronics/200606/article06061.shtml .
W programie zmieniłem jedynie konfigurację portów. Wszystko działa, jednak układ gubi pakiety i to całkiem sporo, ok. 15%.
--- 192.168.1.50 ping statistics ---
151 packets transmitted, 127 packets received, 15% packet loss
round-trip min/avg/max = 1.156/1.197/2.154 msWywaliłem z pętli głównej niepotrzebne rzeczy, zostawiłem jedynie odpowiedź na ICMP i ARP. W celach testowych włączyłem UART oraz przerwania w ENC28J60 i uaktywniłem zewnętrzne przerwanie w AVRze. W chwili otrzymania pakietu następuje przerwanie, które zliczam. Przy pingowaniu co sekundę dioda LEDB mruga równo co sekundę, natomiast przerwanie nie występuje za każdym razem, tylko w około 85% przypadków.
Co może być przyczyną tego, że pakiety są gubione, nie pojawiają się w buforze, natomiast dioda sygnalizująca ruch mruga?
Schemat: http://tuxgraphics.org/common/src2/article06061/eth-remote-device.pdf
U mnie ATMega32 jest zasilana z 5V (ENC toleruje 5V na wejściach). i nie ma zabezpieczenia przed EMI (środki transformatora od strony wyjściowej nie są podłączone, w dokumentacji ENC jest wspomniane o połączeniu obu środków przez rezystory 75ohm do masy przez wspólny kondensator 1nF/2kV).
Transformator jakiego użyłem to TEM-300D-J (dostępny w TME); Interfejs na płytce stykowej:
Przewody: AVR-ENC ok. 7-9cm, ENC-separator ok. 3-5cm, separator-gniazdo ok. 6-7cm, gniazdo-switch - próbowałem trzech, od kilkunasto-centymetrowego patchcorda po 40-metrowy - za każdym razem tak samo, strata ~15%.
EDIT: pominałem transformator, połączyłem (T|R)D(+|-) bezpośrednio z gniazdem 8p8c - problem nadal występuje.
Dodano po 2 [godziny] 54 [minuty]:
Po długiej walce i frustracji znalazłem rozwiązanie - napisze je tutaj, może się komuś przyda.
Problem był spowodowany błędem w projekcie scalaka. Automatyczne wykrywanie polaryzacji nie działa jak należy (jest o tym napisane w erracie) i nie dogaduje się za dobrze z moim domowym routerem gubiąc pakiety. Wystarczyło zamienić sygnały TPIN+ i TPIN-.
Dodatkowo znalazłem też inny błąd związany z wyjściem CLKOUT, z którego taktowałem procka. W erracie wspomnieli, że wyłącza się w trybie uśpienia. U mnie dodatkowo zaczyna świrować po kilku minutach pracy układu, po jakiejś większej ilości odczytów z rejestrów. Zatrzymuje się całkiem lub zawiesza na chwilę - nie polecam taktowania mikrokontrolera z tego wyjścia. Przy własnym taktowaniu pojawia się inny problem również opisany w erracie - mogą występować problemy w komunikacji SPI przy zegarze <8MHz i zalecane jest taktowanie z CLKOUT