Start z STM32 VL Discovery – 16 — TCP/IP – 2

Start z STM32 VL Discovery – 16 — TCP/IP – 2
Razem głosów: 5 co stanowi: 96% całości.

enc28j60-300x223

Nadszedł wreszcie ten czas kiedy użyjemy naszego wspaniałego „chińskiego” modułu ethernet opartego o układ ENC28J60.  Tym samym zbudujemy taki trochę prymitywny, ale zawsze jednak działający server WWW.

Wprowadzenie:

Rozwiązanie, które będziemy omawiać jest maksymalnie uproszczone tak by wszyscy zwłaszcza bardzo początkujący mogli się w tym galimatiasie połapać.  Przede wszystkim użyjemy stosu TCP/IP autorstwa Guido Sochera, pierwotnie przeznaczonego dla 8 bitowych mikrokontrolerów AVR. Prostota tego rozwiązania podczas tworzenia pakietów dla odpowiedzi przychodzących powoduje, że wszystko staje się naprawdę proste do okiełznania jak tylko jest to możliwe:)

Oczywiście istnieje tez inna bardziej skomplikowana droga, ale nie będziemy się teraz nią zajmować.  Nasze rozwiązanie będzie odbierać pakiety z sieci EThernet w sposób tak uproszczony, że można by pomyśleć iż wręcz na kolanach prosimy ENC28J60 coby był tak miły i jak tylko coś odbierze dał nam znać :)  Niestety od razu nadmienię, że ta prostota jest okupiona brakiem większej efektywności dla naszego mikrokontrolera ARM z rdzeniem Cortex.   Zdecydowanie lepiej było by użyć pinu INT do wywołania przerwania MCU czyli sterowanie przesyłem pakietów poprzez obsługę przerwań.

Działanie:

Nasz prymitywny układ będzie działał jako serwer, czyli nasza mała płytka discovery czeka aż otrzyma pakiet i jeśli tak się stanie to „coś” z nim zrobi.

Oczywiście jeśli będzie zainteresowanie tą tematyką to pokuszę się o opisanie aplikacji klienta , która będzie po np przyciśnięciu przycisku wysyłać przez sieć ETH informację o zaistniałym zdarzeniu — można tego używać na 1000 sposobów:

  • w alarmach
  • czujnikach temperatury
  • i wiele innych ….

Reasumując:  Nasz układ będzie odpowiadał na PING i żądania HTTP na porcie 80 – wprawdzie rozwiązanie prostackie , ale w zupełności wystarczające do wielu zastosowań – sterowanie też będzie wymagać okresowego odświeżania widoku strony i przyjmowania odseparowanych wartości z nadchodzących ciągów znaków, które muszą być przekazane w taki sposób, że nawet mając możliwość bezpośredniego wglądu na wartości przy użyciu przeglądarki internetowej będziemy w stanie interpretować je jednoznacznie.

Połączenia:

Tak wiem było , ale warto przypomnieć by uniknąć niepotrzebnego stresu i błędów spowodowanych pewnością …. że dobrze wiemy jak podłączyć :)

Zatem zerknijmy do noty:

48228201

Nota ENC28J60  dostępna jest tutaj i warto się z nią zaprzyjaźnić :)

Jak widać co w tym trudnego no nie :)

, a jednak  … nasze Discovery nie posiada pinu SCK, ale z noty mikrokontrolera STM32F100RBT dowiadujemy się że jest to funkcja alternatywna dla pinu PA5  gdzie widzimy  – SPI1_SCK, sygnał SDI to SP1_MISO czyli pin PA6,  a dalej …

  • SDO – SPI_MOSI = pin PA7

Jako I/O CS zyjemy sobie pinu PA4, ale nie będzie uzywany przez nas jako SPI-NSS, a jako zwykły PIN GPIO (coby nie komplikować sobie życia:) )  to rozwiązanie i tak nam umożliwi komunikację po magistrali SPI z układem ENC. RESET podłączymy do pinu VCC naszego modułu ENC czyli do pinu 3,3V na Discovery :)  GND zaś  –  nie no to chyba już wiadomo :”) gdzie podłączyć :P Natomiast Pinów WOL i INT nie będziemy używać więc też nie będziemy ich podłączać nigdzie.

