Разработка биометрического комплекса на основе считывания отпечатка пальца, страница 12

                                                                      // бит 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 {}