SPI Ethernet библиотека на mikroC

Използвана е готово осигурена библиотека за работа с ENC28J60 от компилатора, за по-лесната манипулация и работа с контролера. Тя работи с всеки PIC контролер с интегриран SPI модул и повече от 4Kb ROM памет. Някои от поддържаните параметри на библиотеката са:

Figure: Дърво на зависимостите на Ethernet библиотеката
\includegraphics[width=150pt]{figs/Fig17.pdf.ps}

Използваните основи функции от библиотеката са: SPI_Ethernet_do_Packet,
SPI_Ethernet_putString, SPI_Ethernet_putconstString, SPI_Ethernet_User_TCP,
SPI_Ethernet_confNetwork

$ \bullet$ SPI_Ethernet_do_Packet - Това е подпрограма управляваща MAC модула. Чете от RAM буфера на етернет контролера и обработва следващия получен пакет (ако такъв съществува). Пакетите се обработват по следния маниер:
- На ARP и ICMP запитванията се отговаря автоматично
- При TCP запитване се повиква функцията SPI_Ethernet_UserTCP за по-нататъчна обработка
- При UDP запитване се повиква функцията SPI_Ethernet_UserUDP за по-нататъчна обработка

SPI_Ethernet_do_Packet е извиквана възможно най-често в главната програма. Функцията връща ``0'' при успешна обработка на пакета, ``1'' при приемна грешка и нужда от рестартиране на етернет контролера, ``2'' ако получения пакет не е предназначен за нас (не е нашето IP или адрес за предаване), ``3'' ако IP пакета не е IPv4, ``4'' в случай, че пакета не може да бъде разпознат.

$ \bullet$ SPI_Ethernet_UserTCP - Това е подпрограма управляваща TCP модула. Тя бива извиквана вътрешно от библиотеката (SPI_Ethernet_do_Packet), достъпа до TCP/HTTP запитванията става чрез използване на SPI_Ethernet_get подпрограмите. Добавянето на информация в предаващия буфер става чрез SPI_Ethernet_putString или
SPI_Ethernet_putConstString за константа. Функцията връща дължината в байтове на HTTP отговорите или 0 ако няма какво да се предава.

$ \bullet$ SPI_Ethernet_putString и SPI_Ethernet_putConstString - Това са подпрограми запаметяващи цял стринг (без нулевия терминиращ) в рамта на ENC28J60 като започва от адрес на пойнтера за запис EWRPT. По този начин е възможно да се записват до 1500 байта стринг в рамта на контролера. Ограничението от 1500 идва от максималния размер на един етернет фрейм според стандарта IEEE 802.3 и OSI модела.

По-долу е показана извадка от SPI_Ethernet_UserTCP с пояснителни коментари за всяка една функция:

unsigned int  SPI_Ethernet_UserTCP(unsigned char *remoteHost,
unsigned int remotePort, unsigned int localPort, unsigned int reqLength,
TEthPktFlags *flags) // конфиг. на връщания порт, IP, дължина...
{

if(localPort != 80){return(0);}  // Слушай само за запитвания на порт 80

// вземи само първите 20 байта на запитването, останалото няма значение
        for(len = 0 ; len < 20 ; len++)
        {getRequest[len] = SPI_Ethernet_getByte() ;}
        getRequest[len] = 0 ;
        len = 0;

if(getRequest[5] == 't') {Set_RTC(HH,MM,SS,DD,MM,YY);} //ако запитването е /t
				// свери часовника с получените стойности

else if(getRequest[5] == 's') {SPI_Ethernet_putString(SI)} 
// ако е /s отговори с RAM csv буфера от слънчевия индекс 

else if(getRequest[5] == 'a'){ ------ }
// ако е /а върни админ страницата

else if(getRequest[5] == 'x'){
// ако е /х върни RAM csv буфера с темп. влажност. и атм налягане

else if(getRequest[5] == 'g'){  
// ако е /g върни страницата с графиката
len =  putConstString(httpHeader) ;             // HTTP header
len += putConstString(httpMimeTypeHTML) ;       // HTML MIME type
len += putConstString(graphPage) ;              // HTML страницата
}

else if(getRequest[5] == 'd')
// ако е /d върни страницата "За нас"
{
len =  putConstString(httpHeader) ;             // HTTP header
len += putConstString(httpMimeTypeHTML) ;       // HTML MIME type
len += putConstString(aboutus) ;                // HTML страницата
                   }
if(len == 0)   // какво да прави по подразбиране при /
{
len =  putConstString(httpHeader) ;             // HTTP header
len += putConstString(httpMimeTypeHTML) ;       // HTML MIME type
len += putConstString(indexPage) ;              // HTML страницата 1 част
len += putConstString(indexPage2) ;             // HTML страницата 2 част
len += putConstString(indexPage3) ;             // HTML страницата 3 част
}}



Deyan Levski 2013-06-22