(Old) Laboratorul 5: Webserver

1. Specificatii ENC28J60

ENC28J60 este un controller Ethernet cu interfata SPI. Este special proiectat pentru a fi conectat prin SPI la un controller, oferind acestuia o interfata Ehernet. ENC28J60 indeplineste specificatiile IEEE 802.3 si ofera urmatoarele servicii:

  • packet filtering
  • throughput mare pentru date (datorita modulului DMA incorporat)
  • calculul sumei de control asistat de hardware

ENC28J60 incorporeaza urmatoarele module:

  • Interfata SPI - canal de comunicatie cu controller-ul gazda.
  • Registri de control - controlul si monitorizarea ENC28J60.
  • Memorie Ram dual port - buffer pentru pachetele receptionate si trimise.
  • Unitate de arbitru - regleaza cererile de access ale DMA-ului.
  • O interfata pentru magistrala - interpreteaza comenzi si date venite prin SPI.
  • MAC - conform IEEE 802.3.
  • PHY - modul pentru nivelul fizic.

1.1. Organizarea memoriei

Memoria lui ENC28J60 este implementata ca RAM static si se imparte in 3 tipuri:

  • Registri de control
  • Ethernet buffer
  • Registri PH
1.1.1. Registre de control

Acestea asigura interfata principala intre controller-ul gazda si logica controller-ului Ethernet. Scriere si citirea acestor registre se poate face in mod direct de controller-ul gazda utilizand SPI, acesta avand astfel controlul asupra operatiilor executate de ENC28J60.

Registrele de control sunt in general grupate in registre de tip ETH, MAC si MII (Media Independent Interface). Ne putem da seama din ce categorie face parte un registru uitandu-ne la prefixul numelui sau.

Memoria unde sunt mapate registrele de control este partitionata in 4 bank-uri (vezi tabelul 3-1, pagina 12 din Data Sheet-ul ENC28J60), selectabile prin intermediul bitilor BSEL1:BSEL0 din registrul ECON1. Fiecare bank are 32 bytes, deci putem adresa registrii in interioul unui bank folosind o adresa de 5 biti. Deoarece registrii EIE, EIR, ESTAT, ECON2 si ECON1 sunt foarte des utilizati, acestia au fost mapati in fiecare bank, pentru a facilita accesul la ei.

Cel mai important registru dintre cei mentionati in tabelul de mai sus este ECON1. Biti importanti din acest registru sunt:

  • TXRTS: Transmit Request to Send bit
    • 1 = logica de transmisie transmite un pachet
    • 0 = logica de transmisie este idle
  • RXEN: Receive Enable bit
    • 1 = pachetele care nu au fost filtrate vor fi scrise in buffer-ul de receive
    • 0 = toate pachetele vor fi ignorate
  • BSEL1:BSEL0: Bank Select bits
    • 11 = SPI va vea acces la registrii din bank-ul 3
    • 10 = SPI va vea acces la registrii din bank-ul 2
    • 01 = SPI va vea acces la registrii din bank-ul 1
    • 00 = SPI va vea acces la registrii din bank-ul 0
5.1.2. Ethernet buffer

Buffer-ul Ethernet reprezinta acea zona de memorie in/din care ENC28J60 va scrie/citi pachetele receptionate sau transmise. Capacitatea buffer-ului este de 8Kbytes si este impartit in doua zone distincte pentru pachete receptionate si transmise. Dimensiunea si locatia celor doua zone de memorie sunt configurabile de catre controller-ul gazda prin intermediul SPI.

  • Receiver Buffer - este organizat ca un buffer circular FIFO, controlat de hardware. Perechile de registri ERXSTH:ERXSTL si ERXNDH:ERXNDL sunt folositi ca pointeri spre inceputul si sfarsitul buffer-ului. Hardware-ul are grija ca pachetele sa fie dispuse in mod circular in spatiul dintre cei doi pointeri.
  • Transmit Buffer - orice spatiu care nu este folosit pentru receive din cei 8Kbytes, este folosit ca buffer de transmit. Cand controller-ul gazda vrea sa trimita un pachet, pune in registrii ETXST si ETXND adresele de inceput si de sfarsit ale respectivului pachet. Hardware-ul NU verifica daca acesti pointeri sunt in spatiul de transmit. Este responsabilitatea controller-ului gazda ca adresele furnizate sa fie corecte.

