Blog 8: W5500 ethernet interface en level shifting

Jan-Jelle Huizinga is een enthousiaste techneut en oud-student van Hogeschool Dirksen. Hij laat een nieuw huis bouwen. In zijn blog vertelt hij hoe hij zelf de domotica-installatie voor de ledverlichting voor de nieuwbouw maakt.

Weer een maand voorbij, wat gaat de tijd snel! Ondertussen is onze woning weer een stukje verder gevorderd. De wanden zijn gemetseld en het dak zit erop! Snel wind- en waterdicht maken voordat de vrieskou komt, zodat ze binnen verder kunnen.

De ontwikkeling van het domotica systeem gaat ook verder en ik ben bezig met de tweede versie van de printplaat. De eerste versie functioneerde volledig, maar er zaten nog wat schoonheidsfoutjes in die er nu uitgehaald worden. In deze blog ga ik in op de netwerkverbinding die gerealiseerd is op de printplaat met de microcontroller.

Ethernetverbinding
In blog 4 heb ik het MQTT protocol toegelicht. Zoals uitgelegd werkt dit protocol met een relatief kleine voetafdruk aan code, over een TCP/IP netwerk zodat zelfs kleine microcontrollers ermee overweg kunnen. Maar hoe werkt de fysieke en datalink laag van deze verbinding eigenlijk? Het protocol is opgebouwd uit onder andere software, code en drivers. Uiteraard weer open-source. Deze code heb ik dus niet zelf geschreven (veel te moeilijk), maar maak ik gebruik van bestaande bibliotheken met code om het MQTT protocol te implementeren. Echter enkel het protocol is niet voldoende. Het feitelijke netwerk waar MQTT over wordt gestuurd is net zo belangrijk. Omdat MQTT gebaseerd is op een TCP/IP netwerk dient er dus ook een IP adres gekoppeld te worden aan het systeem, zodat deze gevonden kan worden in het netwerk. Een aparte controller, de W5500, verwerkt het IP adres en de verdere data. 

W5500 en de Serial Pheriperal Interface (SPI)
Gezien dit hele feestje begon met het prototypen met Arduino, gebruik ik een Ethernet prototyping board van Arduino zelf; de Ethernet shield 2. Dit board heeft een W5500 chip aan boord en dat is dan ook precies de reden dat ik deze chip zelf ook gebruik op mijn eigen printplaat. Zo kan ik de standaard bibliotheek gebruiken van Arduino #include <Ethernet2.h> en de MQTT bibliotheek #include <PubSubClient.h>. 

Zoals uitgelegd in de vorige blog wordt de SPI verbinding zowel gebruikt voor de ICSP header als voor de ethernet verbinding. Daarom is de bibliotheek #include <SPI.h> ook van belang.

Wil je hierover meer weten? Klik dan onderaan deze blog even terug naar blog 7 voor een refresher :).

De W5500 chip is dus via de SPI verbinding aangesloten op de microcontroller. De verdere instellingen gebeuren in de software voor de microcontroller. De W5500 is een vast geprogrammeerde chip waar je verder niks aan hoeft, of kunt, wijzigen.

In de microcontroller stel je een aantal settings in:

  • een MAC adres voor de W5500. Dit moet een uniek adres zijn wat je aan de controller geeft, maar in dit geval geef ik een algemeen adres op wat waarschijnlijk elders in de wereld al wel in gebruik is (niet doorvertellen hè.....);
  • een IP adres voor de W5500. Dit IP adres is statisch binnen het netwerk waar de controller is;
  • een IP adres van de domotica server. Dit is het IP adres van de raspberry PI waar de domotica server op draait.


PCB layout en Level Shifting voor de SPI bus
Wat betreft de aansluitingen op de W5500 ethernet interface, dat lijkt in eerste opzicht heel wat.

Maar dit is feitelijk een kopie van de PCB layout welke op de Arduino Ethernet shield zit. Na wat verder zoeken, kom je uit op de hardware datasheet van de fabrikant zelf welke eigenlijk ook identiek is. Hier is dus niet heel veel aan te doen verder. Zoek de (technische) verschillen...