Jako że wszystko dobrze podłączyliśmy mamy pewność, że nie dokonamy eksterminacji żadnej z płytek i wszystko nam ładnie powinno zadziałać :)

Oprogramowanie:

Nasz program działał będzie nie jako w funkcji ciągłej  simple_server , którą znajdziemy w pliku simple_server.c.  W tej funkcji , po inicjalizacji następuje skok do pętli nieskończonej while(1). DLACZEGO ??

Nie no przecież widać gołym okiem, że o ubranym już nie wspomnę :)

Tylko wtedy gdy coś jest w buforze odebranych, dane są przetwarzane.  Widoczny poniżej natomiast fragment kodu sprawdza czy nadeszło żądanie ARP dla naszego adresu MAC:

Dokładnie w ten sam sposób wykrywany jest ruch na porcie 80, czyli do serwera WW, ale jest trochę trudniej, gdyż stanowi to już zapytanie TCP/IP i nie jest tak proste jak w przypadku ARP , a robimy to tak:

Dobrze zatem korzystając z my_www_port możemy znienić port, na którym jest uruchomiony nasz serwer WWW, ale tylko w zakresie 1 do 125. Spowodowane jest to tym że :

buf[TCP_DST_PORT_H_P]==0 , a to wyklucza użycie innych portów nić 0x00NN.

Dla uproszczenia nie będziemy używać dekodowania URL, a wykonywane połączenie będzie realizowane poprzez adres IP, ponadto musimy wpisać hasło i wybrać żądaną operację. Przykładowo po wpisaniu:

http://192.168.1.3/LED4/1    – zaświecimy diodę LED4 na płytce Discovery:), a ..

http://192.168.1.3/LED4/0    – dioda zostanie zgaszona , a wywołanie http://192.168.1.3/LED4  poda nam informację o stanie bez jego zmiany :)

(oczywiście to przykładowe adresy bo każdy sobie ustali swoje)

We wszystkich 3ch przypadkach oczywiście zobaczymy banalnie prostą stronę WWW, która jest zaszyta w kodzie naszego programu i tu jej nie będę specjalnie opisywał , to zwyczajny jeżyk html:)

Hasło i żądanie działania można bardzo łatwo w naszym kodzie zmienić co tez za nie długo stanie się całkowicie jasne. Niemniej zmiana portu wiąże się ze zmianą wywołania z :

http://192.168.1.3/…. na np. http://192.168.1.3:85/… ,a cała reszta bez zmian:)

Nasza strona WWW w odpowiedzi na zapytanie przeglądarki zostanie przygotowana następującym kodem do wyświetlenia:

Wszystko inne zaś jest sprawą obsługi pakietów i ich zawartości, które są ukryte w pliku ip_arp_udp_tcp.c używa on biblioteki do  komunikacji z ENC czyli (ENC28J60.c).

Uff rozpisałem się o obsłudze pakietów, ale to dlatego żeby pokazać jak wysyłać odpowiednie adresy IP i MAC w nagłówkach pakietów Ethernetowych , jak i datagramy TCP i UDP (inline długość danych, inline CRC itd…), oraz zmiany parametrów pakietów  (na przykład żądanie pakietu w odpowiedzi override itp). Biblioteka ip_arp_udp_tcp.c  jest krótka, ale nie nadaje się do stosowania jej w innych zastosowaniach niż serwer WWW.  Oczywiście jest to wykonalne, ale było by zbyt skomplikowane.  Tymczasem ze względu na swoją prostotę, jest bardzo szybka i nie stanowi w sumie znaczącego obciążenia dla STM32F100xx

Przykładowy program:

Enc 1
Enc 1
enc_1.7z
304.5 KiB
20 Downloads
Szczegóły

 

 

 

 

Podziel się na:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay