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 18:44]
Milan Kotulek
2014:enc28j60 [2015/01/18 19:04] (aktuální)
Milan Kotulek
Řádek 13: Řádek 13:
  
 ===== Blokové schéma a zapojení ===== ===== Blokové schéma a zapojení =====
-{{ :​2014:​2015-01-17_15.35.53.jpg?​200|}}{{ :​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 19: Řá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 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:​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 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ě.
-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 s tím vypořádat jsem hledal ​nenašel. Takže netuším co dělám špatně.+
  
 <code c> <code c>
Řádek 42: Řádek 42:
  
 ==== Příjem paketu ==== ==== Příjem paketu ====
-{{ :​2014:​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á.+{{ :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. ​ Č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ý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.  ​ 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.1421603086.txt.gz · Poslední úprava: 2015/01/18 18:44 autor: Milan Kotulek