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 17:25]
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?​130 |}} 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í.\\ I příručka KL25Z říká, že obsahuje 2 osmibitové porty SPI. +{{: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:​spi_read.jpg?​150 |}} +\\ {{: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ě.
-Dovolí tedy 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 s proměnlivou adresou ​a nic. Takto se číst nedá. +
  
 <code c> <code c>
Řádek 44: Řádek 42:
  
 ==== Příjem paketu ==== ==== 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 prostudoval nastavení řadiče, ale nestihl jsem přijít na to, jak zprovoznit SPI. A bez toho se nedá hnout.  ​+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.1421598353.txt.gz · Poslední úprava: 2015/01/18 17:25 autor: Milan Kotulek