日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F103+RFID-RC522模块 实现简单读卡写卡demo

發布時間:2023/12/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F103+RFID-RC522模块 实现简单读卡写卡demo 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 前言
    • 特別聲明:
    • 代碼下載:
    • 功能介紹:
  • 接線
    • STM32
      • STM32F1開發指南(精英版)-庫函數版本_V1.2
      • STM32中文參考手冊
    • RFID-RC522
      • RFID射頻模塊電路原理圖
  • 使用圖+效果圖
    • 測試程序0 RC522_Handle()
      • 最終效果
      • 一、先用手機軟件NFC Writer讀取空卡看看內容
        • 1、打開軟件和NFC(ps:我的手機是小米10)
        • 2、將空卡貼于手機背部,彈出提示發現新卡,點擊“好的”
        • 3、上面的新卡片左滑到新卡片1,單擊這個卡片
        • 4、進入卡片信息詳細頁面
          • 鑰匙扣卡
          • M1空白卡
      • 二、編譯、燒寫程序
      • 三、將鑰匙扣卡發在模塊上,打開串口,開始測試
    • 測試程序1 RC522_Handle1()
  • 核心代碼
    • main.c
    • rc522.h
    • rc522.c
  • 額外資料

前言

特別聲明:

  • 本倉庫發布的程序,僅用于測試和學習研究,禁止用于商業用途,不能保證其合法性,準確性,完整性和有效性,請根據情況自行判斷。

  • 本人對任何腳本問題概不負責,包括但不限于由任何腳本錯誤導致的任何損失或損害。

  • 間接使用腳本的任何用戶,包括但不限于建立VPS或在某些行為違反國家/地區法律或相關法規的情況下進行傳播, 本人對于由此引起的任何隱私泄漏或其他后果概不負責。

  • 任何以任何方式查看此項目的人或直接或間接使用該項目的任何程序的使用者都應仔細閱讀此聲明。本人保留隨時更改或補充此免責聲明的權利。一旦使用并復制了任何相關腳本或Script項目的規則,則視為您已接受此免責聲明。

本文不含任何廣告性質,僅供學習參考。寫卡需謹慎!!!,不然可能會玩崩了。血的教訓!!!

參考資料:
淺談IC卡數據分析
智能卡 ISO14443 協議 解讀
STM32F103ZET–RFID-RC522使用例程(戰艦版)
M1卡使用說明書
M1卡介紹
STM32-RC522
Mifare1技術說明(M1卡說明文檔)
源碼參考:RFID-RC522,不能使用,我進行了一定的修改。下載參考下方傳送門。
開發板:正點原子 STM32F103 精英版

語言:C語言
開發環境:Keil5
開發板使用了 LED SPI USART RFID-RC522模塊 鑰匙扣卡 M1卡


Win10軟件 SSCOM串口調試 FlyMcu燒錄(ps:電腦安裝驅動CH340)

安卓軟件 NFC Writer (手機需有NFC功能)

代碼下載:

碼云 GitHub

功能介紹:

尋卡-》防沖撞-》選卡-》驗證2扇區密鑰-》讀取2扇區0區塊數據-》寫入數據到2扇區0區塊-》再讀取2扇區0區塊數據。
串口打印卡UID,驗證結果,讀取到的2扇區0區塊數據等信息。
注意:只有驗證成功的扇區,才能對此扇區進行讀寫操作!

// 驗證A密鑰 塊地址 密碼 SN // 注意:此處的塊地址0x0B即2扇區3區塊,此塊地址只需要指向某一扇區就可以了, // 即2扇區為0x08-0x0B這個范圍都有效,且只能對驗證過的扇區進行讀寫操作 status = PcdAuthState(0x60, 0x0B, KEY_A, SN); // 讀取M1卡一塊數據 塊地址 讀取的數據 // 注意:因為上面驗證的扇區是2扇區,所以只能對2扇區的數據進行讀寫,即0x08-0x0B這個范圍, // 超出范圍讀取失敗。 status = PcdRead(0x08, DATA);

另外:3區塊的密鑰A單片機讀取出來是全00,手機是全ff
控制字的默認值是“FF078069”,此時
A密鑰:不可被讀出,有全部權限
B密鑰:可被讀出,沒有任何權限
下圖參考:https://blog.csdn.net/hiwoshixiaoyu/article/details/104048663

接線

1--SDA <----->PA4 2--SCK <----->PA5 3--MOSI <----->PA7 4--MISO <----->PA6 5--懸空 6--GND <----->GND 7--RST <----->PB0 8--VCC <----->VCC

STM32

STM32F1開發指南(精英版)-庫函數版本_V1.2

STM32中文參考手冊


RFID-RC522

參考:https://www.cirmall.com/circuit/2149/

RFID射頻模塊電路原理圖

使用圖+效果圖

測試程序0 RC522_Handle()

最終效果

一、先用手機軟件NFC Writer讀取空卡看看內容

1、打開軟件和NFC(ps:我的手機是小米10)

2、將空卡貼于手機背部,彈出提示發現新卡,點擊“好的”

3、上面的新卡片左滑到新卡片1,單擊這個卡片

4、進入卡片信息詳細頁面

鑰匙扣卡

M1空白卡


可以發現2張卡除了卡號和卡號異或值不同外,其他數據都一樣,之后的例子都以鑰匙扣卡舉例。
下圖參考:https://blog.csdn.net/hiwoshixiaoyu/article/details/104048663

二、編譯、燒寫程序

三、將鑰匙扣卡發在模塊上,打開串口,開始測試


串口打印

注意 原卡 2扇區0區塊數據為

我們放上卡后,進行了數據寫入,之后讀取到的數據都為DATA1的數據0.0

unsigned char DATA1[16]= {0x12,0x34,0x56,0x78,0x9A,0x00,0xff,0x07,0x80,0x29,0xff,0xff,0xff,0xff,0xff,0xff}; // 0x08 就是2扇區0區塊(即第9塊) unsigned char addr=0x08; status = PcdWrite(addr, DATA1);


此時數據寫入完畢后,我們再將鑰匙扣卡貼于手機,看看現在手機讀取出來的結果

OK,看樣子寫入成功了,那么到此例程就結束了。

測試程序1 RC522_Handle1()

測試程序1,完成0x0F塊 驗證KEY_A、KEY_B 讀 寫RFID1 驗證KEY_A1、KEY_B1 讀 寫RFID2

// 測試用 3區塊數據 unsigned char RFID1[16]= {0x10,0x20,0x30,0x40,0x50,0x60,0xff,0x07,0x80,0x29,0x01,0x02,0x03,0x04,0x05,0x06}; unsigned char RFID2[16]= {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x80,0x29,0xff,0xff,0xff,0xff,0xff,0xff}; // 測試用 3區塊密鑰 u8 KEY_A1[6]= {0x10,0x20,0x30,0x40,0x50,0x60}; u8 KEY_B1[6]= {0x01,0x02,0x03,0x04,0x05,0x06};

核心代碼

main.c

#include "delay.h" #include "sys.h" #include "usart.h" #include "rc522.h" #include "led.h"/** * 連線說明: * 1--SDA <----->PA4 * 2--SCK <----->PA5 * 3--MOSI <----->PA7 * 4--MISO <----->PA6 * 5--懸空 * 6--GND <----->GND * 7--RST <----->PB0 * 8--VCC <----->VCC **/int main(void) {u8 num = 0;delay_init(); //延時函數初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級uart_init(115200); //串口初始化為115200LED_Init();RC522_Init(); //初始化射頻卡模塊while(1){// 重要提醒,寫卡操作有風險,請勿隨意嘗試,不能保證程序安全性,本人對任何程序問題概不負責,不限于由任何程序錯誤導致的任何損失或損害// 測試程序0,完成addr讀寫讀RC522_Handle();// 謹慎使用 測試程序1,完成0x0F塊 驗證KEY_A、KEY_B 讀 寫RFID1 驗證KEY_A1、KEY_B1 讀 寫RFID2// RC522_Handle1();if(num % 20 == 0)LED0 = !LED0;num++;} }

rc522.h

