Zákeřnost ethernetového modulu Arduino Nano ENC28J60

Všichni ho známe – jednoduchý modul ve formátu Arduino Nano s notoricky známým chipem ENC28J60. A přesto dokáže tento modul překvapit.

To si takhle koupíte, po výborných zkušenostech s knihovnou UIPethernet, nic zlého netuše, takovýhle modul a těšíte se na ethernetování. A nestačíte se divit.

V mém případě se výrobce podepsal jako DeekRobot, který dokonce na svých stránkách uvádí pinout modulu.

nano-ethernet-shield-deek-robot

 

 

 

 

Použité SPI signály jsou zcela jasné, odpustíme i to, že dodavatel zapoměl označit GND.

Nicméně, pak modul použijete ve spolupráci s modulem Arduino Nano v.3, u kterého je pro naši aplikaci použit i pin D2, alias INT0. Jako na potvoru moje aplikace toto hardwarové přerušení používala. A po vytvoření „piggybacku“ tohoto modulu s Arduinem Nano fungovat přestala. Respektive přesněji, začala fungovat výrazně nestabilněji.

Problém je totiž v tom, že prakticky všechny takovéto moduly obsahují nedokumentovaný hardwarový vybastl dle tohoto obrázku.

0955_SchemaNavíc ještě ne vždy stejný, existují moduly, které blokují piny D2 i D3 (tedy obě hardwarová přerušení, INT0 i INT1), což dokonce není ani namalováno na obrázku. Jiné šarže těchto modulů alespoň nemají zapojené hradlo, obsluhující signál WOL, takže nám milostivě INT1 ponechají. Zapojení jsem pochopil jako obyčejný konvertor úrovní 3,3 V na 5 V logiku pro sinály INT (interrupt z ethernetové beruše, vstup INT0 Arduina) a WOL (wakeup on LAN, vstup INT1). Ze zkušenosti mohu říci, že většina dodaných modulů má zapojenu jen část pro INT, část pro WOL zapojena nebývá.

Knihovna UIPethernet ani jeden z těchto signálů stejně nepoužívá. Nicméně, při snaze o jeho použití z vaší aplikace dojde k hardwarové kolizi. Bohužel neřešitelné, protože použitý obvod 74HCT08 má výstup push-pull a tím pádem stav signálu definuje v obou úrovních. Nemusím snad zdůrazňovat, že hardwarová kolize na hardwarovém interruptu se debuguje docela blbě.

Takže při návrhu takto koncipovaného zařízení máte dvě možnosti:

  • Obětovat jeden, vcelku užitečný pin procesoru a vyhnout se mu v aplikaci, ponechat jej připojený k modulu, i když je to k ničemu. Záleží na aplikaci. Softwarově ten pin (INT0) přepněte raději do režimu vstupu. Jedno hardwarové přerušení vám zbylo.
  • Upravit ethernetový modul odpájením nožky 3 (případně i nožky 6) obvodu 74HCT08 od jeho destičky. Funkčnost knihovny UIPethernet to nijak neovlivní a pokud odpojení provedeme čistě, lze modul kdykoli navrátit do původního stavu.

Komu se nechce pižlat se s odpájením nožičky ’08ičky, může použít i „brute force“ řešení s přerušením cestičky na desce modulu na francouzský způsob

en28j60-module-cut-the-trace

Credits: https://forum-photovoltaique.fr/memberlist.php?mode=viewprofile&u=1030054&sid=75e151dfbc7ce96f8368c16e7eec22b5

 

 

 

 

 

 

 

 

 

 

Škoda, že u většiny levných čínských modulů dokumentace buď chybí zcela, nebo je neúplná, či zavádějící. Dokáže to připravit i vcelku horké chvilky.