您的位置:首页 > 运维架构 > Linux

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

2012-04-05 22:56 501 查看
完成单板代码

/*任务7:RFID应用*/



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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: