Embedded Ethernet s Wiznet
Embedded Ethernet s Wiznet
![](/upload/project/3921/cover105.jpg)
Úvod
Poslední dobou se vývojáři elektroniky stále častěji a častěji potýkají s požadavkem připojit malé elektronické zařízení k Ethernetu, resp. rovnou k Internetu. Moderně se tomu říká IoT – Internet věcí. Já mám konkrétně na mysli elektronické zařízení, ve kterém neběží Linux nebo jiný sofistikovaný operační systém. Jedná se tedy o elektroniku osazenou spíše menším (třeba i low-cost 8bitovým) mikrokontrolérem, ale klidně to může být i 32bitový ARM. Ke splnění tohoto požadavku existuje mnoho cest a nabídka integrovaných obvodů i hotových modulových řešení od různých výrobců je opravdu veliká. Zde uvedu jen krátký přehled zdaleka ne všech možností řešení (viz tabulka 1). Vybral jsem čistě jen obvody (žádné hotové moduly), které disponují už i fyzickou vrstvou (PHY), takže není potřeba řešit další obvod rozhraní MII.
Osobně mám zkušenosti s MCF5223X, CC3200, lehce CC3100 a nejnověji s W5500. V tomto článku bych rád popsal práci s naposled zmiňovaným obvodem W5500 od firmy Wiznet.
Co umí W5500
Obvod rozhraní W5500 zvládá 10/100Base-T a disponuje i fyzickou vrstvou, takže k samotnému obvodu stačí připojit transformátor, konektor RJ-45 a jsme na Ethernetu (i na Internetu). Na druhé straně (obvodu) máme k dispozici standardní rozhraní SPI. Výrobce deklaruje, že je to hardwired TCP/IP, to znamená, že by uvnitř neměl běžet žádný „ARM“. Z dalších základních vlastností obvodu bych rád zmínil:
- 8 paralelních nezávislých socketů,
- TCP, UDP a RAW MAC mód,
- 32 kB vnitřní paměti.
Uživatel má nad obvodem plnou kontrolu díky vysokorychlostnímu SPI rozhraní. Výrobce deklaruje spolehlivou rychlost až 33,3 MHz. Já používám bez problémů rychlost 12,5 MHz (rychleji mi to neumožňuje použitý host procesor). Nicméně i touto rychlostí lze přenést 1 kB dat za necelých 700 μs. Na stejném SPI rozhraní může být připojené pochopitelně i další zařízení, díky pinu CS, kterým se obvod aktivuje pro komunikaci. Další užitečnou věcí je systém přerušení, pomocí kterého je host procesor informovaný o událostech v obvodu, aniž by použil SPI komunikaci. Přenosovou rychlost na Ethernetu (10 nebo 100) je možno zvolit buď manuálně, nebo to ponechat na obou stranách, ať se domluví. Po počáteční inicializaci obvodu, jako je režim, IP a MAC adresy, přerušení a nastavení samotných socketů, je obvod připravený komunikovat.
Zapojení
Připojení obvodu k Ethernetu je otázkou několika diskrétních součástek, transformátoru a konektoru, ev. konektoru s transformátorem. Výrobce uvádí na svých stránkách několik referenčních zapojení, takže toto není potřeba nijak zvlášť rozebírat. Za zmínku snad stojí zapojení pinů 43 až 45, kterými se nastavuje mód. Piny mají interní pull-up, takže pokud chceme nechat auto-negotiation mode, tak je nemusíme vůbec zapojovat. V referenčním schématu jsou ale tyto piny připojené přes 10kΩ rezistor na VCC. Toto je nutné jen v případě velké odolnosti vůči EMC. Obdobně to platí i pro nepoužité piny 38 až 42 a 23 (potvrdil mi to expert přímo z Wiznetu).
Teoreticky by stačilo celý obvod připojit k hostovi jen třemi vodiči (SCLK, MISO a MOSI), ale to bych opravdu nedoporučoval. Užitečné je připojit k hostu i tyto další vodiče:
- RSTn kvůli inicializaci obvodu,
- INTn je vhodné použít pro indikaci událostí v obvodu, aniž bychom museli komunikovat přes SPI,
- SCSn v případě, že je více zařízení na SPI rozhraní, ale i kvůli zrychlení přenosů dat z/do obvodu (vysvětleno následovně).
Normálně je pin SCSn chip select pro SPI komunikaci. Tady má ale mimo to i hlubší význam, a to ten, že určuje celkovou délku komunikačního rámce. Pokud by pin SCSn nebyl zapojený, může obvod komunikovat jen v režimu FDM (Fixed Length Data Mode), kde může být počet přenášených dat 1, 2 nebo 4 byty. Pro inicializaci komunikace je přitom potřeba poslat ještě na začátku 3 byty (2 byty adresa a 1 byt je řídicí). To by nám tímto narostla komunikace pro transfer 4 bytů ještě pokaždé o 3 byty režie. Pokud bychom potřebovali nastavovat nějaké registry, tak to samozřejmě není až takový problém, ale v případě transferu dat by se nám komunikace hodně „prodražila“. To je samozřejmě v obvodu vyřešeno tím, že pin SCSn je použitý pro „orámování“ komunikace a obvod komunikuje, dokud je pin SCSn aktivní (log 0). To je režim VDM (Variable Length Data Mode). Čtení a zápis dat potřebuje nastavit jen počáteční adresu, a v podstatě dokud běží hodiny (a je aktivní SCSn), tak obvod kontinuálně posílá pinem MISO data.
Doporučené pracovní napětí obvodu je 3,3 V. Výrobce nicméně garantuje toleranci signálových pinů i na 5 V. Takže nebude problém připojit W5500 k mikrokontroléru, který je napájený 5 volty bez přizpůsobovačů napětí (voltage level translator), což výrazně zlevní konstrukci.
Připojení dalších věcí, jako je krystal, blokovací kondenzátory atd., je standardní záležitostí každého vývojáře, kterou není potřeba hlouběji rozebírat. Přiložený obrázek ukazuje standardní zapojení, kde je použitý konektor RJ-45 s transformátorem a indikačními LED pro Link a Activity.
Funkce
Nastavte si socket na požadovanou funkci a ono to funguje! Ano, je to opravdu jednoduché. Nicméně zkusím ve zkratce popsat funkci, co se týče komunikace přes SPI a taky Ethernet.
Celkový pohled na obvod
Jako každé jiné zařízení na ethernetové síti i W5500, pokud na ní chce právoplatně existovat, musí mít přidělenou linkovou adresu (MAC) a IP adresu. Tyto adresy se musí nastavit, aby zařízení mohlo být v síti identifikováno. Výjimkou by mohla být multicasting komunikace, to je ale záležitost socketu, který bude do režimu multicasting nastaven.
Paměť W5500 je rozdělená do bloků. Obvod má celkem 8 paralelních nezávislých socketů a každý socket zabírá 4 bloky. Celkem je tedy paměťový prostor obvodu (prostor registrů) rozdělený do 32 bloků. Každý socket má oblast registrů pro nastavení, pro RX buffer a pro TX buffer. Nastavení čehokoliv je zápis do registru v daném bloku na určité adrese a opačně, čtení dat nebo nastavení je opět jen čtení registru z určité adresy v některém z bloků. Nultý blok mají sockety nevyužitý, s výjimkou prvního socketu, ten ve svém nultém bloku obsahuje globální nastavení celého obvodu (Common Register Block).
Přijímací a vysílací buffery mohou mít přidělenou paměť dle potřeby. Celkem je pro přijímací buffer vyčleněno 16 kB paměti a stejné množství i pro vysílací (dohromady 32 kB). Každý socket má implicitně nastaveny 2 kB pro příjem i vysílaní. Pro 8 socketů je to plných 16 kB na příjem a dalších 16 kB na vysílaní (víc paměti není). Nicméně pokud to situace vyžaduje, můžeme pro některý socket paměť zvýšit (tím ale ubereme jinému socketu). Každý socket může mít zvlášť nastavený RX a zvlášť TX buffer ve velikostech 1, 2, 4, 8 a 16 kB. Celkem však součet musí být maximálně 16 kB pro RX a stejně pro TX. Jestliže tedy budeme očekávat příjem většího objemu dat, můžeme klidně socketu přidělit i 16 kB paměti, ale pro ostatní sockety už nezbyde nic, takže musí zůstat zavřené.
Funkce socketu v UDP
Nastavíme socket do módu UDP a následně přečteme ze status registru, že socket již v módu UDP je. Pokud není, čekáme až bude (můžeme číst status registr cyklicky). Nastavit je potřeba nejen mód socketu, ale taktéž port, na kterém se bude komunikovat. Stavový diagram (viz obr. 3) stručně ukazuje, jak komunikovat v UDP módu při jednosměrné komunikaci – příjem dat.
Funkce socketu jako TCP serveru
Socket v režimu TCP serveru je vlastně v pozici naslouchání a v případě přijatého dotazu (requestu) jej zpracuje a případně odpoví. Samozřejmě bude záležet na protokolu vyšší vrstvy, jak samotná data zpracovat. Já jsem používal protokol HTTP – takže klasický web server. Komunikace je podobná výše uvedené pro UDP mód. Rozdíl spočívá v tom, že po přijetí dotazu server odpovídá zápisem do TX bufferu a dalších potřebných registrů. Dále v TCP módu má stavový registr socketu více stavů, na které je potřeba příslušně reagovat:
- SOCK_CLOSED (socket je zavřený), je potřeba ho otevřít,
- SOCK_INIT (socket je inicializovaný), nutno ho uvést do stavu naslouchání (listen),
- SOCK_LISTEN (socket naslouchá),
- SOCK_ESTABLISHED (spojení navázáno), v obou případech můžeme kontrolovat stav RX bufferu, zda jsou přijatá nějaká data,
- SOCK_CLOSE_WAIT (čekání na zavření), můžeme ho zavřít = spojení (relace) ukončeno.
TCP komunikace je již mnohem sofistikovanější než UDP. Tady se vytváří spojení, poté se komunikuje. No a tady nastává trošku problém, protože pokud se k socketu připojí jeden klient, další má smůlu a již se nepřipojí. Jiný klient se může připojit až v případě, že je socket v režimu listen. To se dá vyřešit otevřením více socketů (máme jich k dispozici 8). Eventuálně je možné po nějaké době nečinnosti socket jednoduše odpojit (ukončit relaci) a uvolnit jej dalšímu klientovi.
Aplikace
Tak jako všude jinde, i do divadel pronikají moderní technologie. Konkrétně se jedná o řízení osvětlení a světelných zařízení (pohybové hlavy atd.). V dnešní době se světelná zařízení už neřídí jen klasickým multiplexem DMX-512 po lince RS-485. Používají se bezdrátové technologie a v čím dál větší míře Ethernet.
Cílem tohoto projektu bylo vytvořit pokud možno malé elektronické zařízení pro firmu vyrábějící světelnou techniku (nejen) pro divadla. Účelem je, aby vyvinutý modul převáděl speciální osvětlovací ethernetové protokoly na klasický protokol pro řízení osvětlení DMX-512 na fyzické vrstvě RS-485 (resp. obecně na UARTu). Konkrétně se jedná o nejvíce používané ethernetové protokoly Streaming ACN (vyvinuto asociací ESTA) a ArtNet (vyvinuto panem Howellem a jeho firmou Artistic Licence Engineering Ltd).
Jako host mikrokontrolér je použitý Freescale Kinetis (32 bit ARM Cortex-M4). Ten na straně jedné obstarává celou funkci obvodu W5500 a na straně druhé „sedí“ na SPI komunikaci (jako slave) a je připravený komunikovat s nadřazeným systémem. Obě desky (viz obr. 4) jsou k sobě připojeny 10 piny a uživatel může desku umístit přímo s konektorem na zadní panel přístroje. Nadřazený systém se připojí pomocí 10pinového FL konektoru, kde je potřeba přivést napájení 3,3 V pro celý modul a dále je tam vyvedeno rozhraní SPI a vysokorychlostní UARTy (Rx a Tx).
V této aplikaci jsou v obvodu W5500 použity jen dva sockety. První pro příjem výše zmiňovaných dat na protokolu UDP a druhý slouží jako web server. Web server slouží pro zobrazení stavu, ale i pro nastavení modulu. Ačkoli modul může být nastavený z nadřazeného systému přes sběrnici SPI, lze ho nastavit taktéž přes obyčejný webový prohlížeč (viz obr. 5). Díky tomu může modul (po připojení napájení) fungovat i samostatně – bez nadřazeného počítače.
Konstrukce modulu je záměrně kvůli univerzálnosti dvoudesková. Hlavní deska obsahuje W5500 a Kinetis, druhá potom ethernetový konektor (speciální RJ-45). Druhou desku lze nahradit za desku s přidaným rozhraním RS-485 a modul může pracovat jako stand-alone převodník. Modul se umístí přímo na zadní (či přední) panel zařízení pomocí osazeného konektoru.
Závěr
Integrovaný obvod W5500 je jednoduše použitelný obvod za příznivou cenu. Otvírá cestu k Internetu i vývojářům s opravdu malými znalostmi protokolů z rodiny TCP/IP. Svým poměrně malým „footprintem“ se hodí i pro použití v miniaturních aplikacích s low-end mikrokontrolérem. Výrobce nabízí množství evaluation kitů a finálních výrobků.
Mnou vyvinutý modul by se po hardwarové stránce mohl považovat za zcela univerzální produkt. Co se týče softwaru, je naprogramovaný jednoúčelově pro převod dedikovaných ethernetových protokolů do speciálního UARTu. Navíc disponuje web serverem, který je taktéž naprogramovaný přímo pro osvětlovací těleso Asterion II.