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 11:07]
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ů. ​Avšak ze zde vytvořených ​nic plně 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.
  
-\\ 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 začal ​zjištovat kde je problém.+\\ 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.
  
-\\ Jestli ​jsem správně pochopil ​tak není určen pro desku kl25Z.+{{:​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. 
 +\\ {{:​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 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ě. 
 + 
 +<code c> 
 +    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); 
 +</​code>​ 
 + 
 +==== 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 ==== 
 +{{ :​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++. 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.+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.1421575671.txt.gz · Poslední úprava: 2015/01/18 11:07 autor: Milan Kotulek