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

 }                                                                

Функция передачи данных через порт SPI (рисунок 8.8). Передача байта данных осуществляется сразу после помещения его в регистр SPIDR, необходимым условием является проверка на разрешение передачи. Во время передачи данных от ведущего к ведомому, происходит вытеснение данных из ведомого. Эти данные необходимо считать для того, чтобы очистить регистр передачи.

Листинг 8.8

void tx_data_SPI(uint8 tx){

           uint8 temp;                            

           SPI_transmit_empty();        // ожидание на разрешение передачи

           SPIDR=tx;                            // передача через MOSI, т.е. Master -> Slave

                     // одновременно осуществляется передача Slave -> Master, через MISO

                     // по окончании передачи необходимо считать данные из SPIDR,

                     // чтобы освободить этот регистр                                                                     

           SPI_recieve_wait();             // ожидание на разрешение приема

           temp=(SPIDR);                                                      

 }

Функция приема данных от ведомого устройства (рисунок 8.9). Так как инициировать прием данных может только ведущее устройство, необходимо с него передать любой байт данных ведомому. Во время передачи этого байта данные с ведомого будут вытесняться и передаваться на ведущее устройство.

Листинг 8.9

uint8 rx_data_SPI(void){

                       uint8 temp;  

           SPI_transmit_empty();        // ожидание разрешения на передачу

           SPIDR=0x00;                       // передаем что нибудь, чтобы

//во время передачи считать содержимое Slave'а

           SPI_recieve_wait();             // ожидание на разрешение приема

           temp=(SPIDR);                    // чтение байта данных из SPIDR

         return(temp);

  }

Функция считывания строки изображения (рисунок 8.10). Считывание происходит по циклу, который определяется количеством элементов подлежащих считыванию. После чтения одного элемента необходимо сделать небольшую паузу, которая определяется экспериментальным путем.

Листинг 8.10

void read_image_row(void){

                      UINT8 i;

                      uint8 temp;

                      UINT8 n=153;                                                            

                      for (i=1;i<n;i++)

                            {temp = rx_data_SPI();

                              temp_packet[i] = temp;

                              pause(40) ;

                            }  

 }

Функция приема полного изображения и передача его в сеть (рисунок 8.11). Основная задача данной функции проделать считывание 200 строк, добавив к каждой ее номер, и передать их в локальную сеть Ethernet.

Листинг 8.11

void read_image_and_transmit(void){

         UINT8 i, ii;

         uint8 tt, temp;

         UINT8 n=153;                      

         for (yy=0;yy<200;yy++)

         {temp_packet[0]=yy;     // первый элемент массива - номер строки изображения

          SS_enable();

           tx_data_SPI(READ_SHIFT_X);

                     /* Ignore 32 clocks */

                    for(i=0;i<5;i++) tt=rx_data_SPI();    

 read_image_row();    // считывание строки изображения

                     /* Ignore 16 clocks */               

                    for(i=0;i<2;i++) tt=rx_data_SPI();

                     SS_disable();

                      SS_enable();

            tx_data_SPI(READ_SHIFT_Y);

                      SS_disable();

           recieve_packet();

           send_our_udp(temp_packet,153); // отправка строки изображения            

                        }         

         }