標(biāo)題:
PN532 NFC標(biāo)簽讀寫 STM32程序源代碼
[打印本頁]
作者:
xubo1992
時(shí)間:
2020-3-17 09:08
標(biāo)題:
PN532 NFC標(biāo)簽讀寫 STM32程序源代碼
附件是關(guān)于NFC標(biāo)簽的讀寫程序源碼,大家可參考,適合新手學(xué)習(xí)
單片機(jī)源程序如下:
#include "nfc.h"
#include"delay.h"
u32 Uart0_rev_countmap;//串口讀取的數(shù)據(jù)長(zhǎng)度
u8 RxBuffer1[500];
extern u8 flag_1; //第一次 讀出 UID碼成功
extern u8 flag_2;
extern u8 flag_3;
u8 flag_rev_finish;//串口接收到數(shù)據(jù)的標(biāo)志, 1為接收到
u8 flag_nfc_status;
u8 UID[4]; //存儲(chǔ) UID
extern u8 UID_backup[4];//UID備份 用于處理 不連續(xù)寫同一卡
////55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 03 FD D4 14 01 17 00
void nfc_WakeUp(void)
{
u8 data[24];
u8 i;
u8 CheckCode=0; //數(shù)據(jù)校驗(yàn)碼
u8 temp=0;
while(1)
{
flag_rev_finish=0;
data[0]=0x55;
data[1]=0x55;
data[2]=0x00;
data[3]=0x00;
data[4]=0x00;
data[5]=0x00;
data[6]=0x00;
data[7]=0x00;
data[8]=0x00;
data[9]=0x00;
data[10]=0x00;
data[11]=0x00;
data[12]=0x00;
data[13]=0x00;
data[14]=0x00;
data[15]=0x00;
data[16]=0xFF;
data[17]=0x03; //包 長(zhǎng)度
data[18]=0xFD; //包 長(zhǎng)度 校驗(yàn) 0x100-data[3]
data[19]=0xD4; //命令標(biāo)識(shí)碼
data[20]=0x14; //命令標(biāo)識(shí)碼
data[21]=0x01;
data[22]=0x17; //數(shù)據(jù) 校驗(yàn) 0x100-
data[23]=0x00;
SendData(data,24);//往USART1,發(fā)送 length長(zhǎng)度的數(shù)據(jù)data
delay_ms(180);
//00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00
if(flag_rev_finish)
{
flag_rev_finish=0;
for(i=11;i<13;i++)
{
temp+=RxBuffer1[i];
}
CheckCode=0x100-temp;
if(CheckCode==RxBuffer1[13])
{
CheckCode=0x100-temp;
CleanBuffer(40);//清除 串口接收緩沖區(qū)前30 個(gè)字節(jié)數(shù)據(jù)
break;
}
}
}
}
//配置 106 kbps type A (ISO/IEC14443 Type A),
//00 00 FF 04 FC D4 4A 01 00 E1 00
void nfc_InListPassiveTarget(void)
{
u8 data[11];
u8 i;
u8 CheckCode=0; //數(shù)據(jù)校驗(yàn)碼
u8 temp=0;
while(1)
{
flag_rev_finish=0;
data[0]=0x00;
data[1]=0x00;
data[2]=0xFF;
data[3]=0x04; //包 長(zhǎng)度
data[4]=0xFC; //包 長(zhǎng)度 校驗(yàn) 0x100-data[3]
data[5]=0xD4; //命令標(biāo)識(shí)碼
data[6]=0x4A; //命令標(biāo)識(shí)碼
data[7]=0x01;
data[8]=0x00;
data[9]=0xE1; //數(shù)據(jù) 校驗(yàn) 0x100-
data[10]=0x00;
SendData(data,11);//往USART1,發(fā)送 length長(zhǎng)度的數(shù)據(jù)data
delay_ms(180);
temp=0;
if(flag_rev_finish)
{
flag_rev_finish=0;
for(i=11;i<23;i++)
{
temp+=RxBuffer1[i];
}
CheckCode=0x100-temp;
if(CheckCode==RxBuffer1[23])
{
UID[0]=RxBuffer1[19];
UID[1]=RxBuffer1[20];
UID[2]=RxBuffer1[21];
UID[3]=RxBuffer1[22];
CleanBuffer(40);//清除 串口接收緩沖區(qū)前30 個(gè)字節(jié)數(shù)據(jù)
break;
}
}
}
}
// 密碼授權(quán),驗(yàn)證KeyA
//00 00 FF 0F F1 D4 40 01 60 03 FF FF FF FF FF FF UID1 UID2 UID3 UID4 2A 00
//00 00 FF 0F F1 D4 40 01 60 03 FF FF FF FF FF FF 94 8A 3B 0B 2A 00
void nfc_PsdVerifyKeyA(void)
{
u8 data[22];
u8 temp=0;
u8 i;
u8 CheckCode=0; //數(shù)據(jù)校驗(yàn)碼
flag_rev_finish=0;
data[0]=0x00;
data[1]=0x00;
data[2]=0xFF;
data[3]=0x0F; //包 長(zhǎng)度
data[4]=0xF1; //包 長(zhǎng)度 校驗(yàn) 0x100-data[3]
data[5]=0xD4; //命令標(biāo)識(shí)碼
data[6]=0x40; //命令標(biāo)識(shí)碼
data[7]=0x01;
data[8]=0x60;
data[9]=0x03;
data[10]=0xFF; //KEY A 密碼 FF FF FF FF FF FF
data[11]=0xFF;
data[12]=0xFF;
data[13]=0xFF;
data[14]=0xFF;
data[15]=0xFF;
data[16]=UID[0];
data[17]=UID[1];
data[18]=UID[2];
data[19]=UID[3];
for(i=5;i<20;i++)
{
temp+=data[i];
}
data[20]=0x100-temp; //數(shù)據(jù) 校驗(yàn) 0x100-
data[21]=0x00;
SendData(data,22);//往USART1,發(fā)送 length長(zhǎng)度的數(shù)據(jù)data
delay_ms(180);
// while(!flag_rev_finish)
// ;
// flag_rev_finish=0;
temp=0;
for(i=11;i<14;i++)
{
temp+=RxBuffer1[i];
}
CheckCode=0x100-temp;
if(CheckCode==RxBuffer1[14])
{
if(RxBuffer1[13]==0x00)
{
CleanBuffer(40);//清除 串口接收緩沖區(qū)前40 個(gè)字節(jié)數(shù)據(jù)
if(flag_nfc_status==0)
{
nfc_read();
}
else if(flag_nfc_status==1)
{
nfc_write(0x55);
}
else if(flag_nfc_status==2)
{
nfc_write(0xAA);
}
}
}
}
//默認(rèn) 讀 02區(qū)的16個(gè)字節(jié)
//00 00 FF 05 FB D4 40 01 30 02 B9 00
void nfc_read()
{
u8 data[12];
u8 temp=0;
u8 i;
u8 CheckCode=0; //數(shù)據(jù)校驗(yàn)碼
flag_rev_finish=0;
data[0]=0x00;
data[1]=0x00;
data[2]=0xFF;
data[3]=0x05; //包 長(zhǎng)度
data[4]=0xFB; //包 長(zhǎng)度 校驗(yàn) 0x100-data[3]
data[5]=0xD4; //命令標(biāo)識(shí)碼
data[6]=0x40; //命令標(biāo)識(shí)碼
data[7]=0x01;
data[8]=0x30;
data[9]=0x02; //讀第二塊的16字節(jié)數(shù)據(jù)
data[10]=0xB9; //數(shù)據(jù)校驗(yàn)
data[11]=0x00;
SendData(data,12);//往USART1,發(fā)送 length長(zhǎng)度的數(shù)據(jù)data
delay_ms(180);
//while(!flag_rev_finish)
// ;
// flag_rev_finish=0;
temp=0;
for(i=11;i<30;i++)
{
temp+=RxBuffer1[i];
}
CheckCode=0x100-temp;
if(CheckCode==RxBuffer1[30])
{
if(RxBuffer1[14]==0xAA)
{
GPIO_SetBits(GPIOA, GPIO_Pin_4);//點(diǎn)亮 D4
}
else if(RxBuffer1[14]==0x55)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//熄滅 D4
}
if((UID_backup[0]!=UID[0])|(UID_backup[1]!=UID[1])|(UID_backup[2]!=UID[2])|(UID_backup[3]!=UID[3]))
{
GPIO_ResetBits(GPIOD,GPIO_Pin_3);//蜂鳴器 叫
delay_ms(50);
GPIO_SetBits(GPIOD, GPIO_Pin_3);//蜂鳴器 不叫
}
UID_backup[0]=UID[0];
UID_backup[1]=UID[1];
UID_backup[2]=UID[2];
UID_backup[3]=UID[3];
CleanBuffer(40);//清除 串口接收緩沖區(qū)前40 個(gè)字節(jié)數(shù)據(jù)
}
}
//默認(rèn)往 02區(qū)寫 16個(gè)字節(jié)的第一個(gè)字節(jié)
//00 00 FF 15 EB D4 40 01 A0 02 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F D1 00
void nfc_write(u8 LedData)
{
u8 data[28];
u8 temp=0;
u8 i;
u8 CheckCode=0;
data[0]=0x00;
data[1]=0x00;
data[2]=0xFF;
data[3]=0x15; //包 長(zhǎng)度
data[4]=0xEB; //包 長(zhǎng)度 校驗(yàn) 0x100-data[3]
data[5]=0xD4; //命令標(biāo)識(shí)碼
data[6]=0x40; //命令標(biāo)識(shí)碼
data[7]=0x01; //讀寫大于6字節(jié) 就置1,看手冊(cè)
data[8]=0xA0; //寫
data[9]=0x02; //寫第二塊的16字節(jié)數(shù)據(jù)
data[10]=LedData; //第 1 字節(jié) 數(shù)據(jù)
data[11]=0x00;
data[12]=0x00; //第 3 字節(jié) 數(shù)據(jù)
data[13]=0x00;
data[14]=0x00; //第 5 字節(jié) 數(shù)據(jù)
data[15]=0x00;
data[16]=0x00; //第 7 字節(jié) 數(shù)據(jù)
data[17]=0x00;
data[18]=0x00; //第 9 字節(jié) 數(shù)據(jù)
data[19]=0x00;
data[20]=0x00; //第 11 字節(jié) 數(shù)據(jù)
data[21]=0x00;
data[22]=0x00; //第 13 字節(jié) 數(shù)據(jù)
data[23]=0x00;
data[24]=0x00; //第 15 字節(jié) 數(shù)據(jù)
data[25]=0x00;
for(i=5;i<26;i++)
{
temp+=data[i];
}
data[26]=0x100-temp; //數(shù)據(jù) 校驗(yàn)碼
data[27]=0x00;
SendData(data,28);//往USART1,發(fā)送 length長(zhǎng)度的數(shù)據(jù)data
delay_ms(180);
//while(!flag_rev_finish)
// ;
// flag_rev_finish=0;
//00 00 FF 00 FF 00 00 00 FF 03 FD D5 41 00 EA 00
temp=0;
for(i=11;i<14;i++)
{
temp+=RxBuffer1[i];
}
CheckCode=0x100-temp;
if(CheckCode==RxBuffer1[14])
{
CleanBuffer(40);//清除 串口接收緩沖區(qū)前40 個(gè)字節(jié)數(shù)據(jù)
if((UID_backup[0]!=UID[0])|(UID_backup[1]!=UID[1])|(UID_backup[2]!=UID[2])|(UID_backup[3]!=UID[3]))
{
GPIO_ResetBits(GPIOD,GPIO_Pin_3);//蜂鳴器 叫
delay_ms(50);
GPIO_SetBits(GPIOD, GPIO_Pin_3);//蜂鳴器 不叫
}
UID_backup[0]=UID[0];
UID_backup[1]=UID[1];
UID_backup[2]=UID[2];
UID_backup[3]=UID[3];
}
}
//往USART1,發(fā)送 length長(zhǎng)度的數(shù)據(jù)data
void SendData(u8 *data,u8 length)
{
u8 i;
for(i=0;i<length;i++)
{
USART_SendData(USART2, data[i]);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)//等得發(fā)送完成
{
}
}
}
void CleanBuffer(u16 num)//清零 前 多少個(gè)字節(jié)的數(shù)據(jù)
{
u16 i=0;
for(i=0;i<num;i++)
RxBuffer1[i]=0x00;
}
復(fù)制代碼
所有資料51hei提供下載:
NFC標(biāo)簽讀寫.zip
(290.49 KB, 下載次數(shù): 44)
2020-3-17 09:07 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時(shí)間:
2020-3-17 13:23
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1