Level shifting
Wat wel nog een leuk is om even onder de loep te nemen is ‘level shifting’. Binnen de verschillende families processoren worden verschillende spanningsniveaus gehanteerd. Binnen de TTL groep, ofwel Transistor – Transistor – Logic, wordt een spanningsbereik van 0 – 5V gehanteerd. Tegenwoordig wordt veelal CMOS gebruik, wat ook op een lager spanningsniveau kan werken. Een veel gebruikte spanning is 3.3V. Hoe lager de spanning, hoe minder vermogen er wordt opgenomen in de chips, wat met de toenemende processor snelheden wel wenselijk is. Tegenwoordig gaat een processor intern tot 1.8V voor de digitale logica. Afijn, hartstikke leuk allemaal maar wat heeft dit met de W5500 te maken? 

Spanning
De Wiznet W5500 chip werkt met een voedings- en logicaspanning van 3.3V waar de Atmega 328P (de microcontroller in kwestie) nog met 5V logica werkt. Om deze twee te laten communiceren moeten de spanningen uit de microcontroller omgezet worden van 5V naar 3.3V. Doe je dit niet, dan bestaat er een grote kans dat de W5500 het begeeft. Omdat de spanningsniveaus bepalen wat een logische ‘0’ of logische ‘1’ is, is het niet nodig om de spanningen van de W5500 van 3.3V naar 5V om te zetten naar de microcontroller. De microcontroller ziet bij een voedingsspanning van 5V een signaal van 3V nog als logische ‘1’. 

De SPI verbinding tussen de microcontroller en de ethernetcontroller bestaat uit vier verbindingen:

  1. MOSI: Master Out, Slave In. Ofwel de Transmit verbinding vanuit de master.
  2. MISO: Master In, Slave Out. Ofwel de Receive verbinding vanuit de master.
  3. SCK: dit is het kloksignaal van de timing van de bits (voor de oplettende lezer; het is dus een synchrone verbinding, omdat de master en de slave op dezelfde timing de bits inlezen en versturen).
  4. SS: Slave Select. Omdat de SPI bus maar met 1 slave tegelijk kan communiceren, moet de verbinding naar de betreffende slave naar een logische ‘0’ gezet worden om de SPI bus te mogen gebruiken.

Om deze spanningsniveaus om te zetten zijn er verschillende manieren. Een simpele weerstandsdeling zou in principe moeten werken, maar ik heb gekozen voor een wat meer fancy oplossing; de non-inverterende buffer. De wat?

Non-inverterende buffer
Het woord buffer kom je uiteraard wel vaker tegen en houdt dus in dat er iets onthouden of bewaard wordt. In dit geval een bitje. De buffer krijgt een bit en onthoudt deze, tot hij de bit weer moet doorgeven. Het non-inverterende gedeelte houdt simpelweg in dat de buffer een logische ‘1’ ook weer doorgeeft als logische ‘1’. een inverterende buffer geeft een logische ‘1’ weer door als een logische ‘0’ en vice versa. Niet zo spannend dus. De buffer die ik gebruik, is overigens ook gebruikt in de ethernet shield van de Arduino (beter goed gejat dan slecht bedacht). Het is het type NC7SZ125.

Zoals hierboven beschreven is deze buffer uitermate snel (2.6 nano seconden, 0.0000000026 seconden, probeer dat maar eens te tellen), 1 kanaals, en mag een ingangssignaal van 5V ontvangen en stuurt uit met 3.3V. Ideaal geschikt dus voor level shifting. Deze buffer wordt op 2 van de 4 verbindingen aangesloten op mijn PCB: de MOSI (omdat dit de 5V sturende lijn is uit de microcontroller) en de SCK. Omdat dit de klok is die ook door de master wordt uitgestuurd. De MISO mag, zoals uitgelegd, op 3.3V communiceren en de SS heeft geen level shifting nodig. 

Hardware beveiligingen
De volgende keer wil ik een wat luchtiger onderwerp bespreken, namelijk de hardware beveiligingen. Ik heb het al een aantal keer gehad over de risico's, dus het wordt tijd dat we kijken naar dit gedeelte.

Tot dan!

Lees ook de eerder verschenen blogs van Jan-Jelle:
Blog 1: Nieuwe resultaten bij ROV SCADA-systeem afstudeerproject
Blog 2: Domotica en waarom ik het graag wil toepassen
Blog 3: Specificaties, prototyping en dimmen van mijn nieuwe ledverlichting
Blog 4: MQTT en de aannemer
Blog 5: Galvanische scheiding, van spartelende kikkerpoten tot brandende ledlampen
Blog 6: Beveiliging van elektronica, randapparatuur, kabels en gebruiksgemak
Blog 7: In-circuit Serial Programming, ofwel ICSP