|
非接芯片驅(qū)動(dòng)程序
N12_SDK_STC_V1.8.0-MH523
0.png (46.23 KB, 下載次數(shù): 35)
下載附件
2018-2-9 23:00 上傳
單片機(jī)源程序如下:
- /**
- ****************************************************************
- * @file main.c
- *
- * @brief main entry of test.
- *
- * @author
- *
- *
- ****************************************************************
- */
- /*
- * INCLUDE FILES
- ****************************************************************
- */
- #include "define.h"
- #include<stdlib.h>
- #include<stdio.h>
- #include<string.h>
- #include "stc_new_8051.h"
- #include "spi.h"
- #include "uart.h"
- #include "timer.h"
- #include "mh523.h"
- #include "rfid.h"
- #include "iso14443_4.h"
- #include "iso14443a.h"
- #define COM_BUF_SIZE 50
- #define HEAD 0x68
- typedef struct r_w_reg_s
- {
- u8 addr;//讀寫的寄存器地址
- u8 rw_dat;//讀寫的寄存器值
- }r_w_reg;
- typedef struct pc_tx_pkt_s
- {
- u8 head;//包頭
- u8 len; //包長(zhǎng):從包頭到校驗(yàn)和
- u8 cmd; //包命令
- union datu
- {
- r_w_reg reg;
- u8 dat[1];//發(fā)送或接收的數(shù)據(jù)
- }datu;
- }pc_tx_pkt;
- typedef struct lpcd_config_s
- {
- u8 delta;
- u32 t_inactivity_ms;
- u8 skip_times;
- u8 t_detect_us;
- }lpcd_config_t;
- lpcd_config_t XDATA g_lpcd_config;
- static u8 XDATA com_tx_buf[ COM_BUF_SIZE ];//pc to stc
- static u16 tx_buf_index = 0;
- static U8 xdata Snr_RC500[4];
- #if (POWERON_POLLING)
- bit g_query_mode = 1; //手動(dòng)操作芯片模式
- bit g_typa_poll = TRUE;
- bit g_typb_poll = TRUE;
- bit g_need_reconfig = TRUE;//需要重新初始化PCD的協(xié)議類型
- #else
- bit g_query_mode = 0; //手動(dòng)操作芯片模式
- bit g_typa_poll = FALSE;
- bit g_typb_poll = FALSE;
- bit g_need_reconfig = FALSE;//需要重新初始化PCD的協(xié)議類型
- #endif
- u32 XDATA g_polling_cnt = 0;
- bit g_lpcd_started = FALSE; //LPCD周期自動(dòng)探測(cè)卡功能是否開啟
- bit g_lpcd_config_test_start = FALSE;//LPCD周期自動(dòng)探測(cè)卡功能是否開啟
- pc_tx_pkt XDATA *recv_packet(void);
- char prase_packet(pc_tx_pkt XDATA *ppkt);
- void discard_pc_pkt(pc_tx_pkt XDATA *ppkt);
- u8 check_sum(u8 XDATA *buf, int len)
- {
- u8 sum = 0;
- while (len--)
- sum += *buf++;
- return sum;
- }
- void make_packet(u8 cmd, u8 *buf, u8 len)
- {
- u8 sum = 0;
- sum += HEAD;
- sendc(HEAD);
- sum += len + 4;
- sendc(len + 4);
- sum += cmd;
- sendc(cmd);
- while (len--)
- {
- sendc(*buf);
- sum += *buf++;
- }
- sendc(sum);
- }
- pc_tx_pkt XDATA * recv_packet(void)
- {
- pc_tx_pkt *XDATA ppkt;
-
- while(get_bytes() && tx_buf_index < COM_BUF_SIZE )
- {
- com_tx_buf[tx_buf_index] = _getkey() ;
- tx_buf_index++;
- }
- if ( tx_buf_index >= 4 )
- {
- u8 i;
- u8 rest = 4;
-
- for (i=0; i<tx_buf_index-3; )//
- {
- ppkt = (pc_tx_pkt *)(com_tx_buf + i);
- if (ppkt->head == 0x68 && ppkt->len > 0
- && ppkt->len + i < COM_BUF_SIZE)//判斷是不是能接受完包
- {
-
- if (ppkt->len + i <= tx_buf_index)//判斷該包有沒(méi)有接受完包?
- {
- u8 sum = check_sum((u8 XDATA *)ppkt, ppkt->len - 1);
-
- if (sum == ppkt->datu.dat[ppkt->len - 4] )
- {
- return ppkt;
- }
- else
- {
- i++;
- }
- }
- else
- {
- rest = tx_buf_index - i;
- break;
- }
- }
- else
- {
- i++;
- }
- }
- memmove(com_tx_buf, com_tx_buf + tx_buf_index - rest, rest);
- tx_buf_index = rest;
- }
- return NULL;
- }
- char prase_packet(pc_tx_pkt XDATA *ppkt)
- {
- switch(ppkt->cmd)
- {
- case COM_PKT_CMD_READ_REG: //要求把地址和值都返回給pc
- {
- r_w_reg XDATA reg;
- reg.addr = ppkt->datu.reg.addr;
- reg.rw_dat = read_reg(ppkt->datu.reg.addr);
-
- make_packet(COM_PKT_CMD_READ_REG, (u8 *)®, sizeof(reg));
- break;
- }
-
- case COM_PKT_CMD_WRITE_REG:
- {
- write_reg(ppkt->datu.reg.addr, ppkt->datu.reg.rw_dat);
- break;
- }
- case COM_PKT_CMD_QUERY_MODE:
- {
- if (ppkt->datu.dat[0] == 1)
- {
- g_query_mode = TRUE;
- if (ppkt->datu.dat[1] == 1)
- {//typeA poll
- pcd_config('A');
- g_typa_poll = TRUE;
- }
- else
- {
- g_typa_poll = FALSE;
- }
- if (ppkt->datu.dat[2] == 1)
- {//typeB poll
- pcd_config('B');
- g_typb_poll = TRUE;
- }
- else
- {
- g_typb_poll = FALSE;
- }
- if (g_typa_poll && g_typb_poll)
- {
- g_need_reconfig = TRUE;
- }
- else
- {
- g_need_reconfig = FALSE;
- }
- g_polling_cnt = *((u32*)&ppkt->datu.dat[3]);
- printf("g_polling_cnt=%lu\n", g_polling_cnt);
- }
- else
- {
- g_query_mode = FALSE;
- }
- break;
- }
- case COM_PKT_CMD_CHIP_RESET:
- {
- pcd_reset();
- mdelay(7);//carrier off 7ms
- pcd_antenna_on();
- break;
- }
- case COM_PKT_CMD_HALT:
- {
- pcd_hlta();
- printf("HltA\n");
- break;
- }
- case COM_PKT_CMD_LPCD:
- {
- g_lpcd_started = TRUE;
- pcd_lpcd_start();
- break;
- }
- case COM_PKT_CMD_LPCD_CONFIG_TEST:
- {
- int XDATA z;
- memcpy(&g_lpcd_config, &ppkt->datu.dat[0], sizeof(g_lpcd_config));
- for (z = 0; z < sizeof(g_lpcd_config);z++)
- {
- printf(" %02x", ppkt->datu.dat[z]);
- }
- 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);
- 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);
- g_lpcd_config_test_start = TRUE;
- break;
- }
- case COM_PKT_CMD_LPCD_CONFIG_TEST_STOP:
- {
- pcd_lpcd_end();
- g_lpcd_config_test_start = FALSE;
- break;
- }
-
- default:
- return FALSE;
- //break;
- }
- return TRUE;
- }
- void discard_pc_pkt(pc_tx_pkt XDATA *ppkt)
- {
- int bytes;
- u8 XDATA *p = ((u8 XDATA *)ppkt) + ppkt->len;
- bytes = (p - com_tx_buf);
- if (bytes <= tx_buf_index)
- {
- memmove(com_tx_buf, com_tx_buf + bytes, tx_buf_index - bytes);
- tx_buf_index -= bytes;
- }
- else
- {
- tx_buf_index = 0;
- }
- }
- void main()
- {
- pc_tx_pkt XDATA *ppkt;
- tick XDATA g_statistic_last_t = 0;
- u8 XDATA status;
- //復(fù)位鍵下載功能支持代碼
- if((PCON&0x10)==0) //如果POF位=0
- {
- PCON=PCON|0x10; //將POF位置1
- IAP_CONTR=0x60; //軟復(fù)位,從ISP監(jiān)控區(qū)啟動(dòng)
- }
- else
- {
- PCON=PCON&0xef; //將POF位清零
- }
- led_success_on();
- led_fail_on();
-
- init_uart();
- init_timer0();
- EA = 1;
- init_spi();
- EA = 1;
-
- printf("NFC_SDK_STC_V%s start...\n", VERSION);
-
- pcd_init();//初始化pcd寄存器
- rfid_init();//初始化rfid本地變量
- while(1)
- {
-
- ppkt = recv_packet();
- if (ppkt)
- {
- //檢查是否是調(diào)試命令包
- if (FALSE == prase_packet(ppkt))
- {
- //RFID命令包
- rfid_operation(&ppkt->cmd);
- }
- discard_pc_pkt(ppkt);
- }
- //自動(dòng)輪詢尋卡模式
- if (g_query_mode && (g_typa_poll || g_typb_poll))
- {
- u8 cmd[2];
- u8 status_a = 1, status_b = 1;
- pcd_antenna_off();
- mdelay(10);
- pcd_antenna_on();
- mdelay(10);
-
- if (g_typa_poll == TRUE)
- {
- if (g_typa_poll & g_typb_poll)
- {
- pcd_config('A');
- }
- cmd[1] = 0x52;
- //pcd_default_info();
-
- status_a = com_reqa(&cmd);//詢所有A卡
- }
-
- if (g_typb_poll == TRUE)
- {
- if (g_typa_poll & g_typb_poll)
- {
- pcd_config('B');
- }
- cmd[1] = 0x08;
- status_b = com_reqb(&cmd);//詢所有B卡
- }
-
- //點(diǎn)亮對(duì)應(yīng)燈
- if (status_a == MI_OK || status_b == MI_OK)
- {
- led_success_on();//成功
- }
- else
- {
- led_fail_on();//失敗
- }
-
- }
- //cos指令輪詢操作
- if (g_cos_loop == TRUE)
- {
- if (g_cos_loop_times > 0)
- {
- com_exchange(g_loop_buf);
- g_cos_loop_times--;
- mdelay(20);
- }
- else
- {
- mdelay(200);
- g_cos_loop = FALSE;
- g_statistic_refreshed = TRUE;
- statistic_print();
- make_packet(COM_PKT_CMD_TEST_STOP, NULL, NULL);
- }
- }
-
- //自動(dòng)卡檢測(cè)
- if (g_lpcd_started == TRUE)
- {
- if (TRUE == pcd_lpcd_check())
- {
- g_lpcd_started = FALSE;
- make_packet(COM_PKT_CMD_LPCD, NULL, NULL);
- }
- }
- //自動(dòng)卡檢測(cè)參數(shù)測(cè)試
- if (g_lpcd_config_test_start == TRUE)
- {
- if (TRUE == pcd_lpcd_check())
- {
- u8 XDATA tag_type[2];
-
- g_statistics.lpcd_cnt++;
- g_statistic_refreshed = TRUE;
- statistic_print();
-
- //驗(yàn)證是否有卡入場(chǎng)
- pcd_config('A');
- status = pcd_request(0x52, tag_type);
- //剛檢測(cè)到卡時(shí)可能處于距離邊緣,有可能第一次尋卡失敗,所以增加第二次尋卡驗(yàn)證
- if (status != MI_OK)
- {
- status = pcd_request(0x52, tag_type);
- }
- ///剛檢測(cè)到卡時(shí)可能處于距離邊緣,如果前兩次尋卡失敗,則第三次尋卡驗(yàn)證
- if (status != MI_OK)
- {
- status = pcd_request(0x52, tag_type);
- }
-
- if (status == MI_OK)
- {//有卡片入場(chǎng)
- //可添加具體的應(yīng)用功能代碼
- /*
- */
- //等待卡離場(chǎng),應(yīng)用代碼中可不必等待離場(chǎng)
- while(1)
- {
- pcd_antenna_off();
- mdelay(10);
- pcd_antenna_on();
- mdelay(10);
- status = pcd_request(0x52, tag_type);
- if(status != MI_OK)
- {//一次驗(yàn)證卡離場(chǎng)
- mdelay(100);
- status = pcd_request(0x52, tag_type);
- if(status != MI_OK)
- {//二次驗(yàn)證卡離場(chǎng)
- mdelay(100);
- status = pcd_request(0x52, tag_type);
- if(status != MI_OK)
- {//三次驗(yàn)證卡離場(chǎng)
- mdelay(100);
- 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);
- break;
- }
- }
-
- }
- }
- }
- else
- {
- g_statistics.lpcd_fail++;
- g_statistic_refreshed = TRUE;
- 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);
- }
- }
- }
- //輸出統(tǒng)計(jì)信息
- if (is_timeout(g_statistic_last_t, 100))
- {
- g_statistic_last_t = get_tick();
- statistic_print();
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
N12_SDK_STC_V1.8.0-MH523.zip
(191.79 KB, 下載次數(shù): 37)
2018-2-9 20:22 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|