找回密码
 立即注册

QQ登录

只需一步,快速开始

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

兆讯1608 RFID芯片N12_SDK_STC_V1.8.0 RC523单片机源码下载

[复制链接]
跳转到指定楼层
楼主
非接芯片驱动程序
N12_SDK_STC_V1.8.0-MH523



单片机源程序如下:
  1. /**
  2. ****************************************************************
  3. * @file main.c
  4. *
  5. * @brief  main entry of test.
  6. *
  7. * @author
  8. *
  9. *
  10. ****************************************************************
  11. */

  12. /*
  13. * INCLUDE FILES
  14. ****************************************************************
  15. */
  16. #include "define.h"

  17. #include<stdlib.h>
  18. #include<stdio.h>
  19. #include<string.h>

  20. #include "stc_new_8051.h"
  21. #include "spi.h"
  22. #include "uart.h"
  23. #include "timer.h"

  24. #include "mh523.h"

  25. #include "rfid.h"
  26. #include "iso14443_4.h"
  27. #include "iso14443a.h"


  28. #define COM_BUF_SIZE 50
  29. #define HEAD 0x68



  30. typedef struct r_w_reg_s
  31. {
  32.         u8 addr;//读写的寄存器地址
  33.         u8 rw_dat;//读写的寄存器值
  34. }r_w_reg;

  35. typedef struct pc_tx_pkt_s
  36. {
  37.         u8 head;//包头
  38.         u8 len; //包长:从包头到校验和
  39.         u8 cmd;        //包命令

  40.         union datu
  41.         {
  42.                 r_w_reg reg;
  43.                 u8 dat[1];//发送或接收的数据
  44.         }datu;
  45. }pc_tx_pkt;

  46. typedef struct lpcd_config_s
  47. {
  48.         u8 delta;
  49.         u32 t_inactivity_ms;
  50.         u8 skip_times;
  51.         u8 t_detect_us;
  52. }lpcd_config_t;

  53. lpcd_config_t XDATA g_lpcd_config;
  54. static u8 XDATA com_tx_buf[ COM_BUF_SIZE ];//pc to stc
  55. static u16 tx_buf_index = 0;
  56. static U8 xdata Snr_RC500[4];

  57. #if (POWERON_POLLING)
  58.         bit g_query_mode = 1; //手动操作芯片模式
  59.         bit g_typa_poll = TRUE;
  60.         bit g_typb_poll = TRUE;
  61.         bit g_need_reconfig = TRUE;//需要重新初始化PCD的协议类型
  62. #else
  63.         bit g_query_mode = 0; //手动操作芯片模式
  64.         bit g_typa_poll = FALSE;
  65.         bit g_typb_poll = FALSE;
  66.         bit g_need_reconfig = FALSE;//需要重新初始化PCD的协议类型
  67. #endif

  68. u32 XDATA g_polling_cnt = 0;
  69. bit g_lpcd_started = FALSE; //LPCD周期自动探测卡功能是否开启
  70. bit g_lpcd_config_test_start = FALSE;//LPCD周期自动探测卡功能是否开启
  71. pc_tx_pkt XDATA *recv_packet(void);
  72. char prase_packet(pc_tx_pkt XDATA *ppkt);
  73. void discard_pc_pkt(pc_tx_pkt XDATA *ppkt);






  74. u8 check_sum(u8 XDATA *buf, int len)
  75. {
  76.         u8 sum = 0;

  77.         while (len--)
  78.                 sum += *buf++;

  79.         return sum;
  80. }

  81. void make_packet(u8 cmd, u8 *buf, u8 len)
  82. {
  83.         u8 sum = 0;

  84.         sum += HEAD;
  85.         sendc(HEAD);
  86.         sum += len + 4;
  87.         sendc(len + 4);        
  88.         sum += cmd;
  89.         sendc(cmd);

  90.         while (len--)
  91.         {
  92.                 sendc(*buf);
  93.                 sum += *buf++;
  94.         }
  95.         sendc(sum);
  96. }

  97. pc_tx_pkt XDATA *        recv_packet(void)
  98. {
  99.         pc_tx_pkt *XDATA ppkt;
  100.         
  101.         while(get_bytes() && tx_buf_index < COM_BUF_SIZE )
  102.         {
  103.                 com_tx_buf[tx_buf_index] = _getkey() ;
  104.                 tx_buf_index++;
  105.         }
  106.         if ( tx_buf_index >= 4 )
  107.         {
  108.                 u8 i;
  109.                 u8 rest = 4;
  110.                
  111.                 for (i=0; i<tx_buf_index-3; )//
  112.                 {
  113.                         ppkt = (pc_tx_pkt *)(com_tx_buf + i);
  114.                         if (ppkt->head == 0x68 && ppkt->len > 0
  115.                                 && ppkt->len + i < COM_BUF_SIZE)//判断是不是能接受完包
  116.                         {
  117.                                 
  118.                                 if (ppkt->len + i <= tx_buf_index)//判断该包有没有接受完包?
  119.                                 {
  120.                                         u8 sum = check_sum((u8 XDATA *)ppkt, ppkt->len - 1);
  121.                                        
  122.                                         if (sum == ppkt->datu.dat[ppkt->len - 4] )
  123.                                         {        
  124.                                                 return ppkt;
  125.                                         }
  126.                                         else
  127.                                         {
  128.                                                 i++;
  129.                                         }
  130.                                 }
  131.                                 else
  132.                                 {
  133.                                          rest = tx_buf_index - i;
  134.                                          break;
  135.                                 }
  136.                         }
  137.                         else
  138.                         {
  139.                                 i++;
  140.                         }
  141.                 }
  142.                 memmove(com_tx_buf, com_tx_buf + tx_buf_index - rest, rest);
  143.                 tx_buf_index = rest;
  144.         }                        

  145.         return NULL;
  146. }

  147. char prase_packet(pc_tx_pkt XDATA *ppkt)
  148. {
  149.         switch(ppkt->cmd)
  150.         {
  151.                 case COM_PKT_CMD_READ_REG:        //要求把地址和值都返回给pc
  152.                 {
  153.                         r_w_reg XDATA reg;                        
  154.                         reg.addr = ppkt->datu.reg.addr;
  155.                         reg.rw_dat = read_reg(ppkt->datu.reg.addr);               
  156.                                 
  157.                         make_packet(COM_PKT_CMD_READ_REG, (u8 *)®, sizeof(reg));
  158.                         break;
  159.                 }
  160.                
  161.                 case COM_PKT_CMD_WRITE_REG:
  162.                 {               
  163.                         write_reg(ppkt->datu.reg.addr, ppkt->datu.reg.rw_dat);
  164.                         break;
  165.                 }

  166.                 case COM_PKT_CMD_QUERY_MODE:
  167.                 {
  168.                         if (ppkt->datu.dat[0] == 1)
  169.                         {
  170.                                 g_query_mode = TRUE;
  171.                                 if (ppkt->datu.dat[1] == 1)
  172.                                 {//typeA poll
  173.                                         pcd_config('A');
  174.                                         g_typa_poll = TRUE;
  175.                                 }
  176.                                 else
  177.                                 {
  178.                                         g_typa_poll = FALSE;
  179.                                 }
  180.                                 if (ppkt->datu.dat[2] == 1)
  181.                                 {//typeB poll
  182.                                         pcd_config('B');
  183.                                         g_typb_poll = TRUE;
  184.                                 }
  185.                                 else
  186.                                 {
  187.                                         g_typb_poll = FALSE;
  188.                                 }
  189.                                 if (g_typa_poll && g_typb_poll)
  190.                                 {
  191.                                         g_need_reconfig = TRUE;
  192.                                 }
  193.                                 else
  194.                                 {
  195.                                         g_need_reconfig = FALSE;
  196.                                 }
  197.                                 g_polling_cnt = *((u32*)&ppkt->datu.dat[3]);
  198.                                 printf("g_polling_cnt=%lu\n", g_polling_cnt);
  199.                         }
  200.                         else
  201.                         {
  202.                                 g_query_mode = FALSE;
  203.                         }

  204.                         break;
  205.                 }
  206.                 case COM_PKT_CMD_CHIP_RESET:
  207.                 {
  208.                         pcd_reset();
  209.                         mdelay(7);//carrier off 7ms
  210.                         pcd_antenna_on();
  211.                 break;
  212.                 }
  213.                 case COM_PKT_CMD_HALT:
  214.                 {
  215.                         pcd_hlta();
  216.                         printf("HltA\n");
  217.                          break;
  218.                 }
  219.                 case COM_PKT_CMD_LPCD:
  220.                 {
  221.                         g_lpcd_started = TRUE;
  222.                         pcd_lpcd_start();
  223.                         break;
  224.                 }
  225.                 case COM_PKT_CMD_LPCD_CONFIG_TEST:
  226.                 {
  227.                         int XDATA z;
  228.                         memcpy(&g_lpcd_config, &ppkt->datu.dat[0], sizeof(g_lpcd_config));
  229.                         for (z = 0; z < sizeof(g_lpcd_config);z++)
  230.                         {
  231.                                 printf(" %02x", ppkt->datu.dat[z]);
  232.                         }
  233.                         pcd_lpcd_config_start(g_lpcd_config.delta, g_lpcd_config.t_inactivity_ms, g_lpcd_config.skip_times, g_lpcd_config.t_detect_us);        
  234.                         printf("config=%bd,%lu,%bd,%bd\n",g_lpcd_config.delta, g_lpcd_config.t_inactivity_ms, g_lpcd_config.skip_times, g_lpcd_config.t_detect_us);
  235.                         g_lpcd_config_test_start = TRUE;
  236.                         break;
  237.                 }
  238.                 case COM_PKT_CMD_LPCD_CONFIG_TEST_STOP:
  239.                 {
  240.                         pcd_lpcd_end();
  241.                         g_lpcd_config_test_start = FALSE;
  242.                         break;
  243.                 }
  244.         
  245.                 default:
  246.                         return FALSE;
  247.                         //break;
  248.         }
  249.         return TRUE;
  250. }


  251. void discard_pc_pkt(pc_tx_pkt XDATA *ppkt)
  252. {
  253.         int bytes;
  254.         u8 XDATA *p = ((u8 XDATA *)ppkt) + ppkt->len;

  255.         bytes = (p - com_tx_buf);
  256.         if (bytes <= tx_buf_index)
  257.         {
  258.                 memmove(com_tx_buf, com_tx_buf + bytes, tx_buf_index - bytes);
  259.                 tx_buf_index -= bytes;
  260.         }
  261.         else
  262.         {
  263.                 tx_buf_index = 0;
  264.         }
  265. }




  266. void main()
  267. {
  268.         pc_tx_pkt XDATA *ppkt;
  269.         tick XDATA g_statistic_last_t = 0;
  270.         u8 XDATA status;

  271.         //复位键下载功能支持代码
  272.     if((PCON&0x10)==0) //如果POF位=0
  273.     {
  274.        PCON=PCON|0x10;  //将POF位置1
  275.        IAP_CONTR=0x60;  //软复位,从ISP监控区启动
  276.     }
  277.     else
  278.     {
  279.        PCON=PCON&0xef;  //将POF位清零
  280.     }

  281.         led_success_on();
  282.         led_fail_on();
  283.         
  284.         init_uart();
  285.         init_timer0();
  286.         EA = 1;
  287.         init_spi();
  288.         EA = 1;
  289.         
  290.         printf("NFC_SDK_STC_V%s start...\n", VERSION);
  291.         
  292.         pcd_init();//初始化pcd寄存器
  293.         rfid_init();//初始化rfid本地变量

  294.         while(1)
  295.         {
  296.                
  297.                 ppkt = recv_packet();
  298.                 if (ppkt)
  299.                 {
  300.                         //检查是否是调试命令包
  301.                         if (FALSE == prase_packet(ppkt))
  302.                         {
  303.                                 //RFID命令包
  304.                                 rfid_operation(&ppkt->cmd);
  305.                         }
  306.                         discard_pc_pkt(ppkt);
  307.                 }

  308.                 //自动轮询寻卡模式
  309.                 if (g_query_mode && (g_typa_poll || g_typb_poll))
  310.                 {
  311.                         u8 cmd[2];
  312.                         u8 status_a = 1, status_b = 1;

  313.                         pcd_antenna_off();
  314.                         mdelay(10);
  315.                         pcd_antenna_on();
  316.                         mdelay(10);
  317.                         
  318.                         if (g_typa_poll == TRUE)
  319.                         {
  320.                                 if (g_typa_poll & g_typb_poll)
  321.                                 {
  322.                                         pcd_config('A');
  323.                                 }
  324.                                 cmd[1] = 0x52;

  325.                                 //pcd_default_info();
  326.                                        
  327.                                 status_a = com_reqa(&cmd);//询所有A卡                                
  328.                         }
  329.                
  330.                         if (g_typb_poll == TRUE)
  331.                         {        
  332.                                 if (g_typa_poll & g_typb_poll)
  333.                                 {
  334.                                         pcd_config('B');
  335.                                 }                        
  336.                                 cmd[1] = 0x08;
  337.                                 status_b = com_reqb(&cmd);//询所有B卡
  338.                         }
  339.                
  340.                         //点亮对应灯
  341.                         if (status_a == MI_OK || status_b == MI_OK)
  342.                         {
  343.                                 led_success_on();//成功
  344.                         }
  345.                         else
  346.                         {
  347.                                 led_fail_on();//失败
  348.                         }
  349.                
  350.                 }

  351.                 //cos指令轮询操作
  352.                 if (g_cos_loop == TRUE)
  353.                 {
  354.                         if (g_cos_loop_times > 0)
  355.                         {
  356.                                 com_exchange(g_loop_buf);
  357.                                 g_cos_loop_times--;
  358.                                 mdelay(20);
  359.                         }
  360.                         else
  361.                         {
  362.                                 mdelay(200);
  363.                                 g_cos_loop = FALSE;
  364.                                 g_statistic_refreshed = TRUE;
  365.                                 statistic_print();
  366.                                 make_packet(COM_PKT_CMD_TEST_STOP, NULL, NULL);
  367.                         }
  368.                 }
  369.                
  370.                 //自动卡检测
  371.                 if (g_lpcd_started == TRUE)
  372.                 {
  373.                         if (TRUE == pcd_lpcd_check())
  374.                         {
  375.                                 g_lpcd_started = FALSE;
  376.                                 make_packet(COM_PKT_CMD_LPCD, NULL, NULL);
  377.                         }
  378.                 }
  379.                 //自动卡检测参数测试
  380.                 if (g_lpcd_config_test_start == TRUE)
  381.                 {
  382.                         if (TRUE == pcd_lpcd_check())
  383.                         {
  384.                                 u8 XDATA tag_type[2];
  385.                                        
  386.                                 g_statistics.lpcd_cnt++;
  387.                                 g_statistic_refreshed = TRUE;
  388.                                 statistic_print();
  389.                                 
  390.                                 //验证是否有卡入场
  391.                                 pcd_config('A');
  392.                                 status = pcd_request(0x52, tag_type);
  393.                                 //刚检测到卡时可能处于距离边缘,有可能第一次寻卡失败,所以增加第二次寻卡验证
  394.                                 if (status != MI_OK)
  395.                                 {                                       
  396.                                         status = pcd_request(0x52, tag_type);
  397.                                 }
  398.                                 ///刚检测到卡时可能处于距离边缘,如果前两次寻卡失败,则第三次寻卡验证
  399.                                 if (status != MI_OK)
  400.                                 {                                       
  401.                                         status = pcd_request(0x52, tag_type);
  402.                                 }
  403.                                 
  404.                                 if (status == MI_OK)
  405.                                 {//有卡片入场
  406.                                         //可添加具体的应用功能代码
  407.                                         /*



  408.                                         */
  409.                                         //等待卡离场,应用代码中可不必等待离场
  410.                                         while(1)
  411.                                         {
  412.                                                 pcd_antenna_off();
  413.                                                 mdelay(10);
  414.                                                 pcd_antenna_on();
  415.                                                 mdelay(10);        
  416.                                                 status = pcd_request(0x52, tag_type);
  417.                                                 if(status != MI_OK)
  418.                                                 {//一次验证卡离场
  419.                                                         mdelay(100);
  420.                                                         status = pcd_request(0x52, tag_type);
  421.                                                         if(status != MI_OK)
  422.                                                         {//二次验证卡离场
  423.                                                                 mdelay(100);
  424.                                                                 status = pcd_request(0x52, tag_type);
  425.                                                                 if(status != MI_OK)
  426.                                                                 {//三次验证卡离场
  427.                                                                         mdelay(100);
  428.                                                                         pcd_lpcd_config_start(g_lpcd_config.delta, g_lpcd_config.t_inactivity_ms, g_lpcd_config.skip_times, g_lpcd_config.t_detect_us);        
  429.                                                                         break;        
  430.                                                                 }
  431.                                                         }
  432.         
  433.                                                 }
  434.                                         }
  435.                                 }
  436.                                 else
  437.                                 {
  438.                                         g_statistics.lpcd_fail++;
  439.                                         g_statistic_refreshed = TRUE;
  440.                                         pcd_lpcd_config_start(g_lpcd_config.delta, g_lpcd_config.t_inactivity_ms, g_lpcd_config.skip_times, g_lpcd_config.t_detect_us);        
  441.                                 }
  442.                         }
  443.                 }
  444.                 //输出统计信息
  445.                 if (is_timeout(g_statistic_last_t, 100))
  446.                 {
  447.                         g_statistic_last_t = get_tick();
  448.                         statistic_print();
  449.                 }
  450.         }               
  451. }

复制代码

所有资料51hei提供下载:
N12_SDK_STC_V1.8.0-MH523.zip (191.79 KB, 下载次数: 37)




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

使用道具 举报

沙发
ID:396791 发表于 2018-9-15 09:04 | 只看该作者
楼主有没有这资料对应实物的淘宝链接,求分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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