sobota, 30 września 2017

[33.1] Arduino - ENC28J60, DHCP oraz Ping

Ten post chciałbym poświęcić na opisanie sposobu konfiguracji układu ENC28J60 za pomocą Arduino. Post będzie opisywał podstawowy sposób podłączenia układu do Arduino wraz z prostym programem pozwalającym na pingowanie do układu.

[Źródło: https://store.arduino.cc/usa/arduino-uno-rev3]

Podłączenie:


Układ zasilany będzie z 3.3V. Nie ma potrzebny stosowania konwerterów poziomów logicznych ponieważ moduł ENC jak i Arduino przyjmuje sygnały z tego zakresu.

Podłączenie należy wykonać następująco:


  • SO - Pin 12;
  • SI - Pin 11;
  • SCK - Pin 13;
  • CS - pin 8;
  • VCC - 3.3V;
  • GND - GND;

Do obsługi układu wykorzystuje się bibliotekę jaką można pobrać z serwisu github czyli EtherCard. Po jej pobraniu należy ją umieścić w folderze z bibliotekami dla Arduino.

DHCP działa w taki sposób, że wysyłany jest komunikat DHCPDISCOVER , który pozwala na zlokalizowanie serwerów. Następnie z serwera odsyłane jest DHCPOFFER z propozycją adresu dla klienta. Wybiera on dostępny adres po czym przesyła DHCPREQUEST z żądaniem przydzielenia wybranych parametrów. Jeśli następuje potwierdzenie to od serwera przesyłane jest DHCPACK. Możliwe jest też otrzymanie następujących danych:

DHCPNAK - gdy nastąpi odmowa wybranych przez klienta parametrów;
DHCPDECLINE - informacja, że wybrany adres jest już wykorzystywany przez inne urządzenie;
DHCPPRELEASE - zwolnienie adresu siecowego;
DHCPINFORM - przydzielenie danych bez adresu IP;

Cała procedura obsługi DHCP jest wykorzystywana przez bibliotekę.

Programowanie:


Program jaki należy wgrać do Arduino wygląda następująco:

  1. /*
  2.   vcc - 3.3V
  3.   gnd - gnd
  4.   sck - pin 13
  5.   so - pin 12
  6.   si - pin 11
  7.   cs - pin 8
  8. */
  9. #include "EtherCard.h"
  10. static byte macAddr[] = {0x74,0x69,0x69,0x2D,0x30,0x31};  /* Set mac Address */
  11. static byte ipAddr[] = {192,168,1,10};                    /* Set ip Address */
  12. byte Ethernet::buffer[700];                             /* Buffer for data */
  13. void setup ()
  14. {
  15.   Serial.begin(57600);
  16.   Serial.println("Ping to device:");
  17.   /* Start library, need to pass mac address into function */
  18.   if (ether.begin(sizeof Ethernet::buffer, macAddr, 10) == 0){    
  19.     Serial.println( "Can't access to Ethernet controller");
  20.   }
  21.   if(!ether.dhcpSetup()){
  22.     Serial.println("DHCP can't be set");
  23.    
  24.     /* Set Ip Address */
  25.     if (!ether.staticSetup(ipAddr)){                        
  26.     Serial.println("Can't set IP address");
  27.     }
  28.   }
  29.   else
  30.   {
  31.     ether.printIp("IP: ", ether.myip);
  32.     ether.printIp("GW: ", ether.mymask);
  33.     ether.printIp("GW: ", ether.gwip);
  34.   }
  35. }
  36. void loop()
  37. {
  38.   word message = ether.packetReceive();
  39.   /* Get msg from device */
  40.   ether.packetLoop(message);
  41. }

Na początku podawane są dane do połączeń czyli adres mac oraz ip. Kolejnym elementem jest przygotowanie bufora przechowującego odebrane i wysłane dane.

Potem w części setup uruchamiana jest biblioteka. Do niej przekazywana jest informacja odnoście bufora, adresu mac oraz pinu cs. Dalej uruchamiane jest DHCP, bądź w przypadku problemów z połączeniem włączany jest adres statyczny.

W pętli wykonywane są dwie funkcja packetLoop odpowiada na przesłane dane. Do niej podawana jest funkcja odbierająca dane.