[Linux项目实践] 物联网单板测试之任务七:RFID之RFID_Test

完成单板代码

/*任务7RFID应用*/

RFID_Test()

/*******************************************************************************

* Function Name  : RFID_Test

* Description    : RFID test.

* Input          : None

* Output         : None

* Return         : None

*******************************************************************************/

void RFID_Test(void)

{

  Menu_TypeDef menu;

  uint16_t key, x;

  uint8_t rbuf[36], chksum;

  char buf[8];

  uint32_t i, j;

  menu.max_numb = 2;

  menu.numb = 1;

  menu.title = "RFID";

  menu.item[0] = "1.Read Card";

  menu.item[1] = "2.Write Card";

  

  Dis_Menu(menu);

  delay_ms(250);

  GPIOSetDir(PORT2, 8, 0);

  

  while(menu.numb)

   {

if(!GPIOGetValue(PORT2, 8))

     { 

   delay_ms(200);

       j = RFID_Operate((uint8_t *)RFID_READ_DATA_BLOCK_21, rbuf);

  

       printf("\r\n");

       for(i=0, x=0; i<j; i++)

       {

if(x <= 108)

{

   snprintf(buf, 4, "%02X ", rbuf[i]);

   OLED_DisChar(2-1 + 5, x, 0, buf[0]);

           x += 6;

           OLED_DisChar(2-1 + 5, x, 0, buf[1]);

           x += 6;

           OLED_DisChar(2-1 + 5, x, 0, buf[2]);

           x += 6;

         }

         printf("%02X ", rbuf[i]);

       }

       chksum = RFID_CheckSum(rbuf);

      if(chksum == rbuf[rbuf[0]])

      {

         OLED_DisStrLine(2-1 + 6, 0, "Ok  ");

         printf("\r\nOk ");

      }

      else

      {

OLED_DisStrLine(2-1 + 5, 0, "                     ");

         OLED_DisStrLine(2-1 + 6, 0, "Fail");

         printf("\r\nFail ");

      }

  

   delay_ms(200); 

      }

     key = KEY_Read();

     switch(key)

{

   case KEY_UP:

     if(menu.numb > 1)

   menu.numb --;

else

   menu.numb = menu.max_numb;

Dis_Menu(menu);

break;

case KEY_DOWN:     

if(menu.numb < menu.max_numb)

menu.numb ++;

else

menu.numb = 1;

Dis_Menu(menu);

break;

   case KEY_SEL:

     switch(menu.numb)

{

   case 1:     

j = RFID_Operate((uint8_t *)RFID_READ_DATA_BLOCK_21, rbuf);

  

         printf("\r\n");

             for(i=0, x=0; i<j; i++)

             {

  if(x <= 108)

   {

     snprintf(buf, 4, "%02X ", rbuf[i]);

     OLED_DisChar(2-1 + 5, x, 0, buf[0]);

             x += 6;

OLED_DisChar(2-1 + 5, x, 0, buf[1]);

             x += 6;

OLED_DisChar(2-1 + 5, x, 0, buf[2]);

             x += 6;

           }

               printf("%02X ", rbuf[i]);

             }

             chksum = RFID_CheckSum(rbuf);

             if(chksum == rbuf[rbuf[0]])

         {

           OLED_DisStrLine(2-1 + 6, 0, "Ok  ");

               printf("\r\nOk ");

         }

            else

         {

   OLED_DisStrLine(2-1 + 5, 0, "                     ");

           OLED_DisStrLine(2-1 + 6, 0, "Fail");

               printf("\r\nFail ");

         }

     break;

   case 2:     

j = RFID_Operate((uint8_t *)RFID_WRITE_DATA_BLOCK_22, rbuf);

  

         printf("\r\n");

             for(i=0, x=0; i<j; i++)

             {

   if(x <= 108)

   {

     snprintf(buf, 4, "%02X ", rbuf[i]);

      OLED_DisChar(2-1 + 5, x, 0, buf[0]);

             x += 6;

OLED_DisChar(2-1 + 5, x, 0, buf[1]);

             x += 6;

OLED_DisChar(2-1 + 5, x, 0, buf[2]);

             x += 6;

           }

               printf("%02X ", rbuf[i]);

             }

             chksum = RFID_CheckSum(rbuf);

             if(chksum == rbuf[rbuf[0]])

         {

           OLED_DisStrLine(2-1 + 6, 0, "Ok  ");

               printf("\r\nOk ");

         }

             else

         {

   OLED_DisStrLine(2-1 + 5, 0, "                     ");

           OLED_DisStrLine(2-1 + 6, 0, "Fail");

               printf("\r\nFail ");

         }

     break;

   default:

     break;

}

     break;

  

   case KEY_ESC:          

         menu.numb = 0;

     break;

   default:

     break; 

}

if((key!=KEY_NONE) && (menu.numb!=0))

{

   delay_ms(250);

}

   }

}

1、RFID_Operate()

/*******************************************************************************

* Function Name  : RFID_Operate

* Description    : Output segment to LED.

* Input          : - numb : display number.

* Output         : None

* Return         : None

*******************************************************************************/

uint8_t RFID_Operate(uint8_t *tbuf, uint8_t *rbuf)

{

uint8_t chksum;

uint32_t i, j, rnumb;

SPI_Init(0, 8, 128);

delay_ms(1);

RFID_CS(0);

chksum = RFID_CheckSum(tbuf);   //get out a cheksum

SPI_PutGet(0, 0xaa);

delay_ms(1);

i = 0;

rbuf[i] = SPI_PutGet(0, 0xbb);

i ++;

delay_ms(1);

for(j=0; j<tbuf[0]; j++)

{

rbuf[i] = SPI_PutGet(0, tbuf[j]);

i ++;

delay_ms(1);

}

rbuf[i] = SPI_PutGet(0, chksum);

i ++;

delay_ms(500);

rbuf[0] = 1;

SPI_PutGet(0, 0);

delay_ms(1);

if(SPI_PutGet(0, 0) != 0xaa)

{

SPI_Init(0, 8, 2);

return 0;

}

delay_ms(1);

if(SPI_PutGet(0, 0) != 0xbb)

{

SPI_Init(0, 8, 2);

return 0;

}

   delay_ms(1);

 

   switch(tbuf[1])

   {

     case 0x01:

   rnumb = 8 + 2 + 1;

   break;

case 0x20:

   rnumb = 4 + 2 + 1;

   break;

case 0x21:

   rnumb = 16 + 2 + 1;

   break;

case 0x22:

   rnumb = 2 + 1;

   break;

default:

   rnumb = 4 + 2 + 1;

   break;

   }

   for(j=0, i=0; j<rnumb; j++, i++)

   {

     rbuf[i] = SPI_PutGet(0, 0);

delay_ms(1);

   }

   RFID_CS(1);

   delay_ms(1);

   SPI_Init(0, 8, 2);

   return i;

}

2、RFID_CheckSum()

/*******************************************************************************

* Function Name  : RFID_CheckSum

* Description    : Init RFID control.

* Input          : None

* Output         : None

* Return         : None

*******************************************************************************/

uint8_t RFID_CheckSum(uint8_t *databuf)

uint8_t numb, chksum;

uint32_t i;

numb = databuf[0]-1;

for(i=0; i<databuf[0]; i++)

{

if(databuf[i] == 0xaa)

   numb ++;

}

chksum = databuf[0];

while(numb)

{

chksum ^= databuf[numb];

numb --;

}

return chksum;

}

阅读更多
个人分类: Linux项目实践
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