Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2014:enc28j60

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
2014:enc28j60 [2015/01/18 15:55]
Milan Kotulek
2014:enc28j60 [2015/01/18 19:04] (aktuální)
Milan Kotulek
Řádek 12: Řádek 12:
 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. 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 ===== +===== Blokové schéma ​a zapojení ​=====
-{{ :​2014:​enc28j60.png?​400 |}}+
  
 +{{ :​2014:​enc28j60:​2015-01-17_15.35.53.jpg?​200|}}{{ :​2014:​enc28j60:​block_schema_enc28j60.png?​400 |}}
 ===== Zpracování ===== ===== Zpracování =====
 Projekt byl zpracován v prostředí [[http://​developer.mbed.org/​|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 [[http://​developer.mbed.org/​users/​hudakz/​code/​HTTPServer_Echo_ENC28J60/​|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. Projekt byl zpracován v prostředí [[http://​developer.mbed.org/​|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 [[http://​developer.mbed.org/​users/​hudakz/​code/​HTTPServer_Echo_ENC28J60/​|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.
Řádek 20: Řádek 20:
 \\ 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. \\ 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.
  
-{{:​2014:​enc28j60_spi.png?​100 |}} +{{:2014:enc28j60:​enc28j60_spi.png?​150 |}} 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
-\\ 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 taky 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í.  +\\ {{:2014:enc28j60:​spi_read.jpg?​150 |}} 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 ​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ě.
-{{:​2014:​spi_read.jpg?​100 |}} +
-Dovolí zapisovat jen 8 bitů. ​Tak jsem zkusil přečíst kontrolní regist jak ukazuje obrázek vlevo. Další problém. Jak něco přečíst? ​přímo funkce na to není a návod ​v knihovně doporučuje postup ukázaný níže. Vyzkoušel jsem ho tedy i se změnou adresy ​a nic. Takto se číst nedá. +
  
 <code c> <code c>
Řádek 30: Řádek 27:
     spi.frequency(1000000);//​ second edge capture, with a 1MHz clock rate     spi.frequency(1000000);//​ second edge capture, with a 1MHz clock rate
     ​     ​
-cs = 0;// Select the device by seting chip select low +    ​cs = 0;// Select the device by seting chip select low 
-    spi.write(0x1F); ​ // Send 0x--, the command to read the --- register+    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     int read = spi.write(0x00);​ // Send a dummy byte to receive the contents of the WHOAMI register
Řádek 37: Řádek 34:
 </​code>​ </​code>​
  
-Inicializace +==== Inicializace ​==== 
-- nastavení bufferu +Podle datasheetu ENC28J60 je třeba před zahájením komunikace provést inicializaci. Ta se skládá z: 
-- receive filter +  * **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 
--ost? +  * **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 ) 
--MAC nastaveni+  * **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 ==== 
 +{{ :​2014:​enc28j60:​spi_paket.jpg?​200|}} 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===== +===== 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ýhodn ​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 stihl pouze sepsat základní ​nastavení ​posílané po SPI.+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.1421592940.txt.gz · Poslední úprava: 2015/01/18 15:55 autor: Milan Kotulek