#include <util/delay.h>
#include <avr/io.h>
#include "ip_arp_icmp.c"
#include "enc28j60.h"
#include "enc28j60.c"
#include "net.h"
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};// прописываем MAC-адрес устройства
static uint8_t myip[4] = {192,168,1,25};// прописываем IP-адрес устройства
#define BUFFER_SIZE 400// указываем размер буфера для приема данных
static uint8_t buf[BUFFER_SIZE+1];//инициализируем массив данных для буфера
int main(void)// главная функция программы
{      
 PORTD=0x00;
 DDRD|=0xff;
 uint16_t plen;
 CLKPR=(1<<CLKPCE);
 CLKPR=0; // частота 8Мгц
 _delay_ms(10);
 enc28j60Init(mymac);//запускаем функцию инициализации ENC28J60
 _delay_ms(20);
 enc28j60PhyWrite(PHLCON,0x476);//настраиваем режим работы светодиодов ENC28J60:один светодиод индицирует статус соединения,другой-передачу и прием
 _delay_ms(20);
 init_ip_arp(mymac,myip);//запускаем функцию присваивания MAC- адреса и IP-адреса для последующей передачи
 while(1)
{
 plen = enc28j60PacketReceive(BUFFER_SIZE, buf);//запускаем функцию приема пакетов от ENC28J60
 if(plen==0)// если принятых данных нет 
	{
     continue;//то перейти на начало цикла while
    }
 if(eth_type_is_arp_and_my_ip(buf,plen))// если полученные данные ARP-запрос,адресованный нам
	{       
     make_arp_answer_from_request(buf);//то сгенерировать и отправить ARP-ответ 
     continue;// перейти на начало цикла while
    }
 if(eth_type_is_ip_and_my_ip(buf,plen)==0)// если полученные данные являются ip-пакетом и адресованы не нам
	{
     continue;// перейти на начало цикла while
    }
 if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V)//если в полученном ip-пакете содержится запрос "пинг"
    {
    make_echo_reply_from_request(buf,plen);// отправим ответ "понг"
    continue;//перейти на начало цикла while
    }
}
return (0);
}