#ifndef __RC522_H #define __RC522_H #include "sys.h" #include "stm32f10x.h"/ //MF522命令字 / #define PCD_IDLE 0x00 //取消當前命令 #define PCD_AUTHENT 0x0E //驗證密鑰 #define PCD_RECEIVE 0x08 //接收數據 #define PCD_TRANSMIT 0x04 //發送數據 #define PCD_TRANSCEIVE 0x0C //發送并接收數據 #define PCD_RESETPHASE 0x0F //復位 #define PCD_CALCCRC 0x03 //CRC計算/ //Mifare_One卡片命令字 / #define PICC_REQIDL 0x26 //尋天線區內未進入休眠狀態 #define PICC_REQALL 0x52 //尋天線區內全部卡 #define PICC_ANTICOLL1 0x93 //防沖撞 #define PICC_ANTICOLL2 0x95 //防沖撞 #define PICC_AUTHENT1A 0x60 //驗證A密鑰 #define PICC_AUTHENT1B 0x61 //驗證B密鑰 #define PICC_READ 0x30 //讀塊 #define PICC_WRITE 0xA0 //寫塊 #define PICC_DECREMENT 0xC0 //扣款 #define PICC_INCREMENT 0xC1 //充值 #define PICC_RESTORE 0xC2 //調塊數據到緩沖區 #define PICC_TRANSFER 0xB0 //保存緩沖區中數據 #define PICC_HALT 0x50 //休眠/ //MF522 FIFO長度定義 / #define DEF_FIFO_LENGTH 64 //FIFO size=64byte #define MAXRLEN 18/ //MF522寄存器定義 / // PAGE 0 #define RFU00 0x00 #define CommandReg 0x01 #define ComIEnReg 0x02 #define DivlEnReg 0x03 #define ComIrqReg 0x04 #define DivIrqReg 0x05 #define ErrorReg 0x06 #define Status1Reg 0x07 #define Status2Reg 0x08 #define FIFODataReg 0x09 #define FIFOLevelReg 0x0A #define WaterLevelReg 0x0B #define ControlReg 0x0C #define BitFramingReg 0x0D #define CollReg 0x0E #define RFU0F 0x0F // PAGE 1 #define RFU10 0x10 #define ModeReg 0x11 #define TxModeReg 0x12 #define RxModeReg 0x13 #define TxControlReg 0x14 #define TxAutoReg 0x15 #define TxSelReg 0x16 #define RxSelReg 0x17 #define RxThresholdReg 0x18 #define DemodReg 0x19 #define RFU1A 0x1A #define RFU1B 0x1B #define MifareReg 0x1C #define RFU1D 0x1D #define RFU1E 0x1E #define SerialSpeedReg 0x1F // PAGE 2 #define RFU20 0x20 #define CRCResultRegM 0x21 #define CRCResultRegL 0x22 #define RFU23 0x23 #define ModWidthReg 0x24 #define RFU25 0x25 #define RFCfgReg 0x26 #define GsNReg 0x27 #define CWGsCfgReg 0x28 #define ModGsCfgReg 0x29 #define TModeReg 0x2A #define TPrescalerReg 0x2B #define TReloadRegH 0x2C #define TReloadRegL 0x2D #define TCounterValueRegH 0x2E #define TCounterValueRegL 0x2F // PAGE 3 #define RFU30 0x30 #define TestSel1Reg 0x31 #define TestSel2Reg 0x32 #define TestPinEnReg 0x33 #define TestPinValueReg 0x34 #define TestBusReg 0x35 #define AutoTestReg 0x36 #define VersionReg 0x37 #define AnalogTestReg 0x38 #define TestDAC1Reg 0x39 #define TestDAC2Reg 0x3A #define TestADCReg 0x3B #define RFU3C 0x3C #define RFU3D 0x3D #define RFU3E 0x3E #define RFU3F 0x3F/ //和MF522通訊時返回的錯誤代碼 / #define MI_OK 0 #define MI_NOTAGERR (1) #define MI_ERR (2)#define SHAQU1 0X01 #define KUAI4 0X04 #define KUAI7 0X07 #define REGCARD 0xa1 #define CONSUME 0xa2 #define READCARD 0xa3 #define ADDMONEY 0xa4// //#define spi_cs 1; //sbit spi_ck=P0^6; //sbit spi_mosi=P0^7; //sbit spi_miso=P4^1; //sbit spi_rst=P2^7; #define SPIReadByte() SPIWriteByte(0) u8 SPIWriteByte(u8 byte); void SPI1_Init(void); //void SPI2_Init(void);#define SET_SPI_CS (GPIOF->BSRR=0X01) #define CLR_SPI_CS (GPIOF->BRR=0X01)#define SET_RC522RST GPIOF->BSRR=0X02 #define CLR_RC522RST GPIOF->BRR=0X02/***********************RC522 函數宏定義**********************/ #define RC522_CS_Enable() GPIO_ResetBits ( GPIOA, GPIO_Pin_4 ) #define RC522_CS_Disable() GPIO_SetBits ( GPIOA, GPIO_Pin_4 )#define RC522_Reset_Enable() GPIO_ResetBits( GPIOB, GPIO_Pin_0 ) #define RC522_Reset_Disable() GPIO_SetBits ( GPIOB, GPIO_Pin_0 )#define RC522_SCK_0() GPIO_ResetBits( GPIOA, GPIO_Pin_5 ) #define RC522_SCK_1() GPIO_SetBits ( GPIOA, GPIO_Pin_5 )#define RC522_MOSI_0() GPIO_ResetBits( GPIOA, GPIO_Pin_7 ) #define RC522_MOSI_1() GPIO_SetBits ( GPIOA, GPIO_Pin_7 )#define RC522_MISO_GET() GPIO_ReadInputDataBit ( GPIOA, GPIO_Pin_6 )void RC522_Handle (void); // 測試程序0,完成addr讀寫讀 void RC522_Handle1 (void); // 測試程序1,完成0x0F塊 驗證KEY_A、KEY_B 讀 寫RFID1 驗證KEY_A1、KEY_B1 讀 寫RFID2 void RC522_data_break (void); // 測試用數據爆破程序,僅供學習參考,請勿非法使用 void RC522_Init ( void ); //初始化 void PcdReset ( void ); //復位 void M500PcdConfigISOType ( u8 type ); //工作方式 char PcdRequest ( u8 req_code, u8 * pTagType ); //尋卡 char PcdAnticoll ( u8 * pSnr); //讀卡號char PcdSelect ( u8 * pSnr ); char PcdAuthState ( u8 ucAuth_mode, u8 ucAddr, u8 * pKey, u8 * pSnr ); char PcdWrite ( u8 ucAddr, u8 * pData ); char PcdRead ( u8 ucAddr, u8 * pData ); void ShowID(u8 *p); //顯示卡的卡號,以十六進制顯示extern char* POINT_LNG; extern char* POINT_LAT; extern char* POINT_LNG_ON; extern char* POINT_LAT_ON; extern char* POINT_LNG_OFF; extern char* POINT_LAT_OFF;#endif

rc522.c

