找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3258|回复: 1
打印 上一主题 下一主题
收起左侧

PN532 NFC标签读写 STM32程序源代码

[复制链接]
跳转到指定楼层
楼主
ID:709528 发表于 2020-3-17 09:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
附件是关于NFC标签的读写程序源码,大家可参考,适合新手学习

单片机源程序如下:
  1. #include "nfc.h"

  2. #include"delay.h"
  3. u32 Uart0_rev_countmap;//串口读取的数据长度
  4. u8 RxBuffer1[500];
  5. extern u8 flag_1; //第一次 读出 UID码成功
  6. extern u8 flag_2;
  7. extern u8 flag_3;
  8. u8 flag_rev_finish;//串口接收到数据的标志, 1为接收到
  9. u8 flag_nfc_status;
  10. u8 UID[4]; //存储 UID
  11. extern u8 UID_backup[4];//UID备份  用于处理 不连续写同一卡

  12. ////55 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 03 FD D4 14 01 17 00  
  13. void nfc_WakeUp(void)
  14. {
  15.     u8 data[24];
  16.     u8 i;
  17.     u8 CheckCode=0; //数据校验码
  18.     u8 temp=0;
  19.   
  20.     while(1)
  21.     {
  22.         flag_rev_finish=0;
  23.         data[0]=0x55;
  24.         data[1]=0x55;
  25.         data[2]=0x00;
  26.         data[3]=0x00;
  27.         data[4]=0x00;
  28.         data[5]=0x00;
  29.         data[6]=0x00;
  30.         data[7]=0x00;
  31.         data[8]=0x00;
  32.         data[9]=0x00;
  33.         data[10]=0x00;
  34.         data[11]=0x00;
  35.         data[12]=0x00;
  36.         data[13]=0x00;
  37.         data[14]=0x00;
  38.         data[15]=0x00;
  39.         
  40.         data[16]=0xFF;
  41.         data[17]=0x03; //包 长度
  42.         data[18]=0xFD; //包 长度 校验  0x100-data[3]
  43.         data[19]=0xD4; //命令标识码
  44.         data[20]=0x14; //命令标识码
  45.         data[21]=0x01;
  46.         data[22]=0x17; //数据 校验   0x100-
  47.         data[23]=0x00;
  48.         
  49.         SendData(data,24);//往USART1,发送 length长度的数据data
  50.         delay_ms(180);
  51.       
  52.       
  53.    //00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00   
  54.         if(flag_rev_finish)
  55.         {         
  56.             flag_rev_finish=0;
  57.             for(i=11;i<13;i++)
  58.             {
  59.                 temp+=RxBuffer1[i];
  60.             }
  61.             CheckCode=0x100-temp;
  62.             if(CheckCode==RxBuffer1[13])
  63.             {
  64.                 CheckCode=0x100-temp;
  65.                 CleanBuffer(40);//清除 串口接收缓冲区前30 个字节数据

  66.                 break;
  67.             }
  68.         }
  69.     }
  70. }

  71. //配置 106 kbps type A (ISO/IEC14443 Type A),
  72. //00 00 FF 04 FC D4 4A 01 00 E1 00
  73. void  nfc_InListPassiveTarget(void)
  74. {
  75.     u8 data[11];
  76.     u8 i;
  77.     u8 CheckCode=0; //数据校验码
  78.     u8 temp=0;
  79.     while(1)
  80.     {   
  81.         flag_rev_finish=0;
  82.         data[0]=0x00;
  83.         data[1]=0x00;
  84.         data[2]=0xFF;
  85.         data[3]=0x04; //包 长度
  86.         data[4]=0xFC; //包 长度 校验  0x100-data[3]
  87.         data[5]=0xD4; //命令标识码
  88.         data[6]=0x4A; //命令标识码
  89.         data[7]=0x01;
  90.         data[8]=0x00;
  91.         data[9]=0xE1; //数据 校验   0x100-
  92.         data[10]=0x00;
  93.         
  94.         SendData(data,11);//往USART1,发送 length长度的数据data
  95.         delay_ms(180);
  96.       
  97.         temp=0;
  98.         if(flag_rev_finish)
  99.         {         
  100.             flag_rev_finish=0;
  101.             for(i=11;i<23;i++)
  102.             {
  103.                 temp+=RxBuffer1[i];
  104.             }
  105.             CheckCode=0x100-temp;
  106.             if(CheckCode==RxBuffer1[23])
  107.             {
  108.                 UID[0]=RxBuffer1[19];
  109.                 UID[1]=RxBuffer1[20];
  110.                 UID[2]=RxBuffer1[21];
  111.                 UID[3]=RxBuffer1[22];  
  112.                
  113.                 CleanBuffer(40);//清除 串口接收缓冲区前30 个字节数据
  114.                 break;
  115.             }
  116.         }
  117.     }
  118. }


  119. // 密码授权,验证KeyA
  120. //00 00 FF 0F F1 D4 40 01 60 03 FF FF FF FF FF FF UID1 UID2 UID3 UID4 2A 00
  121. //00 00 FF 0F F1 D4 40 01 60 03 FF FF FF FF FF FF 94 8A 3B 0B 2A 00
  122. void  nfc_PsdVerifyKeyA(void)
  123. {
  124.     u8 data[22];
  125.     u8 temp=0;
  126.     u8 i;
  127.     u8 CheckCode=0; //数据校验码
  128.      flag_rev_finish=0;
  129.     data[0]=0x00;
  130.     data[1]=0x00;
  131.     data[2]=0xFF;
  132.    
  133.     data[3]=0x0F; //包 长度
  134.     data[4]=0xF1; //包 长度 校验  0x100-data[3]
  135.    
  136.     data[5]=0xD4; //命令标识码
  137.     data[6]=0x40; //命令标识码
  138.    
  139.     data[7]=0x01;
  140.     data[8]=0x60;
  141.     data[9]=0x03;
  142.    
  143.     data[10]=0xFF; //KEY A 密码 FF FF FF FF FF FF
  144.     data[11]=0xFF;
  145.     data[12]=0xFF;
  146.     data[13]=0xFF;
  147.     data[14]=0xFF;
  148.     data[15]=0xFF;
  149.    
  150.     data[16]=UID[0];
  151.     data[17]=UID[1];
  152.     data[18]=UID[2];
  153.     data[19]=UID[3];
  154.    
  155.     for(i=5;i<20;i++)
  156.     {
  157.         temp+=data[i];
  158.     }

  159.     data[20]=0x100-temp;   //数据 校验   0x100-
  160.    
  161.     data[21]=0x00;
  162.    
  163.     SendData(data,22);//往USART1,发送 length长度的数据data
  164.      
  165.    
  166.    
  167.     delay_ms(180);
  168.    
  169.   // while(!flag_rev_finish)
  170.   //  ;
  171.   // flag_rev_finish=0;
  172.   
  173.    temp=0;
  174.     for(i=11;i<14;i++)
  175.     {
  176.         temp+=RxBuffer1[i];
  177.     }
  178.     CheckCode=0x100-temp;
  179.     if(CheckCode==RxBuffer1[14])
  180.     {
  181.        if(RxBuffer1[13]==0x00)
  182.        {
  183.          CleanBuffer(40);//清除 串口接收缓冲区前40 个字节数据
  184.          
  185.          if(flag_nfc_status==0)
  186.          {         
  187.             nfc_read();
  188.          }
  189.          else if(flag_nfc_status==1)
  190.          {
  191.               nfc_write(0x55);
  192.          }
  193.          else if(flag_nfc_status==2)
  194.          {
  195.               nfc_write(0xAA);
  196.          }

  197.        }
  198.     }
  199. }



  200. //默认 读 02区的16个字节
  201. //00 00 FF 05 FB D4 40 01 30 02 B9 00
  202. void  nfc_read()
  203. {
  204.     u8 data[12];
  205.     u8 temp=0;
  206.     u8 i;
  207.     u8 CheckCode=0; //数据校验码

  208.     flag_rev_finish=0;
  209.     data[0]=0x00;
  210.     data[1]=0x00;
  211.     data[2]=0xFF;
  212.    
  213.     data[3]=0x05; //包 长度
  214.     data[4]=0xFB; //包 长度 校验  0x100-data[3]
  215.    
  216.     data[5]=0xD4; //命令标识码
  217.     data[6]=0x40; //命令标识码
  218.    
  219.     data[7]=0x01;
  220.     data[8]=0x30;
  221.     data[9]=0x02; //读第二块的16字节数据
  222.    
  223.     data[10]=0xB9; //数据校验
  224.     data[11]=0x00;

  225.     SendData(data,12);//往USART1,发送 length长度的数据data
  226.    
  227.     delay_ms(180);
  228.     //while(!flag_rev_finish)
  229.    // ;
  230.   // flag_rev_finish=0;
  231.   
  232.    temp=0;
  233.     for(i=11;i<30;i++)
  234.     {
  235.         temp+=RxBuffer1[i];
  236.     }
  237.     CheckCode=0x100-temp;
  238.     if(CheckCode==RxBuffer1[30])
  239.     {      
  240.          if(RxBuffer1[14]==0xAA)
  241.          {
  242.             GPIO_SetBits(GPIOA, GPIO_Pin_4);//点亮 D4
  243.          }
  244.          else if(RxBuffer1[14]==0x55)
  245.          {
  246.             GPIO_ResetBits(GPIOA,GPIO_Pin_4);//熄灭 D4
  247.          }
  248.          
  249.          if((UID_backup[0]!=UID[0])|(UID_backup[1]!=UID[1])|(UID_backup[2]!=UID[2])|(UID_backup[3]!=UID[3]))
  250.          {
  251.             GPIO_ResetBits(GPIOD,GPIO_Pin_3);//蜂鸣器 叫
  252.             delay_ms(50);
  253.             GPIO_SetBits(GPIOD, GPIO_Pin_3);//蜂鸣器 不叫
  254.          }
  255.          UID_backup[0]=UID[0];
  256.          UID_backup[1]=UID[1];
  257.          UID_backup[2]=UID[2];
  258.          UID_backup[3]=UID[3];
  259.          
  260.          CleanBuffer(40);//清除 串口接收缓冲区前40 个字节数据
  261.     }
  262. }



  263. //默认往 02区写 16个字节的第一个字节
  264. //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
  265. void  nfc_write(u8 LedData)
  266. {
  267.     u8 data[28];
  268.     u8 temp=0;
  269.     u8 i;
  270.     u8 CheckCode=0;
  271.    
  272.     data[0]=0x00;
  273.     data[1]=0x00;
  274.     data[2]=0xFF;
  275.    
  276.     data[3]=0x15; //包 长度
  277.     data[4]=0xEB; //包 长度 校验  0x100-data[3]
  278.    
  279.     data[5]=0xD4; //命令标识码
  280.     data[6]=0x40; //命令标识码
  281.    
  282.     data[7]=0x01; //读写大于6字节 就置1,看手册
  283.     data[8]=0xA0; //写
  284.     data[9]=0x02; //写第二块的16字节数据
  285.    
  286.     data[10]=LedData; //第 1 字节 数据
  287.     data[11]=0x00;
  288.     data[12]=0x00; //第 3 字节 数据
  289.     data[13]=0x00;
  290.     data[14]=0x00; //第 5 字节 数据
  291.     data[15]=0x00;
  292.     data[16]=0x00; //第 7 字节 数据
  293.     data[17]=0x00;
  294.     data[18]=0x00; //第 9 字节 数据
  295.     data[19]=0x00;
  296.     data[20]=0x00; //第 11 字节 数据
  297.     data[21]=0x00;
  298.     data[22]=0x00; //第 13 字节 数据
  299.     data[23]=0x00;
  300.     data[24]=0x00; //第 15 字节 数据
  301.     data[25]=0x00;
  302.    
  303.     for(i=5;i<26;i++)
  304.     {
  305.         temp+=data[i];
  306.     }
  307.     data[26]=0x100-temp; //数据 校验码
  308.     data[27]=0x00;

  309.     SendData(data,28);//往USART1,发送 length长度的数据data
  310.    
  311.      
  312.     delay_ms(180);
  313.     //while(!flag_rev_finish)
  314.    // ;
  315.   // flag_rev_finish=0;
  316.   //00 00 FF 00 FF 00 00 00 FF 03 FD D5 41 00 EA 00
  317.     temp=0;
  318.     for(i=11;i<14;i++)
  319.     {
  320.         temp+=RxBuffer1[i];
  321.     }
  322.     CheckCode=0x100-temp;
  323.     if(CheckCode==RxBuffer1[14])
  324.     {
  325.          CleanBuffer(40);//清除 串口接收缓冲区前40 个字节数据
  326.          
  327.          if((UID_backup[0]!=UID[0])|(UID_backup[1]!=UID[1])|(UID_backup[2]!=UID[2])|(UID_backup[3]!=UID[3]))
  328.          {
  329.             GPIO_ResetBits(GPIOD,GPIO_Pin_3);//蜂鸣器 叫
  330.             delay_ms(50);
  331.             GPIO_SetBits(GPIOD, GPIO_Pin_3);//蜂鸣器 不叫
  332.          }
  333.          UID_backup[0]=UID[0];
  334.          UID_backup[1]=UID[1];
  335.          UID_backup[2]=UID[2];
  336.          UID_backup[3]=UID[3];
  337.     }
  338. }

  339. //往USART1,发送 length长度的数据data
  340. void SendData(u8 *data,u8 length)
  341. {
  342.     u8 i;
  343.     for(i=0;i<length;i++)
  344.     {
  345.         USART_SendData(USART2, data[i]);
  346.         while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)//等得发送完成
  347.         {
  348.         }  
  349.     }
  350. }

  351. void CleanBuffer(u16 num)//清零 前 多少个字节的数据
  352. {
  353.     u16 i=0;
  354.    
  355.     for(i=0;i<num;i++)
  356.       RxBuffer1[i]=0x00;
  357. }
复制代码

所有资料51hei提供下载:
NFC标签读写.zip (290.49 KB, 下载次数: 44)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2020-3-17 13:23 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表