Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2014:enc28j60

Ethernet řadič ENC28J60

Milan Kotulek 2015/01/17 13:34


Zadání:

Připojte řadič ENC28J60 k desce FRDM-KL25Z, zprovozněte TCP/IP stack a vytvořte jednoduchý TELNET server, pomocí kterého bude možné příkazy ovládat RGB LED.


Cílem projektu je vytvořit jednoduchý TELNET server. Základním prvkem je vývojový kit FRDM-KL25Z propojený s obvodem ENC28J60 pomocí sběrnice SPI. Ten dokáže komunikovat přes ethernet s PC.

Blokové schéma a zapojení

Zpracování

Projekt byl zpracován v prostředí mbed.ogr. V plánu bylo využití jeho výhod, neboli komunitně vytvářených programů. Našel jsem několik projektů o kterých jsem si myslel, že půjdou využít nakonec však žádný ze zde vytvořených nevyhovovalo. Nejblíže tomu co je cílem tohoto projektu je tento projekt, jenž je obsluhou obvodu ENC28J60. Je založen na autorově knihovně pro ENC28J60 desku. Plně potporuje TCP / IP a UDP připojení jak klienta tak serveru, ARP, ICMP, DHCP a DNS.


S jeho implementací jsem narazil na problém, když jsem ho použil objevila se spousta varování snimiž jsem si nevěděl rady. Zkusil jsem je ignorovat a vyzkoušet zda program něco dělá. Lehce se ztrácím v kódu c++, ale je vidět, že obsahuje kontrolu zda je program v běhu a data jsou posílána. Sprovoznil jsem sériovou komunikaci přes COM a zjištoval kde je problém. Nepodařilo se mi však najít kde je problém. Rozhodl jsem se tak pro psaní vlastního programu.

ENC28J60 komunikuje po rozhraní SPI. Celkově se využívá pouze sedmi instrukcí. Kontroler má však celkem 32 registrů dělených do 4 bank, jež se vybírají nastavením ve dvou nejvýznačnějších registrech ECON1/ECON2. Chtěl jsem tedy využít mbed SDK funce pro SPI implemetované v knihovně mbed.h, ale ikdyž je u ní napsáno „Number of bits per SPI frame (4 - 16)“ tak tomu tak není ( I příručka KL25Z říká, že obsahuje 2 osmibitové porty SPI ) takže se musí posílat po osmi bytech.
Tak jsem zkusil přečíst kontrolní regist jak ukazuje obrázek vlevo. Další problém. Jak něco přečíst? Návod v knihovně doporučuje postup ukázaný níže. Přímo funkce na čtení totiž neobsahuje. Vyzkoušel jsem tedy přečíst hodnoty registrů - měnil jsem adresu a stále nula. Zkusil jsem i zapsat do registrů a přečíst zpět jeho hodnotu, ale nic. Takto se číst nedá, nebo dělám něco špatně, ale nevím co. Nějaký příklad jak se vypořádat s SPI komunikaci jsem hledal, bohužel nenašel. Takže netuším co dělám špatně.

    spi.format(8,0);// Setup the spi for 8 bit data, high steady state clock,
    spi.frequency(1000000);// second edge capture, with a 1MHz clock rate
 
    cs = 0;// Select the device by seting chip select low
    spi.write(0x1F);  // Send 0x1F, the command to read the ECON1 register
 
    int read = spi.write(0x00); // Send a dummy byte to receive the contents of the WHOAMI register
    pc.printf("register read= 0x%X\n\r", read);

Inicializace

Podle datasheetu ENC28J60 je třeba před zahájením komunikace provést inicializaci. Ta se skládá z:

  • Nastavení přijímacího/ vysílacího bufferu - musí se nastavit ERXST a ERXND ukazatele přičemž všechny adresy mezi těmito včetně nich samotných přestavují přijímací buffer. Takto zbylá část paměti představuje vysílací buffer
  • receive filter - nastavením reg. ERXFCON se dá povolit a nastavit přijímací filter. Ten obsahuje šest přednastavených filtrů pro minimalizaci práce kontroleru ( Unicast / Pattern Match / Magic Packet / Hash Table / Multicast / Broadcast )
  • OST - v případě, že je inicializace provedena okamžitě po ztrátě napájení (restartu), bit ESTAT.CLKRDY by měl zkontrolován, pro kontrolu, že uplynul dostatek času než se bude pokračovat se změnou MAC a PHY registrů.
  • nastaveni MAC - Je třeba nastavit několik registrů majících vztah k MAC během inicializace. Přičemž se toto nastavení provede pouze jednou. Mimo jiné se nastavení závisí na tom, zda se použije plně duplexní provoz. Nastaví se i samotná MAC adresa zařízení.

Příjem paketu

Po inicializaci je ještě třeba nastavit bity pro povolení přerušení s příjmem paketu a celkově povolit příjem. Poté již pakety, které projdou filtrem jsou zapsány do kruhové paměti přijímacího bufferu. Ostatní které filtr nepustí jsou ztraceny. Jakmile je přijat a zapsán je reg. EPKTCNT inkrementován, bit EIR.PKTIF nastaven, a je vygenerováno přerušení. Vlevo je ukázán formát zapsaného paketu v paměti. Receive Status Vector informuje o jaký typ se jedná či zda nedošlo k CRC chybě atd. Samotná data následují a obsahují adresy komunikujících, informaci o délce, typu dat a data samotná.

Čtení přijatých dat by normálně mohl hostitelský řadič provést použitím příkazu RBM SPI a začít číst od Next Packet Pointer. Uloží si výše zmíněné údaje jenž paket obsahuje. Pokud je nastaven bit ECON2.AUTOINC, je možné postupně přečíst celý paket bez úpravy registru ERDPT. Přičemž ukazatel čtení automaticky skočí na konci kruhové přijímací paměťi na začátek. V případě, že je potřeba náhodný přístup k paketu, je nutné ručně vypočítat správné ERDPT. Je třeba dávat pozor aby jeho hodnota nebyla vyšší než je velikost přijímací vyrovnávací paměti omezená nastavením ERXND-po-ERXST.


Závěr

Při tvorbě tohoto projektu mě zastavila neznalost C++ a obsáhlost nastavení ENC28J60. Podařilo se mi vše zapojit a propojit. Dále jsem chtěl využít výhod online prostředí mbed a to komunitního vývoje, ale program zde již napsaný pro ovládání ENC28J60 je tak složitý, že jsem ho se svou skromnou znalostí C++ nedokázal upravit do provozuschopné podoby. Měl jsem se radši pustit do vlastního projektu od začátku v offline prostředí s čistým C jazykem. Takto jsem prostudoval nastavení řadiče, ale nestihl jsem přijít na to, jak zprovoznit SPI. A bez toho se nedá hnout.


2014/enc28j60.txt · Poslední úprava: 2015/01/18 19:04 autor: Milan Kotulek