#include "sys.h" #include "rc522.h" #include "delay.h" #include "usart.h" #include "string.h"// // M1卡分為16個扇區,每個扇區由四個塊(塊0、塊1、塊2、塊3)組成 // 將16個扇區的64個塊按絕對地址編號為:0~63 // 第0個扇區的塊0(即絕對地址0塊),用于存放廠商代碼,已經固化不可更改 // 每個扇區的塊0、塊1、塊2為數據塊,可用于存放數據 // 每個扇區的塊3為控制塊(絕對地址為:塊3、塊7、塊11.....)包括密碼A,存取控制、密碼B等/******************************* *連線說明: *1--SDA <----->PA4 *2--SCK <----->PA5 *3--MOSI <----->PA7 *4--MISO <----->PA6 *5--懸空 *6--GND <----->GND *7--RST <----->PB0 *8--VCC <----->VCC ************************************//*全局變量*/ unsigned char CT[2];//卡類型 unsigned char SN[4]; //卡號 unsigned char DATA[16]; //存放數據 unsigned char RFID[16]; //存放RFID unsigned char card0_bit=0; unsigned char card1_bit=0; unsigned char card2_bit=0; unsigned char card3_bit=0; unsigned char card4_bit=0; unsigned char total=0; // 這UID定義在這不知道干啥用的。。。 替換成自己卡的UID unsigned char card_0[4]= {73,224,5,152}; unsigned char card_1[4]= {105,102,100,152}; unsigned char card_2[4]= {208,121,31,57}; unsigned char card_3[4]= {176,177,143,165}; unsigned char card_4[4]= {5,158,10,136}; u8 KEY_A[6]= {0xff,0xff,0xff,0xff,0xff,0xff}; u8 KEY_B[6]= {0xff,0xff,0xff,0xff,0xff,0xff}; u8 AUDIO_OPEN[6] = {0xAA, 0x07, 0x02, 0x00, 0x09, 0xBC}; // 測試用 3區塊數據 unsigned char RFID1[16]= {0x10,0x20,0x30,0x40,0x50,0x60,0xff,0x07,0x80,0x29,0x01,0x02,0x03,0x04,0x05,0x06}; unsigned char RFID2[16]= {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x80,0x29,0xff,0xff,0xff,0xff,0xff,0xff}; // 測試用 3區塊密鑰 u8 KEY_A1[6]= {0x10,0x20,0x30,0x40,0x50,0x60}; u8 KEY_A2[6]= {0x00,0x00,0x00,0x00,0x00,0x00}; u8 KEY_B1[6]= {0x01,0x02,0x03,0x04,0x05,0x06}; u8 KEY_B2[6]= {0x10,0x20,0x30,0x00,0x00,0x00}; u8 KEY_B3[6]= {0x01,0x02,0x03,0x00,0x00,0x00}; // 置零用 unsigned char DATA0[16]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char DATA1[16]= {0x12,0x34,0x56,0x78,0x9A,0x00,0xff,0x07,0x80,0x29,0xff,0xff,0xff,0xff,0xff,0xff}; unsigned char status; // 0x08 就是2扇區0區塊(即第9塊) unsigned char addr=0x08; // unsigned char addr=0x08;#define RC522_DELAY() delay_us( 20 )// 測試程序0,完成addr讀寫讀 void RC522_Handle(void) {u8 i = 0;status = PcdRequest(PICC_REQALL,CT);//尋卡// printf("\r\nstatus>>>>>>%d\r\n", status);if(status==MI_OK)// 尋卡成功{status=MI_ERR;status = PcdAnticoll(SN);// 防沖撞 獲得UID 存入SN}if (status==MI_OK)// 防沖撞成功{status = MI_ERR;ShowID(SN); // 串口打印卡的ID號 UID// 難道就是為了做個判斷嗎。。。if((SN[0]==card_0[0])&&(SN[1]==card_0[1])&&(SN[2]==card_0[2])&&(SN[3]==card_0[3])){card0_bit=1;printf("\r\nThe User is:card_0\r\n");}if((SN[0]==card_1[0])&&(SN[1]==card_1[1])&&(SN[2]==card_1[2])&&(SN[3]==card_1[3])){card1_bit=1;printf("\r\nThe User is:card_1\r\n");}if((SN[0]==card_2[0])&&(SN[1]==card_2[1])&&(SN[2]==card_2[2])&&(SN[3]==card_2[3])){card2_bit=1;printf("\r\nThe User is:card_2\r\n");}if((SN[0]==card_3[0])&&(SN[1]==card_3[1])&&(SN[2]==card_3[2])&&(SN[3]==card_3[3])){card3_bit=1;printf("\r\nThe User is:card_3\r\n");}if((SN[0]==card_4[0])&&(SN[1]==card_4[1])&&(SN[2]==card_4[2])&&(SN[3]==card_4[3])){card4_bit=1;printf("\r\nThe User is:card_4\r\n");}//total = card1_bit+card2_bit+card3_bit+card4_bit+card0_bit;status = PcdSelect(SN);}else{}if(status == MI_OK)//選卡成功{status = MI_ERR;// 驗證A密鑰 塊地址 密碼 SN // 注意:此處的塊地址0x0B即2扇區3區塊,可以替換成變量addr ,此塊地址只需要指向某一扇區就可以了,即2扇區為0x08-0x0B這個范圍都有效,且只能對驗證過的扇區進行讀寫操作status = PcdAuthState(0x60, 0x0B, KEY_A, SN);if(status == MI_OK)//驗證成功{printf("PcdAuthState(A) success\r\n");}else{printf("PcdAuthState(A) failed\r\n");}// 驗證B密鑰 塊地址 密碼 SN 塊地址0x0B即2扇區3區塊,可以替換成變量addrstatus = PcdAuthState(0x61, 0x0B, KEY_B, SN);if(status == MI_OK)//驗證成功{printf("PcdAuthState(B) success\r\n");}else{printf("PcdAuthState(B) failed\r\n");}}if(status == MI_OK)//驗證成功{status = MI_ERR;// 讀取M1卡一塊數據 塊地址 讀取的數據 注意:因為上面驗證的扇區是2扇區,所以只能對2扇區的數據進行讀寫,即0x08-0x0B這個范圍,超出范圍讀取失敗。status = PcdRead(addr, DATA);if(status == MI_OK)//讀卡成功{// printf("RFID:%s\r\n", RFID);printf("DATA:");for(i = 0; i < 16; i++){printf("%02x", DATA[i]);}printf("\r\n");}else{printf("PcdRead() failed\r\n");}}if(status == MI_OK)//讀卡成功{status = MI_ERR;printf("Write the card after 1 second. Do not move the card!!!\r\n");delay_ms(1000);// status = PcdWrite(addr, DATA0);// 寫數據到M1卡一塊status = PcdWrite(addr, DATA1);if(status == MI_OK)//寫卡成功{printf("PcdWrite() success\r\n");}else{printf("PcdWrite() failed\r\n");delay_ms(3000);}}if(status == MI_OK)//寫卡成功{status = MI_ERR;// 讀取M1卡一塊數據 塊地址 讀取的數據status = PcdRead(addr, DATA);if(status == MI_OK)//讀卡成功{// printf("DATA:%s\r\n", DATA);printf("DATA:");for(i = 0; i < 16; i++){printf("%02x", DATA[i]);}printf("\r\n");}else{printf("PcdRead() failed\r\n");}}if(status == MI_OK)//讀卡成功{status = MI_ERR;printf("RC522_Handle() run finished after 1 second!\r\n");delay_ms(1000);} }// 測試程序1,完成0x0F塊 驗證KEY_A、KEY_B 讀 寫RFID1 驗證KEY_A1、KEY_B1 讀 寫RFID2 void RC522_Handle1(void) {u8 i = 0;unsigned char test_addr=0x0F;status = PcdRequest(PICC_REQALL,CT);//尋卡// printf("\r\nstatus>>>>>>%d\r\n", status);if(status==MI_OK)// 尋卡成功{status=MI_ERR;status = PcdAnticoll(SN);// 防沖撞 獲得UID 存入SN}if (status==MI_OK)// 防沖撞成功{status = MI_ERR;ShowID(SN); // 串口打印卡的ID號 UID// 難道就是為了做個判斷嗎。。。if((SN[0]==card_0[0])&&(SN[1]==card_0[1])&&(SN[2]==card_0[2])&&(SN[3]==card_0[3])){card0_bit=1;printf("\r\nThe User is:card_0\r\n");}if((SN[0]==card_1[0])&&(SN[1]==card_1[1])&&(SN[2]==card_1[2])&&(SN[3]==card_1[3])){card1_bit=1;printf("\r\nThe User is:card_1\r\n");}status = PcdSelect(SN);}else{}if(status == MI_OK)//選卡成功{status = MI_ERR;// 驗證A密鑰 塊地址 密碼 SN // 注意:此處的塊地址0x0F即3扇區3區塊,此塊地址只需要指向某一扇區就可以了,即3扇區為0x0C-0x0F這個范圍都有效,且只能對驗證過的扇區進行讀寫操作status = PcdAuthState(0x60, test_addr, KEY_A, SN);if(status == MI_OK)//驗證成功{printf("PcdAuthState(A) success\r\n");}else{printf("PcdAuthState(A) failed\r\n");status = MI_OK;goto P1;}// 驗證B密鑰 塊地址 密碼 SN status = PcdAuthState(0x61, test_addr, KEY_B, SN);if(status == MI_OK)//驗證成功{printf("PcdAuthState(B) success\r\n");}else{printf("PcdAuthState(B) failed\r\n");}}if(status == MI_OK)//驗證成功{status = MI_ERR;// 讀取M1卡一塊數據 塊地址 讀取的數據 注意:因為上面驗證的扇區是3扇區,所以只能對2扇區的數據進行讀寫,即0x0C-0x0F這個范圍,超出范圍讀取失敗。status = PcdRead(test_addr, DATA);if(status == MI_OK)//讀卡成功{// printf("RFID:%s\r\n", RFID);printf("DATA:");for(i = 0; i < 16; i++){printf("%02x", DATA[i]);}printf("\r\n");}else{printf("PcdRead() failed\r\n");}}if(status == MI_OK)//讀卡成功{status = MI_ERR;// 寫數據到M1卡一塊status = PcdWrite(test_addr, RFID1);if(status == MI_OK)//寫卡成功{printf("PcdWrite(RFID1) success\r\n");}else{printf("PcdWrite(RFID1) failed\r\n");delay_ms(3000);}}P1: if(status == MI_OK)//寫卡成功{status = MI_ERR;// 驗證A密鑰 塊地址 密碼 SN // 注意:此處的塊地址0x0F即3扇區3區塊,此塊地址只需要指向某一扇區就可以了,即3扇區為0x0C-0x0F這個范圍都有效,且只能對驗證過的扇區進行讀寫操作status = PcdAuthState(0x60, test_addr, KEY_A1, SN);if(status == MI_OK)//驗證成功{printf("PcdAuthState(A1) success\r\n");}else{printf("PcdAuthState(A1) failed\r\n");}// 驗證B密鑰 塊地址 密碼 SN status = PcdAuthState(0x61, test_addr, KEY_B1, SN);if(status == MI_OK)//驗證成功{printf("PcdAuthState(B1) success\r\n");}else{printf("PcdAuthState(B1) failed\r\n");}}if(status == MI_OK)//驗證成功{status = MI_ERR;// 讀取M1卡一塊數據 塊地址 讀取的數據 注意:因為上面驗證的扇區是3扇區,所以只能對2扇區的數據進行讀寫,即0x0C-0x0F這個范圍,超出范圍讀取失敗。status = PcdRead(test_addr, DATA);if(status == MI_OK)//讀卡成功{// printf("RFID:%s\r\n", RFID);printf("DATA:");for(i = 0; i < 16; i++){printf("%02x", DATA[i]);}printf("\r\n");}else{printf("PcdRead() failed\r\n");}}if(status == MI_OK)//讀卡成功{status = MI_ERR;// 寫數據到M1卡一塊status = PcdWrite(test_addr, RFID2);if(status == MI_OK)//寫卡成功{printf("PcdWrite(RFID2) success\r\n");}else{printf("PcdWrite(RFID2) failed\r\n");delay_ms(3000);}}if(status == MI_OK)//寫卡成功{status = MI_ERR;// 讀取M1卡一塊數據 塊地址 讀取的數據status = PcdRead(test_addr, DATA);if(status == MI_OK)//讀卡成功{// printf("DATA:%s\r\n", DATA);printf("DATA:");for(i = 0; i < 16; i++){printf("%02x", DATA[i]);}printf("\r\n");}else{printf("PcdRead() failed\r\n");}}if(status == MI_OK)//讀卡成功{status = MI_ERR;printf("RC522_Handle1() run finished after 1 second!\r\n");delay_ms(1000);} }// 測試用數據爆破程序,僅供學習參考,請勿非法使用 針對card_0進行破解 void RC522_data_break(void) {// 爆破的塊地址unsigned char break_addr = 0x0F;u8 i = 0;/*u8 key_arr[257] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF };*/u8 break_KEY[6]= {0, 0, 0, 0, 0, 0};status = PcdRequest(PICC_REQALL,CT);//尋卡// printf("\r\nstatus>>>>>>%d\r\n", status);if(status==MI_OK)// 尋卡成功{status=MI_ERR;status = PcdAnticoll(SN);// 防沖撞 獲得UID 存入SN}if (status==MI_OK)// 防沖撞成功{status = MI_ERR;ShowID(SN); // 串口打印卡的ID號 UID// 難道就是為了做個判斷嗎。。。if((SN[0]==card_0[0])&&(SN[1]==card_0[1])&&(SN[2]==card_0[2])&&(SN[3]==card_0[3])){card0_bit=1;printf("\r\nThe User is:card_0\r\n");}else{printf("\r\nThe User isn't:card_0\r\n");return;}status = PcdSelect(SN);}else{}if(status == MI_OK)//選卡成功{status = MI_ERR;// 自由發揮 。。。// 驗證A密鑰 塊地址 密碼 SN // 注意:此處的塊地址0x0F即3扇區3區塊,此塊地址只需要指向某一扇區就可以了,即3扇區為0x0C-0x0F這個范圍都有效,且只能對驗證過的扇區進行讀寫操作status = PcdAuthState(0x60, break_addr, break_KEY, SN);if(status == MI_OK)//驗證成功{printf("PcdAuthState(A) success\r\n");}else{printf("PcdAuthState(A) failed\r\n");status = MI_OK;}// 驗證B密鑰 塊地址 密碼 SN status = PcdAuthState(0x61, break_addr, break_KEY, SN);if(status == MI_OK)//驗證成功{printf("PcdAuthState(B) success\r\n");}else{printf("PcdAuthState(B) failed\r\n");}}if(status == MI_OK)//驗證成功{status = MI_ERR;// 讀取M1卡一塊數據 塊地址 讀取的數據 注意:因為上面驗證的扇區是3扇區,所以只能對2扇區的數據進行讀寫,即0x0C-0x0F這個范圍,超出范圍讀取失敗。status = PcdRead(break_addr, DATA);if(status == MI_OK)//讀卡成功{// printf("RFID:%s\r\n", RFID);printf("DATA:");for(i = 0; i < 16; i++){printf("%02x", DATA[i]);}printf("\r\n");}else{printf("PcdRead() failed\r\n");}}delay_ms(3000); }void RC522_Init ( void ) {SPI1_Init();RC522_Reset_Disable();RC522_CS_Disable();PcdReset ();M500PcdConfigISOType ( 'A' );//設置工作方式}void SPI1_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );//PORTA、B時鐘使能RCC_APB1PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE ); //SPI1時鐘使能// CSGPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //根據設定參數初始化PF0、PF1// SCKGPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);// MISOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);// MOSIGPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);// RSTGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //設置SPI單向或者雙向的數據模式:SPI設置為雙線雙向全雙工SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //設置SPI工作模式:設置為主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //設置SPI的數據大小:SPI發送接收8位幀結構SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步時鐘的空閑狀態為高電平// SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;// SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步時鐘的第一個跳變沿(下降)數據被采樣SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步時鐘的第二個跳變沿(上升)數據被采樣SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信號由硬件(NSS管腳)還是軟件(使用SSI位)管理:內部NSS信號有SSI位控制// RC522 SPI通訊時鐘周期最小為100ns 即頻率最大為10MHZ// RC522 數據在下降沿變化SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定義波特率預分頻的值:波特率預分頻值為256、傳輸速率36M/256=140.625KHzSPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定數據傳輸從MSB位還是LSB位開始:數據傳輸從MSB位開始SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值計算的多項式SPI_Init(SPI1, &SPI_InitStructure); //根據SPI_InitStruct中指定的參數初始化外設SPIx寄存器SPI_Cmd(SPI1, ENABLE); //使能SPI外設 }/** 函數名:SPI_RC522_SendByte* 描述 :向RC522發送1 Byte 數據* 輸入 :byte,要發送的數據* 返回 : RC522返回的數據* 調用 :內部調用*/ void SPI_RC522_SendByte ( u8 byte ) {u8 counter;for(counter=0; counter<8; counter++){if ( byte & 0x80 )RC522_MOSI_1 ();elseRC522_MOSI_0 ();RC522_DELAY();RC522_SCK_0 ();RC522_DELAY();RC522_SCK_1();RC522_DELAY();byte <<= 1;} }/** 函數名:SPI_RC522_ReadByte* 描述 :從RC522發送1 Byte 數據* 輸入 :無* 返回 : RC522返回的數據* 調用 :內部調用*/ u8 SPI_RC522_ReadByte ( void ) {u8 counter;u8 SPI_Data;for(counter=0; counter<8; counter++){SPI_Data <<= 1;RC522_SCK_0 ();RC522_DELAY();if ( RC522_MISO_GET() == 1)SPI_Data |= 0x01;RC522_DELAY();RC522_SCK_1 ();RC522_DELAY();}// printf("****%c****",SPI_Data);return SPI_Data; }/** 函數名:ReadRawRC* 描述 :讀RC522寄存器* 輸入 :ucAddress,寄存器地址* 返回 : 寄存器的當前值* 調用 :內部調用*/ u8 ReadRawRC ( u8 ucAddress ) {u8 ucAddr, ucReturn;ucAddr = ( ( ucAddress << 1 ) & 0x7E ) | 0x80;RC522_CS_Enable();SPI_RC522_SendByte ( ucAddr );ucReturn = SPI_RC522_ReadByte ();RC522_CS_Disable();return ucReturn; }/** 函數名:WriteRawRC* 描述 :寫RC522寄存器* 輸入 :ucAddress,寄存器地址* ucValue,寫入寄存器的值* 返回 : 無* 調用 :內部調用*/ void WriteRawRC ( u8 ucAddress, u8 ucValue ) {u8 ucAddr;ucAddr = ( ucAddress << 1 ) & 0x7E;RC522_CS_Enable();SPI_RC522_SendByte ( ucAddr );SPI_RC522_SendByte ( ucValue );RC522_CS_Disable(); }/** 函數名:SetBitMask* 描述 :對RC522寄存器置位* 輸入 :ucReg,寄存器地址* ucMask,置位值* 返回 : 無* 調用 :內部調用*/ void SetBitMask ( u8 ucReg, u8 ucMask ) {u8 ucTemp;ucTemp = ReadRawRC ( ucReg );WriteRawRC ( ucReg, ucTemp | ucMask ); // set bit mask }/** 函數名:ClearBitMask* 描述 :對RC522寄存器清位* 輸入 :ucReg,寄存器地址* ucMask,清位值* 返回 : 無* 調用 :內部調用*/ void ClearBitMask ( u8 ucReg, u8 ucMask ) {u8 ucTemp;ucTemp = ReadRawRC ( ucReg );WriteRawRC ( ucReg, ucTemp & ( ~ ucMask) ); // clear bit mask }/** 函數名:PcdAntennaOn* 描述 :開啟天線* 輸入 :無* 返回 : 無* 調用 :內部調用*/ void PcdAntennaOn ( void ) {u8 uc;uc = ReadRawRC ( TxControlReg );if ( ! ( uc & 0x03 ) )SetBitMask(TxControlReg, 0x03); }/** 函數名:PcdAntennaOff* 描述 :開啟天線* 輸入 :無* 返回 : 無* 調用 :內部調用*/ void PcdAntennaOff ( void ) {ClearBitMask ( TxControlReg, 0x03 ); }/** 函數名:PcdRese* 描述 :復位RC522* 輸入 :無* 返回 : 無* 調用 :外部調用*/ void PcdReset ( void ) {RC522_Reset_Disable();delay_us ( 1 );RC522_Reset_Enable();delay_us ( 1 );RC522_Reset_Disable();delay_us ( 1 );WriteRawRC ( CommandReg, 0x0f );while ( ReadRawRC ( CommandReg ) & 0x10 );delay_us ( 1 );WriteRawRC ( ModeReg, 0x3D ); //定義發送和接收常用模式 和Mifare卡通訊,CRC初始值0x6363WriteRawRC ( TReloadRegL, 30 ); //16位定時器低位WriteRawRC ( TReloadRegH, 0 ); //16位定時器高位WriteRawRC ( TModeReg, 0x8D ); //定義內部定時器的設置WriteRawRC ( TPrescalerReg, 0x3E ); //設置定時器分頻系數WriteRawRC ( TxAutoReg, 0x40 ); //調制發送信號為100%ASK }/** 函數名:M500PcdConfigISOType* 描述 :設置RC522的工作方式* 輸入 :ucType,工作方式* 返回 : 無* 調用 :外部調用*/ void M500PcdConfigISOType ( u8 ucType ) {if ( ucType == 'A') //ISO14443_A{ClearBitMask ( Status2Reg, 0x08 );WriteRawRC ( ModeReg, 0x3D );//3FWriteRawRC ( RxSelReg, 0x86 );//84WriteRawRC( RFCfgReg, 0x7F ); //4FWriteRawRC( TReloadRegL, 30 );//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)WriteRawRC ( TReloadRegH, 0 );WriteRawRC ( TModeReg, 0x8D );WriteRawRC ( TPrescalerReg, 0x3E );delay_us ( 2 );PcdAntennaOn ();//開天線} }/** 函數名:PcdComMF522* 描述 :通過RC522和ISO14443卡通訊* 輸入 :ucCommand,RC522命令字* pInData,通過RC522發送到卡片的數據* ucInLenByte,發送數據的字節長度* pOutData,接收到的卡片返回數據* pOutLenBit,返回數據的位長度* 返回 : 狀態值* = MI_OK,成功* 調用 :內部調用*/ char PcdComMF522 ( u8 ucCommand, u8 * pInData, u8 ucInLenByte, u8 * pOutData, u32 * pOutLenBit ) {char cStatus = MI_ERR;u8 ucIrqEn = 0x00;u8 ucWaitFor = 0x00;u8 ucLastBits;u8 ucN;u32 ul;switch ( ucCommand ){case PCD_AUTHENT: //Mifare認證ucIrqEn = 0x12; //允許錯誤中斷請求ErrIEn 允許空閑中斷IdleIEnucWaitFor = 0x10; //認證尋卡等待時候 查詢空閑中斷標志位break;case PCD_TRANSCEIVE: //接收發送 發送接收ucIrqEn = 0x77; //允許TxIEn RxIEn IdleIEn LoAlertIEn ErrIEn TimerIEnucWaitFor = 0x30; //尋卡等待時候 查詢接收中斷標志位與 空閑中斷標志位break;default:break;}WriteRawRC ( ComIEnReg, ucIrqEn | 0x80 ); //IRqInv置位管腳IRQ與Status1Reg的IRq位的值相反ClearBitMask ( ComIrqReg, 0x80 ); //Set1該位清零時,CommIRqReg的屏蔽位清零WriteRawRC ( CommandReg, PCD_IDLE ); //寫空閑命令SetBitMask ( FIFOLevelReg, 0x80 ); //置位FlushBuffer清除內部FIFO的讀和寫指針以及ErrReg的BufferOvfl標志位被清除for ( ul = 0; ul < ucInLenByte; ul ++ )WriteRawRC ( FIFODataReg, pInData [ ul ] ); //寫數據進FIFOdataWriteRawRC ( CommandReg, ucCommand ); //寫命令if ( ucCommand == PCD_TRANSCEIVE )SetBitMask(BitFramingReg,0x80); //StartSend置位啟動數據發送 該位與收發命令使用時才有效ul = 1000;//根據時鐘頻率調整,操作M1卡最大等待時間25msdo //認證 與尋卡等待時間{ucN = ReadRawRC ( ComIrqReg ); //查詢事件中斷ul --;} while ( ( ul != 0 ) && ( ! ( ucN & 0x01 ) ) && ( ! ( ucN & ucWaitFor ) ) ); //退出條件i=0,定時器中斷,與寫空閑命令ClearBitMask ( BitFramingReg, 0x80 ); //清理允許StartSend位if ( ul != 0 ){if ( ! (( ReadRawRC ( ErrorReg ) & 0x1B )) ) //讀錯誤標志寄存器BufferOfI CollErr ParityErr ProtocolErr{cStatus = MI_OK;if ( ucN & ucIrqEn & 0x01 ) //是否發生定時器中斷cStatus = MI_NOTAGERR;if ( ucCommand == PCD_TRANSCEIVE ){ucN = ReadRawRC ( FIFOLevelReg ); //讀FIFO中保存的字節數ucLastBits = ReadRawRC ( ControlReg ) & 0x07; //最后接收到得字節的有效位數if ( ucLastBits )* pOutLenBit = ( ucN - 1 ) * 8 + ucLastBits; //N個字節數減去1(最后一個字節)+最后一位的位數 讀取到的數據總位數else* pOutLenBit = ucN * 8; //最后接收到的字節整個字節有效if ( ucN == 0 )ucN = 1;if ( ucN > MAXRLEN )ucN = MAXRLEN;for ( ul = 0; ul < ucN; ul ++ )pOutData [ ul ] = ReadRawRC ( FIFODataReg );}}elsecStatus = MI_ERR; // printf(ErrorReg);}SetBitMask ( ControlReg, 0x80 ); // stop timer nowWriteRawRC ( CommandReg, PCD_IDLE );return cStatus; }/** 函數名:PcdRequest* 描述 :尋卡* 輸入 :ucReq_code,尋卡方式* = 0x52,尋感應區內所有符合14443A標準的卡* = 0x26,尋未進入休眠狀態的卡* pTagType,卡片類型代碼* = 0x4400,Mifare_UltraLight* = 0x0400,Mifare_One(S50)* = 0x0200,Mifare_One(S70)* = 0x0800,Mifare_Pro(X))* = 0x4403,Mifare_DESFire* 返回 : 狀態值* = MI_OK,成功* 調用 :外部調用*/ char PcdRequest ( u8 ucReq_code, u8 * pTagType ) {char cStatus;u8 ucComMF522Buf [ MAXRLEN ];u32 ulLen;ClearBitMask ( Status2Reg, 0x08 ); //清理指示MIFARECyptol單元接通以及所有卡的數據通信被加密的情況WriteRawRC ( BitFramingReg, 0x07 ); // 發送的最后一個字節的 七位SetBitMask ( TxControlReg, 0x03 ); //TX1,TX2管腳的輸出信號傳遞經發送調制的13.56的能量載波信號ucComMF522Buf [ 0 ] = ucReq_code; //存入 卡片命令字cStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 1, ucComMF522Buf, & ulLen ); //尋卡if ( ( cStatus == MI_OK ) && ( ulLen == 0x10 ) ) //尋卡成功返回卡類型{* pTagType = ucComMF522Buf [ 0 ];* ( pTagType + 1 ) = ucComMF522Buf [ 1 ];}elsecStatus = MI_ERR;return cStatus; }/** 函數名:PcdAnticoll* 描述 :防沖撞* 輸入 :pSnr,卡片序列號,4字節* 返回 : 狀態值* = MI_OK,成功* 調用 :外部調用*/ char PcdAnticoll ( u8 * pSnr ) {char cStatus;u8 uc, ucSnr_check = 0;u8 ucComMF522Buf [ MAXRLEN ];u32 ulLen;ClearBitMask ( Status2Reg, 0x08 ); //清MFCryptol On位 只有成功執行MFAuthent命令后,該位才能置位WriteRawRC ( BitFramingReg, 0x00); //清理寄存器 停止收發ClearBitMask ( CollReg, 0x80 ); //清ValuesAfterColl所有接收的位在沖突后被清除/*參考ISO14443協議:https://blog.csdn.net/wowocpp/article/details/79910800PCD 發送 SEL = ‘93’,NVB = ‘20’兩個字節迫使所有的在場的PICC發回完整的UID CLn作為應答。*/ucComMF522Buf [ 0 ] = 0x93; //卡片防沖突命令ucComMF522Buf [ 1 ] = 0x20;// 發送并接收數據 接收的數據存儲于ucComMF522BufcStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 2, ucComMF522Buf, & ulLen);//與卡片通信if ( cStatus == MI_OK) //通信成功{// 收到的UID 存入pSnrfor ( uc = 0; uc < 4; uc ++ ){* ( pSnr + uc ) = ucComMF522Buf [ uc ]; //讀出UIDucSnr_check ^= ucComMF522Buf [ uc ];}if ( ucSnr_check != ucComMF522Buf [ uc ] )cStatus = MI_ERR;}SetBitMask ( CollReg, 0x80 );return cStatus; }/** 函數名:CalulateCRC* 描述 :用RC522計算CRC16* 輸入 :pIndata,計算CRC16的數組* ucLen,計算CRC16的數組字節長度* pOutData,存放計算結果存放的首地址* 返回 : 無* 調用 :內部調用*/ void CalulateCRC ( u8 * pIndata, u8 ucLen, u8 * pOutData ) {u8 uc, ucN;ClearBitMask(DivIrqReg, 0x04);WriteRawRC(CommandReg, PCD_IDLE);SetBitMask(FIFOLevelReg, 0x80);for ( uc = 0; uc < ucLen; uc ++)WriteRawRC ( FIFODataReg, * ( pIndata + uc ) );WriteRawRC ( CommandReg, PCD_CALCCRC );uc = 0xFF;do{ucN = ReadRawRC ( DivIrqReg );uc --;} while ( ( uc != 0 ) && ! ( ucN & 0x04 ) );pOutData [ 0 ] = ReadRawRC ( CRCResultRegL );pOutData [ 1 ] = ReadRawRC ( CRCResultRegM ); }/** 函數名:PcdSelect* 描述 :選定卡片* 輸入 :pSnr,卡片序列號,4字節* 返回 : 狀態值* = MI_OK,成功* 調用 :外部調用*/ char PcdSelect ( u8 * pSnr ) {char cStatus;u8 uc;u8 ucComMF522Buf [ MAXRLEN ];u32 ulLen;// 防沖撞 0x93ucComMF522Buf [ 0 ] = PICC_ANTICOLL1;// 假設沒有沖突,PCD 指定NVB為70,此值表示PCD將發送完整的UID CLn,與40位UID CLn 匹配的PICC,以SAK作為應答ucComMF522Buf [ 1 ] = 0x70;ucComMF522Buf [ 6 ] = 0;// 3 4 5 6位存放UID,第7位一直異或。。。for ( uc = 0; uc < 4; uc ++ ){ucComMF522Buf [ uc + 2 ] = * ( pSnr + uc );ucComMF522Buf [ 6 ] ^= * ( pSnr + uc );}// CRC(循環冗余校驗)CalulateCRC ( ucComMF522Buf, 7, & ucComMF522Buf [ 7 ] );ClearBitMask ( Status2Reg, 0x08 );// 發送并接收數據cStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 9, ucComMF522Buf, & ulLen );if ( ( cStatus == MI_OK ) && ( ulLen == 0x18 ) )cStatus = MI_OK;elsecStatus = MI_ERR;return cStatus; }/** 函數名:PcdAuthState* 描述 :驗證卡片密碼* 輸入 :ucAuth_mode,密碼驗證模式* = 0x60,驗證A密鑰* = 0x61,驗證B密鑰* u8 ucAddr,塊地址* pKey,密碼* pSnr,卡片序列號,4字節* 返回 : 狀態值* = MI_OK,成功* 調用 :外部調用*/ char PcdAuthState ( u8 ucAuth_mode, u8 ucAddr, u8 * pKey, u8 * pSnr ) {char cStatus;u8 uc, ucComMF522Buf [ MAXRLEN ];u32 ulLen;ucComMF522Buf [ 0 ] = ucAuth_mode;ucComMF522Buf [ 1 ] = ucAddr;for ( uc = 0; uc < 6; uc ++ )ucComMF522Buf [ uc + 2 ] = * ( pKey + uc );for ( uc = 0; uc < 6; uc ++ )ucComMF522Buf [ uc + 8 ] = * ( pSnr + uc );// printf("char PcdAuthState ( u8 ucAuth_mode, u8 ucAddr, u8 * pKey, u8 * pSnr )\r\n");// printf("before PcdComMF522() ucComMF522Buf:%s\r\n", ucComMF522Buf);// 驗證密鑰命令cStatus = PcdComMF522 ( PCD_AUTHENT, ucComMF522Buf, 12, ucComMF522Buf, & ulLen );// printf("after PcdComMF522() ucComMF522Buf:%s\r\n", ucComMF522Buf);if ( ( cStatus != MI_OK ) || ( ! ( ReadRawRC ( Status2Reg ) & 0x08 ) ) ){ // if(cStatus != MI_OK) // printf("666") ; // else // printf("888");cStatus = MI_ERR;}return cStatus; }/** 函數名:PcdWrite* 描述 :寫數據到M1卡一塊* 輸入 :u8 ucAddr,塊地址* pData,寫入的數據,16字節* 返回 : 狀態值* = MI_OK,成功* 調用 :外部調用*/ char PcdWrite ( u8 ucAddr, u8 * pData ) {char cStatus;u8 uc, ucComMF522Buf [ MAXRLEN ];u32 ulLen;ucComMF522Buf [ 0 ] = PICC_WRITE;ucComMF522Buf [ 1 ] = ucAddr;CalulateCRC ( ucComMF522Buf, 2, & ucComMF522Buf [ 2 ] );cStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, & ulLen );if ( ( cStatus != MI_OK ) || ( ulLen != 4 ) || ( ( ucComMF522Buf [ 0 ] & 0x0F ) != 0x0A ) )cStatus = MI_ERR;if ( cStatus == MI_OK ){memcpy(ucComMF522Buf, pData, 16);for ( uc = 0; uc < 16; uc ++ )ucComMF522Buf [ uc ] = * ( pData + uc );CalulateCRC ( ucComMF522Buf, 16, & ucComMF522Buf [ 16 ] );cStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 18, ucComMF522Buf, & ulLen );if ( ( cStatus != MI_OK ) || ( ulLen != 4 ) || ( ( ucComMF522Buf [ 0 ] & 0x0F ) != 0x0A ) )cStatus = MI_ERR;}return cStatus; }/** 函數名:PcdRead* 描述 :讀取M1卡一塊數據* 輸入 :u8 ucAddr,塊地址* pData,讀出的數據,16字節* 返回 : 狀態值* = MI_OK,成功* 調用 :外部調用*/ char PcdRead ( u8 ucAddr, u8 * pData ) {char cStatus;u8 uc, ucComMF522Buf [ MAXRLEN ];u32 ulLen;ucComMF522Buf [ 0 ] = PICC_READ;ucComMF522Buf [ 1 ] = ucAddr;CalulateCRC ( ucComMF522Buf, 2, & ucComMF522Buf [ 2 ] );cStatus = PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, & ulLen );if ( ( cStatus == MI_OK ) && ( ulLen == 0x90 ) ){for ( uc = 0; uc < 16; uc ++ )* ( pData + uc ) = ucComMF522Buf [ uc ];}elsecStatus = MI_ERR;return cStatus; }/** 函數名:PcdHalt* 描述 :命令卡片進入休眠狀態* 輸入 :無* 返回 : 狀態值* = MI_OK,成功* 調用 :外部調用*/ char PcdHalt( void ) {u8 ucComMF522Buf [ MAXRLEN ];u32 ulLen;ucComMF522Buf [ 0 ] = PICC_HALT;ucComMF522Buf [ 1 ] = 0;CalulateCRC ( ucComMF522Buf, 2, & ucComMF522Buf [ 2 ] );PcdComMF522 ( PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, & ulLen );return MI_OK; }void IC_CMT ( u8 * UID, u8 * KEY, u8 RW, u8 * Dat ) {u8 ucArray_ID [ 4 ] = { 0 };//先后存放IC卡的類型和UID(IC卡序列號)PcdRequest ( 0x52, ucArray_ID );//尋卡PcdAnticoll ( ucArray_ID );//防沖撞PcdSelect ( UID );//選定卡PcdAuthState ( 0x60, 0x10, KEY, UID );//校驗if ( RW )//讀寫選擇,1是讀,0是寫PcdRead ( 0x10, Dat );elsePcdWrite ( 0x10, Dat );PcdHalt (); }// 顯示卡的卡號,以十六進制顯示 void ShowID(u8 *p) {u8 num[9];u8 i;for(i=0; i<4; i++){num[i*2] = p[i] / 16;num[i*2] > 9 ? (num[i*2] += '7') : (num[i*2] += '0');num[i*2+1] = p[i] % 16;num[i*2+1] > 9 ? (num[i*2+1] += '7') : (num[i*2+1] += '0');}num[8] = 0;printf("ID>>>%s\r\n", num); }