1.1.3. Registri PHY

Permit configurarea si controlul modulului Nivel Fizic. Spre deosebire de registrii de control si de buffer-ul Ethernet, registrii PHY nu pot fi modificati in mod direct de controller-ul gazda prin SPI. Pentru a avea acces la acestia, controller-ul ii poate accesa indirect prin intremediul registrilor de control de tip MII.

1.2. Implementarea SPI la ENC28J60

Controller-ul Ethernet ENC28J60 este proiectat pentru a se conecta cu usurinta la portul de SPI al celor mai multe microcontroller-e.

Functionarea ENC28J60 depinde in totalitate de comenzile primite de la controller-ul gazda, de aceea in continuare ne vom uita la forma pe care o au aceste comenzi SPI.

Generalitati legate de comenzile SPI:

  • Comenzile sunt luate in considerare de ENC28J60 doar in momentul in care acesta este selectat → controller-ul gazda pune linia CS (SS) pe 0
  • O comanda se termina, punandu-se linia CS pe 1
  • Primul byte trimis de controller-ul gazda spre cip este format din:
    • 3 biti reprezentand codul operatiei
    • 5 biti reprezentand:
      • o constanta in cazul scrierii / citirii din buffer-ul Ethernet
      • adresa unuia dintre cei 32 registri de control ai bank-ului curent in cazul accesului la un registru de control

Sa analizam urmatoarele comenzi:

  • Read Control Register (RCR):
    • Controller-ul trimite doar un byte
      • daca se doreste citirea dintr-un registru ETH, imediat dupa primirea comezii, ENC28J60 va incepe transmisia continutului registrului respectiv pe SO → primul byte primit de controller pe linia de MISO va fi chiar informatia dorita (continutul registrului)
      • daca se doreste citirea dintr-un registru MAC sau MII, prima data ENC28J60 va trimite un byte dummy, si abia apoi continutul registrului respectiv.
  • Write Control Register (WCR):
  • Controller-ul va trimite 2 octeti, despre primul am vorbit, iar al doilea este byte-ul care va fi scris la adresa registrului specificat.

2. Tema laboratorului

Arhiva de lucru: lab6_skel2.zip Soluție: lab5_sol.zip Exemplu care chiar merge: exemplu_webserver.zip Datasheet ENC28J60 39662b.pdf

In acest laborator vom folosi ATMega324 pentru a implementa o interfata web. Pagina web afisata contine informatii despre ip-ul microcontroller-ului si al clientului, ora curenta, up-time si se pot controla 8 led-uri. Pentru a ne conecta la reteaua laboratorului vom folosi chip-ul ENC28J60 pe post de slave, in timp ce ATMega16 va fi master iar conexiunea dintre ei va fi de tip SPI. Pentru a afisa pagina web avem nevoie de o implementare a protocolului TCP. Pentru a minimiza dimensiunea codului implementarea va fi simplista (stateless TCP) si nu va permite fragmentarea pachetelor. Chiar si asa codul devine relativ complex. Cele mai importante parti sunt:

  • main.c: implementeaza loop-ul principal in care sunt primite cereri.
  • enc28j60.c: implementeaza functiile de comunicatie intre ATMega16 si ENC28J60.
  • ip_arp_udp_tcp.c: implementeaza protocolul simplificat TCP

TODO-uri:

  • Creati un proiect cu sursele de pe site.
  • Dupa ce ati creat proiectul setati nivelul de optimizare la “-Os” din menu-ul Project→Configuration Options→General.
  • enc28j60.c: implementara functiilor de citire si scriere in/din ENC28J60.
  • main.c: configurarea ceasului (vezi laboratorul 2)
pm/lab/lab5.txt · Last modified: 2020/02/14 10:01 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0