// бит SPTEF регистра SPISR не будет равен 1
}
Функция ожидания окончания приема в порт SPI (рисунок 8.4). Функция необходима для того, чтобы можно было с уверенностью сказать, что данные приняты полностью, и можно произвести их считывание из SPIDR. Аналогично предыдущей функции формируется флаг окончания приема SPIF.
Листинг 8.4
void SPI_recieve_wait(void){
while (SPISR_SPIF==0) {} // прием не будет разрешен пока
// бит SPIF регистра SPISR не будет равен 1
}
Функция инициализации работы с протоколом UDP (рисунок 8.5). Основная задача функции получить свободный socket и порт для передачи, а затем открыть канал передачи UDP-пакетов. Также в функции происходит инициализации портов H и G, которые используются под кнопки и индикаторы.
Листинг 8.5
void init_our_udp(void){
INT8 sock, locport;
UINT16 cnt=0,cnt2;
DDRH = 0x00;
DDRG = 0x03;
DDRG = 0xFF;
DDRH = 0x00;
PTG = 0xff;
sock=udp_getsocket(0,(void*)1,UDP_OPT_NONE); // определяем свободный socket
locport=udp_getfreeport(); // находим свободный порт
sockhandle=udp_open(sock,locport); // открываем канал передачи по socket'у и порту
}
Функция передачи UDP-пакета в сеть (рисунок 8.6). Необходимо задать переменной remip(remote IP) адрес получателя. В данном случае это 192.168.1.1.
Листинг 8.6
void send_our_udp(unsigned char buf[153], uint8 r){
UINT16 cnt=0,ret=0,i=0;
UINT32 remip=0xC0A80101; // Адрес назначения
// 0xC0 - 192
// 0xA8 - 168
// 0x01 - 001 // 0x01 - 001
ret=udp_send(sockhandle,remip,0x998,temp_packet,r,r);
}
Функция приема кадра Ethernet (рисунок 8.7). Первым шагом является проверка на прием данных в буфер. Затем происходит идентификация кадра. В зависимости от того, какой кадр принялся(ARP, IP) происходит его обработка.
Листинг 8.7
void recieve_packet(void){
if (gotlink) {
if( NETWORK_CHECK_IF_RECEIVED() == TRUE )
{switch( received_frame.protocol) // идентификация принятого кадра
{case PROTOCOL_ARP:
process_arp (&received_frame); // анализ принятого ARP-пакета
break;
case PROTOCOL_IP: // анализ принятого IP-пакета
len = process_ip_in(&received_frame);
if(len < 0)
break;
switch (received_ip_packet.protocol) // идентификация принятого IP-пакета
{case IP_ICMP:
process_icmp_in (&received_ip_packet, len); // анализ ICMP - пакета
break;
case IP_UDP:
process_udp_in (&received_ip_packet,len); // анализ UDP – пакета
break;
}
break;
default:
break;
}
NETWORK_RECEIVE_END();
}
arp_manage();
}
else {}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.