額外資料



總結

以上是生活随笔為你收集整理的STM32F103+RFID-RC522模块 实现简单读卡写卡demo的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产精品美女www爽爽爽视频 | 日韩欧美在线观看一区二区三区 | 国产免费片 | a在线一区 | 婷婷丁香激情五月 | 国产在线观看91 | 国产午夜三级一区二区三 | 日韩欧美视频 | 97超碰人人澡 | 激情喷水 | 男女全黄一级一级高潮免费看 | 亚洲一区二区高潮无套美女 | a视频在线播放 | 在线中文字幕电影 | 国产精品成人国产乱 | 国产精品11 | 91自拍视频在线观看 | 日韩啪视频| 国产小视频网站 | 午夜在线观看影院 | 亚洲精品黄| 日韩精品中文字幕在线不卡尤物 | 欧美另类色图 | 欧美日韩在线视频免费 | 一级黄色av| 国产一区二区高清视频 | 美女久久久久久 | 国产精品永久久久久久久久久 | 欧美先锋影音 | 在线播放日韩av | 天天干天天干天天色 | 日本在线观看中文字幕无线观看 | 日本精品久久久一区二区三区 | 久久婷亚洲五月一区天天躁 | 国产精品白丝jk白祙 | 在线观看日韩一区 | 天天操天天干天天玩 | 久一久久 | 日日干美女 | 99热这里有精品 | 国产在线97 | 狠狠久久婷婷 | av一级免费| 日韩精品久久久久久久电影99爱 | 国产一区二区精品久久 | 免费久久片 | 成人在线视频免费观看 | 人人爽人人爽人人爽学生一级 | 丁香av在线 | 久久免费视频国产 | 亚洲精品日韩在线观看 | 中文一二区 | 在线观看91视频 | 麻豆视频在线播放 | 成人免费看电影 | 人人玩人人添人人澡超碰 | 免费视频你懂得 | 久久精品日产第一区二区三区乱码 | 久久久久久久久毛片 | 一级片视频在线 | 久久久久9999亚洲精品 | 91九色成人蝌蚪首页 | 成人免费在线视频观看 | 欧美一级免费高清 | 天天插狠狠干 | 欧美在线视频一区二区三区 | 色是在线视频 | www久久99| 婷婷丁香综合 | 9999国产| 日韩一区二区三 | 成人免费观看视频网站 | 久久在线免费观看视频 | 久久艹综合 | 四虎在线免费视频 | 久免费 | 97成人免费| 探花系列在线 | 在线免费看黄网站 | 久草在线看片 | 激情综合一区 | 精品亚洲在线 | 亚洲精品在线观看中文字幕 | 久久精精品视频 | 日韩精品一区二区免费 | 六月丁香激情综合色啪小说 | 日韩免费观看一区二区 | 四虎影视久久久 | 成人黄色影片在线 | 免费精品国产 | 人人爽人人爽人人 | 成人国产精品免费 | 国产精品一区二区av影院萌芽 | 91伊人久久大香线蕉蜜芽人口 | 亚洲a在线观看 | 亚洲日本一区二区在线 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 中文字幕精品久久 | 久久免费视频1 | 成人性生爱a∨ | 8x成人免费视频 | 欧美日韩在线视频一区 | 欧美日韩精品久久久 | 69国产盗摄一区二区三区五区 | 亚洲激情小视频 | 日本女人b | 日韩精品一区二区三区免费视频观看 | 国产成视频在线观看 | 日韩专区在线 | 久久久久日本精品一区二区三区 | 福利视频 | 亚洲成人国产精品 | 久久99久久99精品免费看小说 | av在线免费在线 | 欧美大片在线观看一区 | 日韩毛片在线一区二区毛片 | 九九久久久久久久久激情 | 4438全国亚洲精品在线观看视频 | 西西444www大胆无视频 | 免费三级黄色 | 日韩av免费观看网站 | 国产一区在线免费观看视频 | 狠狠干狠狠艹 | 五月开心色 | 韩国一区二区三区在线观看 | 国外成人在线视频网站 | 久久精品91久久久久久再现 | 久久久鲁 | h动漫中文字幕 | 人人干天天射 | 制服丝袜在线 | 日韩欧美一区二区三区在线 | 天天操夜操 | 免费观看一级成人毛片 | 国产在线 一区二区三区 | 国产一区二区三精品久久久无广告 | 91九色蝌蚪在线 | 国产精品入口传媒 | 日本性久久 | 天天草天天干天天 | 日韩精品一区二区三区水蜜桃 | 国产视频一区在线免费观看 | 五月的婷婷 | 亚洲精品www久久久 www国产精品com | 久久黄色精品视频 | 99精品视频在线观看免费 | 欧美日韩高清不卡 | 亚洲欧美偷拍另类 | 一区二区视频在线免费观看 | 天天干天天插伊人网 | 久久久久国产精品一区二区 | 久久成人久久 | 亚洲成a人片综合在线 | 香蕉精品在线观看 | 国产尤物视频在线 | 免费看久久久 | 欧美日韩天堂 | 中文字幕在线观看免费高清完整版 | 欧美先锋影音 | 国产福利91精品一区二区三区 | av一区二区三区在线观看 | 久热电影 | 在线亚洲欧美日韩 | 欧美极品少妇xbxb性爽爽视频 | 亚洲欧洲xxxx | 91探花国产综合在线精品 | 国产精品毛片久久久久久久久久99999999 | 91在线国产观看 | 成人午夜电影在线 | 国产五月 | 色婷婷久久久 | 日韩久久精品一区二区 | 超碰在线网| 久久国产福利 | 欧美成人在线网站 | 久久尤物电影视频在线观看 | 亚洲成aⅴ人片久久青草影院 | 成人久久18免费网站麻豆 | а天堂中文最新一区二区三区 | 狠狠色丁香婷婷综合最新地址 | 四虎在线观看 | www.国产在线视频 | 中文字幕资源网 | 亚洲视频免费 | 黄污污网站 | 国产精品中文久久久久久久 | 精品一区二区影视 | 欧美做受高潮 | 四虎成人免费影院 | 免费成人av电影 | 人人超碰97| 在线看成人av | 蜜臀av网站 | 精品国偷自产国产一区 | 超碰97在线资源 | 黄色网www | 九九有精品| 国产999精品视频 | 99热这里只有精品国产首页 | 久久久高清视频 | 亚洲视频h | 黄色av免费 | 91污视频在线观看 | 91高清免费看| 免费一级片在线 | 日韩久久精品一区二区 | 国产精品videoxxxx | 亚洲精品日韩av | 亚洲一区二区高潮无套美女 | 亚洲欧美经典 | 日韩午夜精品 | 国产中文字幕久久 | 久久99亚洲网美利坚合众国 | 国产中文字幕一区二区 | a√国产免费a | 天天操人人干 | 深夜男人影院 | 在线看黄网站 | 免费影视大全推荐 | 日韩欧美网址 | 久久系列| 日韩电影一区二区在线 | 久久成人人人人精品欧 | 我要色综合天天 | 免费看网站在线 | 国内精品免费久久影院 | 亚洲电影久久 | 91高清免费看 | 日韩精品一区二区久久 | 免费亚洲精品视频 | 91热这里只有精品 | 日韩中午字幕 | 欧美色图亚洲图片 | 91视视频在线直接观看在线看网页在线看 | 日韩网 | 美女精品在线 | 亚洲国产欧美一区二区三区丁香婷 | 免费看91的网站 | 成人av中文字幕在线观看 | 久久精品影片 | 久久婷婷国产 | 婷婷av网 | 日本高清久久久 | 久久呀| 91九色蝌蚪国产 | 超碰人人草 | 久草视频在线免费 | 伊人久久电影网 | 麻豆传媒在线免费看 | 91电影福利 | 色婷婷婷 | 中文字幕在线观看视频免费 | 九九久久国产精品 | 99精品视频免费观看 | 国产精品久久网 | 亚洲综合在线五月 | 国产一区在线视频播放 | 中文字幕在线观看网址 | 亚洲综合小说 | 在线观看免费中文字幕 | 在线观看国产中文字幕 | 国产精品1区2区 | av资源免费在线观看 | 在线免费观看视频你懂的 | 久久久久久久久久久久亚洲 | 国内精品久久久久久久久 | 黄色av成人在线 | 在线观看黄污 | 国产69精品久久久久99 | 国产一区欧美一区 | 国产成人av一区二区三区在线观看 | 干天天| 97超碰中文 | 99国产精品一区二区 | 亚洲精品在 | 91精品国产92久久久久 | 99精品乱码国产在线观看 | 欧美日本一二三 | 日韩电影一区二区在线观看 | 久久久久久久久久久久亚洲 | 91久久国产露脸精品国产闺蜜 | 在线观看福利网站 | 日韩在线视频播放 | 黄色avwww | 热久久免费视频精品 | 国产精品一区二区免费看 | 69av久久 | 国产视频精品免费 | 中文字幕在线看视频国产 | 韩国三级在线一区 | 日韩美一区二区三区 | 成年性视频 | www色av| 麻豆视频入口 | 激情五月婷婷激情 | 91视频久久久久久 | 波多野结衣久久资源 | 91漂亮少妇露脸在线播放 | 欧美日韩国产综合一区二区 | 狠狠搞,com | 精品国内自产拍在线观看视频 | 欧美久久九九 | 久久五月天色综合 | 天天操天天谢 | 免费人做人爱www的视 | 日韩中文久久 | 欧美 国产 视频 | 国产1区2区| 精品视频资源站 | 国内精品视频一区二区三区八戒 | 91视频 - 114av| 国内精品亚洲 | 99视频99| 国产精品久久久99 | 日日爱夜夜爱 | 最近中文字幕免费 | 欧美精品免费在线观看 | 国产不卡在线观看视频 | 在线免费观看亚洲视频 | 粉嫩av一区二区三区四区五区 | 亚洲精品视频在线观看免费视频 | 日日夜夜人人精品 | 中文字幕一区二区三区四区久久 | 国产爽视频 | 国产精品久久久久久久久久久杏吧 | 热99在线视频 | 国产 色| 中文字幕观看av | 青草视频在线免费 | 国产精品一区二区吃奶在线观看 | 久久久久久免费网 | 91香蕉国产在线观看软件 | 伊人天天综合 | 久久久久久久久毛片 | 天天操夜夜操国产精品 | 黄色国产区 | 亚洲成人在线免费 | 欧美精品在线观看免费 | 亚洲1区在线 | 去干成人网 | 婷婷色资源 | 欧美日韩视频网站 | 亚洲视频综合 | 日韩精品一区二区在线 | 美女免费网站 | 黄色软件网站在线观看 | 久热久草 | 开心激情婷婷 | a天堂免费| 日韩精品免费在线观看 | 一区二区三区韩国免费中文网站 | 狠狠gao| 亚洲专区在线视频 | 久久久国产精品麻豆 | 精品国产一二三 | 天天干,天天插 | 亚洲精品久久久久中文字幕m男 | 99精品视频一区二区 | 久久久2o19精品 | 亚洲在线观看av | 夜夜夜夜猛噜噜噜噜噜初音未来 | 91麻豆精品国产91久久久使用方法 | 成人在线免费视频观看 | 日韩在线免费高清视频 | 黄色亚洲 | 超碰av在线播放 | 91香蕉嫩草| av福利在线免费观看 | 国产精品成人免费 | 九九欧美 | 国产精品每日更新 | 懂色av一区二区三区蜜臀 | 色综合在| 亚洲国产成人精品在线 | 午夜影视一区 | 日韩在线观看a | 欧美性大胆 | 成人午夜精品福利免费 | 成人禁用看黄a在线 | 丝袜精品视频 | 精品uu | 91精品国产福利 | 中文乱幕日产无线码1区 | 在线亚洲天堂网 | 69国产盗摄一区二区三区五区 | 成人av视屏| 色妞久久福利网 | 中文字幕美女免费在线 | 91av视频观看| 亚洲国产高清视频 | 国产传媒一区在线 | 久久精品国产一区 | 涩涩网站免费 | 国产色在线,com | 色婷婷精品大在线视频 | 亚洲一区二区高潮无套美女 | 免费成人黄色片 | 韩国精品福利一区二区三区 | 粉嫩一区二区三区粉嫩91 | 久精品视频在线观看 | 国产一区免费看 | 97国产在线播放 | 涩涩在线 | 欧美一级性生活视频 | 日韩免费电影 | 亚洲综合婷婷 | 久草视频中文 | 色婷婷久久 | 福利视频一区二区 | 久久精品精品 | 亚洲 av网站 | 欧美日韩不卡一区 | 麻豆视频在线免费 | 精品视频97 | 精品国产一区二区三区四区在线观看 | 亚洲成人资源在线 | 在线观看91 | 久久久久麻豆 | 国产精品1000 | 亚洲在线免费视频 | 成人一级在线观看 | 国产中文字幕免费 | 国产精品一区二 | 视频一区在线免费观看 | 香蕉精品视频在线观看 | 在线视频久 | 日韩午夜三级 | 手机av电影在线观看 | 日韩av中文在线观看 | 日韩成人黄色 | 日韩精品一区二区三区不卡 | 国产大尺度视频 | 缴情综合网五月天 | 日韩高清毛片 | 久久少妇av | 日韩美女av在线 | 国产在线免费观看 | 日韩美女av在线 | 成 人 黄 色 免费播放 | 国产一级免费视频 | 亚洲成av人影片在线观看 | av资源网在线播放 | 国产成人精品一区二区三区 | 成人午夜剧场在线观看 | 亚洲第一av在线播放 | 午夜久久久久 | 亚洲国产日韩欧美在线 | 日韩在线观看视频在线 | 综合久久精品 | www黄色av| 亚洲黄色av一区 | 粉嫩av一区二区三区免费 | 成人黄色大片在线观看 | 亚洲欧洲精品久久 | 黄网av在线| 欧美激情第一页xxx 午夜性福利 | 香蕉网在线 | 国产九色91| 国产粉嫩在线 | 国产剧情亚洲 | 国产小视频网站 | 午夜精品久久久久久久99 | 国产精品九九视频 | 亚洲精品国产成人av在线 | 视频在线一区二区三区 | 美女久久久久久久久久久 | av在线不卡观看 | 曰韩在线 | 青青河边草观看完整版高清 | 人人澡人人爱 | 黄色片免费电影 | 中文字幕视频在线播放 | 综合网伊人 | 国产高清在线观看 | 又黄又刺激的视频 | 免费在线观看日韩欧美 | bbbb操bbbb| 激情综合站| 人人涩| 色综合天天干 | 国产成人久久精品一区二区三区 | 91插插插免费视频 | 最新国产在线 | 五月婷婷六月综合 | 亚洲理论电影网 | 久久激情影院 | 国产成人a v电影 | 久久国产免费 | 黄污污网站 | 黄色成年网站 | 亚洲精品视频在线观看免费 | 免费观看一级特黄欧美大片 | 国产精品久久电影网 | 亚洲精品在线一区二区 | 亚洲国产精品电影在线观看 | 日韩欧美v| 日日干天夜夜 | 97福利社 | 久久色亚洲 | 日韩精品在线免费播放 | 免费黄色一区 | 天天草视频 | 欧美a级免费视频 | 99国产在线 | 国产成人一区二区三区在线观看 | 中文字幕在线播放第一页 | 91精品视屏| av在线播放观看 | 69久久久久久久 | 超碰在线人人草 | 免费在线观看日韩 | 久草在线观看 | 欧美激情在线看 | 在线电影 一区 | 久久不色 | 国产成人精品一区二区三区福利 | 奇米导航 | 精品一区二区久久久久久久网站 | 99久久这里有精品 | 亚州精品国产 | 51久久成人国产精品麻豆 | 一区三区视频 | 99这里都是精品 | 久久国产电影院 | 日韩午夜高清 | 久久久久久久久电影 | 一区二区三区在线不卡 | 手机成人免费视频 | 999久久国精品免费观看网站 | 911精品美国片911久久久 | 久久ww| 国产三级av在线 | 日产乱码一二三区别在线 | 成人在线网站观看 | 国内毛片毛片 | 国产不卡在线观看 | 中文字幕一区在线 | 久青草国产在线 | 中文字幕精品一区二区三区电影 | 久久99久久99精品免观看粉嫩 | 久9在线 | 日本久久久久久久久久久 | 中文av网站| 亚洲国产精品小视频 | 91av免费看 | 亚洲国产网站 | 超碰大片 | 久久久久久高潮国产精品视 | 亚洲激情精品 | 24小时日本在线www免费的 | 亚洲有 在线 | 成人av久久| 亚洲国产成人精品久久 | 久久精品福利 | 欧美老女人xx | 91丨九色丨国产丨porny精品 | 91视频最新网址 | 日韩免费 | 99久久99久久精品国产片果冰 | 欧美三级高清 | av黄色大片| 狠狠狠狠狠狠狠干 | 狠狠干夜夜操天天爽 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 99精品黄色 | 久久综合桃花 | 久久精品99国产精品日本 | 九九九九精品 | 午夜影院在线观看18 | 色多视频在线观看 | 女人18精品一区二区三区 | 亚洲精品国产精品国自产 | 成人免费在线视频观看 | 日本中文字幕在线播放 | 99国产精品一区 | 色成人亚洲 | 日韩视频一区二区三区在线播放免费观看 | av在线看片| 久久九九久久精品 | 六月天综合网 | 亚洲日日射 | 午夜黄网| 婷婷 中文字幕 | 久久另类小说 | 日日操日日干 | 亚洲特级片| 美女免费网站 | 99精品一级欧美片免费播放 | 久久精品8 | 欧美激情在线看 | 6080yy午夜一二三区久久 | 欧美专区亚洲专区 | 狠狠狠狠狠狠操 | 久草资源在线观看 | 激情五月av | 久久精品国产久精国产 | 色偷偷97 | 五月婷婷丁香 | 特级黄色视频毛片 | 精品国产一区在线观看 | 毛片无卡免费无播放器 | 天天操天天射天天添 | 精品一区二区免费 | 亚洲精品视频在线观看免费 | 久久免费看毛片 | 欧美激情视频三区 | 激情综合电影网 | av电影一区 | 国产美女永久免费 | 久草视频观看 | 日本中文字幕视频 | 国产在线色 | 91九色porny蝌蚪主页 | 国产一区网址 | 蜜桃av观看 | 午夜精品久久久久久久久久久久 | 在线观看国产中文字幕 | 成人精品一区二区三区电影免费 | 人成电影网| 九九九九九九精品任你躁 | 美女网站色| 国产色视频123区 | 免费a视频在线 | 在线观看视频黄 | 国产高清成人av | 日韩三级视频在线看 | 激情综合网天天干 | 欧美日韩在线精品 | 欧美成人在线免费 | www国产在线 | 美女黄频网站 | 欧美性极品xxxx娇小 | 精品女同一区二区三区在线观看 | 成人黄色资源 | 亚洲日本精品 | 亚洲欧美日韩精品久久久 | 成人动图| 日韩精品久久久久 | 色婷婷综合久色 | 精品视频9999 | 狠狠狠色狠狠色综合 | 婷婷四房综合激情五月 | 国产亚洲精品av | 五月婷婷久 | 精品国产电影一区 | 亚洲视频免费 | 狠狠网亚洲精品 | 99久久婷婷国产精品综合 | 国产亚洲精品无 | 亚洲手机天堂 | 欧美一二三区播放 | 99久国产 | 91热爆视频 | 综合av在线 | 久久99最新地址 | 国产999精品久久久影片官网 | 精品欧美小视频在线观看 | 婷婷在线色| 国产精品激情偷乱一区二区∴ | 黄色在线看网站 | 亚洲精品456在线播放第一页 | 日韩成人中文字幕 | 中文乱幕日产无线码1区 | 在线影院中文字幕 | 九九热有精品 | 手机成人在线电影 | 久久精品8 | 亚洲黄色在线观看 | 国产一区二区在线播放视频 | 亚洲aⅴ免费在线观看 | 午夜精品福利影院 | 最新色站| 超碰97国产| 日本中文不卡 | 亚洲精品av在线 | 精品91视频 | 激情视频一区二区三区 | 2019中文 | av一区二区在线观看中文字幕 | 日韩av一区二区在线影视 | 成人网444ppp | 亚洲精品乱码久久久久久蜜桃91 | 欧美精品久久久久久久久免 | 毛片美女网站 | 婷婷色在线视频 | 久久色亚洲 | 亚洲成av人片在线观看香蕉 | 精品久久免费 | 久久视频一区二区 | 97人人精品 | 久久电影国产免费久久电影 | 中文字幕免费观看全部电影 | 最新日韩视频在线观看 | 人人澡人人添人人爽一区二区 | 欧美一二三区在线播放 | 天天干天天干天天干 | 少妇搡bbbb搡bbb搡忠贞 | 又黄又刺激的网站 | 欧美视频国产视频 | 一级成人网| 日韩专区在线 | 日本三级吹潮在线 | 成人av动漫在线观看 | 国产又粗又猛又色 | 国产一区二区三区高清播放 | 国产一级片免费视频 | 黄色aa久久 | 国产黄色高清 | 99精品国产在热久久下载 | 国产99免费视频 | 在线视频 影院 | 久草av在线播放 | 亚洲好视频 | 日韩欧美在线中文字幕 | 午夜精品福利一区二区三区蜜桃 | 国产婷婷精品av在线 | 99视频精品在线 | 日韩av综合网站 | 精品国产精品久久 | 99精品久久99久久久久 | 91网在线| 日韩精品在线免费观看 | 亚洲成a人片77777潘金莲 | 欧美另类人妖 | av免费电影在线观看 | 中文字幕在线观看视频一区 | 日韩午夜在线 | 精品国产成人av | 美女网站在线观看 | 九九九毛片 | 久久国产电影院 | 91完整版 | 激情综合色播五月 | 日日夜夜网站 | av电影在线观看完整版一区二区 | 天天操综合网 | 国产在线观看中文字幕 | 亚洲最新视频在线 | 日日夜夜精品视频天天综合网 | 精品国产欧美一区二区三区不卡 | 国产成人精品一区二区在线 | 欧美巨大荫蒂茸毛毛人妖 | 久久视频二区 | 99综合久久 | 四虎在线观看精品视频 | 夜夜婷婷 | 国产精品视频资源 | 国产精品国产三级国产aⅴ无密码 | 国产精品 中文字幕 亚洲 欧美 | 狠狠综合久久 | 日本黄色大片免费 | 国产精品久久久久久久7电影 | 美女黄频 | 国产va在线观看免费 | 91免费日韩 | 91免费版在线 | 国产四虎影院 | 久久涩视频| 天天干.com | 欧美激情h | 深爱激情五月网 | 欧美日韩中文在线观看 | 日韩精品三区四区 | 成人国产一区 | 国产精品女同一区二区三区久久夜 | 婷五月天激情 | 中文字幕 国产 一区 | 日本最新高清不卡中文字幕 | 成人免费精品 | www看片网站 | 成人午夜免费剧场 | 五月婷婷六月综合 | 99热只有精品在线观看 | 伊人激情网 | 日韩专区 在线 | 999视频网站 | 狠狠躁日日躁狂躁夜夜躁 | 日韩一区二区三区不卡 | 免费观看的av | 久草网视频在线观看 | 日韩色综合 | 精品久久久久国产免费第一页 | 最近字幕在线观看第一季 | 国产91全国探花系列在线播放 | 成人黄色免费观看 | 91在线免费观看网站 | 有码视频在线观看 | 日本在线观看中文字幕无线观看 | 成人网在线免费视频 | 91麻豆精品91久久久久同性 | 亚洲精品国偷拍自产在线观看 | 国产精品久久久久久影院 | 国产九色视频在线观看 | 高潮毛片无遮挡高清免费 | 免费高清无人区完整版 | 欧美va电影| 亚洲最新精品 | 丁香在线视频 | 中文字幕av电影下载 | 亚洲精品中文在线资源 | 免费a视频在线 | 波多野结依在线观看 | 91麻豆精品久久久久久 | 91亚洲精品久久久久图片蜜桃 | 黄色影院在线免费观看 | 黄色片视频在线观看 | 在线中文视频 | 欧美孕妇与黑人孕交 | 日韩毛片在线播放 | 日韩电影在线观看一区二区三区 | av在线永久免费观看 | 中文字幕在线成人 | 中文字幕第一页在线vr | 天天操夜操 | 在线看91| 91在线播放综合 | 国产精品久久久电影 | 日本中文一区二区 | 玖玖精品在线 | 久热免费在线观看 | 精品一二 | 在线小视频国产 | 激情网在线观看 | 欧美视频18| 天天精品视频 | 欧美午夜寂寞影院 | 久久成人精品视频 | www·22com天天操 | 五月激情五月激情 | 国产一区在线视频观看 | 在线午夜 | 在线观看理论 | 91在线免费播放 | 操碰av | 麻豆 videos | 成人av一二三区 | 日韩欧美专区 | 成人午夜网址 | 欧洲精品码一区二区三区免费看 | 黄色成人在线 | 看全黄大色黄大片 | 日韩电影一区二区三区在线观看 | 在线成人看片 | 17videosex性欧美| 久久草草影视免费网 | 黄色av一级 | 国产在线免费av | 婷婷日 | 亚洲精品日韩一区二区电影 | 黄色影院在线免费观看 | 一区二区三区四区免费视频 | 精品黄色在线 | 亚洲精品456在线播放第一页 | 久久91久久久久麻豆精品 | 91污视频在线 | 天天透天天插 | 4438全国亚洲精品在线观看视频 | 蜜臀精品久久久久久蜜臀 | 国产欧美日韩一区 | 在线观看激情av | 久久爱综合 | 亚洲精品国偷自产在线99热 | 日韩精品久久久 | 亚洲精品欧美专区 | 毛片永久新网址首页 | 日本韩国精品在线 | 成人黄色电影视频 | 91色在线观看 | 国产精品久久久久久久久久东京 | 天天射天天干 | 中文字幕乱在线伦视频中文字幕乱码在线 | 天堂中文在线播放 | 在线日韩中文字幕 | 韩国av免费| 精品在线视频一区 | 亚洲精品在线一区二区三区 | 三级黄在线 | 综合久色| 日韩高清不卡在线 | 国产乱码精品一区二区蜜臀 | 久久香蕉国产精品麻豆粉嫩av | 在线亚州 | 日韩在线观看影院 | 观看免费av | 蜜桃视频在线视频 | 日韩视频图片 | 久草新在线 | 99久久99久久免费精品蜜臀 | 国产va饥渴难耐女保洁员在线观看 | 久久国产精品成人免费浪潮 | 精品国产精品久久 | 色综合久久66 | 伊人天天色 | 91片网| 在线免费观看一区二区三区 | 久久深夜福利免费观看 | 99久久久免费视频 | 天天干天天操天天爱 | 欧美日韩在线观看视频 | 欧美另类xxx| 99热这里有 | 国产精品v欧美精品v日韩 | 中文字幕在线观看日本 | 日韩av片免费在线观看 | 在线91av | 六月天色婷婷 | 久草视频免费在线观看 | 狠狠色丁香婷婷综合最新地址 | 国产精品成人免费精品自在线观看 | 91免费观看视频在线 | 狠狠干夜夜| 成人在线播放视频 | 一级精品视频在线观看宜春院 | 一区二区三区在线免费播放 | 久久电影中文字幕视频 | 国产乱码精品一区二区三区介绍 | 欧美亚洲免费在线一区 | 麻豆免费在线视频 | 国产精品视频999 | 中文字幕丰满人伦在线 | 成人在线播放免费观看 | 99精品国产在热久久 | 中文字幕视频在线播放 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 91tv国产成人福利 | 成人一级黄色片 | 玖玖玖国产精品 | 国产视频精品免费播放 | 欧美精品国产综合久久 | 亚洲免费av电影 | 久久久wwww| 亚洲欧美在线视频免费 | 免费观看91视频大全 | 久久激情视频 | 激情开心色 | 久草电影免费在线观看 | 久久99精品国产一区二区三区 | 日韩成人在线一区二区 | 99久久这里只有精品 | 国产精品婷婷 | 欧美日韩国产二区三区 | 精品自拍sae8—视频 | www.午夜 | 五月天久久综合 | 911久久| 国产明星视频三级a三级点| 国内免费久久久久久久久久久 | 一区二区三区播放 | 日韩精品一区二区三区第95 | 国产精品不卡在线 | 亚洲精品视频第一页 | www.婷婷色 | 99免费精品视频 | 成人欧美一区二区三区在线观看 | 在线免费观看视频一区 | 精品黄色在线 | 在线成人短视频 | 97国产大学生情侣酒店的特点 | 91桃色免费视频 | 六月激情婷婷 | 亚洲欧美日韩国产一区二区 | 免费人成网ww44kk44 | 亚洲最大的av网站 | 人人插人人搞 | 最新日韩视频 | 中文字幕永久 | 亚洲国内在线 | 有码视频在线观看 | 日韩色综合 | 日韩免费电影一区二区 | 黄色av电影在线观看 | 在线播放 日韩专区 | 亚洲专区一二三 | 日韩高清免费无专码区 | 国产高清区 | 日韩有码第一页 | 成人一区在线观看 | 天天操天天干天天综合网 | 伊人天天 | 国产精品久久久久免费观看 | www.夜夜操| 亚洲欧美在线综合 | 国产成人精品午夜在线播放 | 亚洲欧美在线视频免费 | 中文字幕二区在线观看 | 久草在线在线精品观看 | 99色婷婷 | 国产玖玖精品视频 | 摸bbb搡bbb搡bbbb| 国产精品黑丝在线观看 | 国产中文字幕三区 | 四虎成人精品在永久免费 | 在线 欧美 日韩 | 色就是色综合 | 久草在线免费播放 | 中文字幕av在线免费 | 亚洲一二三在线 | 香蕉在线视频观看 |