久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9117|回復: 10
打印 上一主題 下一主題
收起左側

stm32 rc522射頻模塊程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:114530 發(fā)表于 2016-4-16 13:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
射頻模塊程序:
RFID_RC522.zip (7.22 MB, 下載次數(shù): 149)

程序預覽:
  1. #include "sys.h"
  2. #include "rc522.h"
  3. #include "delay.h"

  4. void delay_ns(u32 ns)
  5. {
  6.   u32 i;
  7.   for(i=0;i<ns;i++)
  8.   {
  9.     __nop();
  10.     __nop();
  11.     __nop();
  12.   }
  13. }

  14. u8 SPIWriteByte(u8 Byte)
  15. {
  16.         while((SPI2->SR&0X02)==0);                //等待發(fā)送區(qū)空          
  17.         SPI2->DR=Byte;                             //發(fā)送一個byte   
  18.         while((SPI2->SR&0X01)==0);      //等待接收完一個byte  
  19.         return SPI2->DR;                      //返回收到的數(shù)據(jù)                       
  20. }

  21. //SPIx 讀寫一個字節(jié)
  22. //TxData:要寫入的字節(jié)
  23. //返回值:讀取到的字節(jié)
  24. u8 SPI2_ReadWriteByte(u8 TxData)
  25. {               
  26.         u8 retry=0;                                        
  27.         while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //檢查指定的SPI標志位設置與否:發(fā)送緩存空標志位
  28.                 {
  29.                 retry++;
  30.                 if(retry>200)return 0;
  31.                 }                          
  32.         SPI_I2S_SendData(SPI2, TxData); //通過外設SPIx發(fā)送一個數(shù)據(jù)
  33.         retry=0;

  34.         while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //檢查指定的SPI標志位設置與否:接受緩存非空標志位
  35.                 {
  36.                 retry++;
  37.                 if(retry>200)return 0;
  38.                 }                                                              
  39.         return SPI_I2S_ReceiveData(SPI2); //返回通過SPIx最近接收的數(shù)據(jù)                                            
  40. }


  41. //SPI 速度設置函數(shù)
  42. //SpeedSet:
  43. //SPI_BaudRatePrescaler_2   2分頻   
  44. //SPI_BaudRatePrescaler_8   8分頻   
  45. //SPI_BaudRatePrescaler_16  16分頻  
  46. //SPI_BaudRatePrescaler_256 256分頻
  47.   
  48. void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
  49. {
  50.           assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
  51.         SPI2->CR1&=0XFFC7;
  52.         SPI2->CR1|=SPI_BaudRatePrescaler;        //設置SPI2速度
  53.         SPI_Cmd(SPI2,ENABLE);

  54. }




  55. void SPI2_Init(void)       
  56. {
  57.         GPIO_InitTypeDef GPIO_InitStructure;
  58.           SPI_InitTypeDef  SPI_InitStructure;
  59.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOF, ENABLE );//PORTB時鐘使能
  60.         RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );//SPI2時鐘使能

  61.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;         //IO-->PF0、PF1 端口配置
  62.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  63.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
  64.     GPIO_Init(GPIOF, &GPIO_InitStructure);                                         //根據(jù)設定參數(shù)初始化PF0、PF1
  65.     GPIO_ResetBits(GPIOF,GPIO_Pin_1);                                     //PF1輸出低
  66.     //GPIO_SetBits(GPIOF,GPIO_Pin_0);

  67.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  68.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15復用推挽輸出
  69.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  70.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

  71.         GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

  72.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //設置SPI單向或者雙向的數(shù)據(jù)模式:SPI設置為雙線雙向全雙工
  73.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //設置SPI工作模式:設置為主SPI
  74.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //設置SPI的數(shù)據(jù)大小:SPI發(fā)送接收8位幀結構
  75.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                //串行同步時鐘的空閑狀態(tài)為低電平
  76.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        //串行同步時鐘的第一個跳變沿(上升或下降)數(shù)據(jù)被采樣
  77.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信號由硬件(NSS管腳)還是軟件(使用SSI位)管理:內部NSS信號有SSI位控制
  78.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定義波特率預分頻的值:波特率預分頻值為256
  79.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定數(shù)據(jù)傳輸從MSB位還是LSB位開始:數(shù)據(jù)傳輸從MSB位開始
  80.         SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值計算的多項式
  81.         SPI_Init(SPI2, &SPI_InitStructure);  //根據(jù)SPI_InitStruct中指定的參數(shù)初始化外設SPIx寄存器

  82.         SPI_Cmd(SPI2, ENABLE); //使能SPI外設
  83.        
  84.         //SPI2_ReadWriteByte(0xff);//啟動傳輸       
  85. }

  86. void InitRc522(void)
  87. {
  88.   SPI2_Init();
  89.   PcdReset();
  90.   PcdAntennaOff();
  91.   delay_ms(2);  
  92.   PcdAntennaOn();
  93.   M500PcdConfigISOType( 'A' );
  94. }
  95. void Reset_RC522(void)
  96. {
  97.   PcdReset();
  98.   PcdAntennaOff();
  99.   delay_ms(2);  
  100.   PcdAntennaOn();
  101. }                        
  102. /////////////////////////////////////////////////////////////////////
  103. //功    能:尋卡
  104. //參數(shù)說明: req_code[IN]:尋卡方式
  105. //                0x52 = 尋感應區(qū)內所有符合14443A標準的卡
  106. //                0x26 = 尋未進入休眠狀態(tài)的卡
  107. //          pTagType[OUT]:卡片類型代碼
  108. //                0x4400 = Mifare_UltraLight
  109. //                0x0400 = Mifare_One(S50)
  110. //                0x0200 = Mifare_One(S70)
  111. //                0x0800 = Mifare_Pro(X)
  112. //                0x4403 = Mifare_DESFire
  113. //返    回: 成功返回MI_OK
  114. /////////////////////////////////////////////////////////////////////
  115. char PcdRequest(u8   req_code,u8 *pTagType)
  116. {
  117.         char   status;  
  118.         u8   unLen;
  119.         u8   ucComMF522Buf[MAXRLEN];

  120.         ClearBitMask(Status2Reg,0x08);
  121.         WriteRawRC(BitFramingReg,0x07);
  122.         SetBitMask(TxControlReg,0x03);

  123.         ucComMF522Buf[0] = req_code;

  124.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);

  125.         if ((status == MI_OK) && (unLen == 0x10))
  126.         {   
  127.                 *pTagType     = ucComMF522Buf[0];
  128.                 *(pTagType+1) = ucComMF522Buf[1];
  129.         }
  130.         else
  131.         {   status = MI_ERR;   }
  132.    
  133.         return status;
  134. }

  135. /////////////////////////////////////////////////////////////////////
  136. //功    能:防沖撞
  137. //參數(shù)說明: pSnr[OUT]:卡片序列號,4字節(jié)
  138. //返    回: 成功返回MI_OK
  139. /////////////////////////////////////////////////////////////////////  
  140. char PcdAnticoll(u8 *pSnr)
  141. {
  142.     char   status;
  143.     u8   i,snr_check=0;
  144.     u8   unLen;
  145.     u8   ucComMF522Buf[MAXRLEN];
  146.    

  147.     ClearBitMask(Status2Reg,0x08);
  148.     WriteRawRC(BitFramingReg,0x00);
  149.     ClearBitMask(CollReg,0x80);

  150.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  151.     ucComMF522Buf[1] = 0x20;

  152.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);

  153.     if (status == MI_OK)
  154.     {
  155.              for (i=0; i<4; i++)
  156.          {   
  157.              *(pSnr+i)  = ucComMF522Buf[i];
  158.              snr_check ^= ucComMF522Buf[i];
  159.          }
  160.          if (snr_check != ucComMF522Buf[i])
  161.          {   status = MI_ERR;    }
  162.     }
  163.    
  164.     SetBitMask(CollReg,0x80);
  165.     return status;
  166. }

  167. /////////////////////////////////////////////////////////////////////
  168. //功    能:選定卡片
  169. //參數(shù)說明: pSnr[IN]:卡片序列號,4字節(jié)
  170. //返    回: 成功返回MI_OK
  171. /////////////////////////////////////////////////////////////////////
  172. char PcdSelect(u8 *pSnr)
  173. {
  174.     char   status;
  175.     u8   i;
  176.     u8   unLen;
  177.     u8   ucComMF522Buf[MAXRLEN];
  178.    
  179.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  180.     ucComMF522Buf[1] = 0x70;
  181.     ucComMF522Buf[6] = 0;
  182.     for (i=0; i<4; i++)
  183.     {
  184.             ucComMF522Buf[i+2] = *(pSnr+i);
  185.             ucComMF522Buf[6]  ^= *(pSnr+i);
  186.     }
  187.     CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);
  188.   
  189.     ClearBitMask(Status2Reg,0x08);

  190.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
  191.    
  192.     if ((status == MI_OK) && (unLen == 0x18))
  193.     {   status = MI_OK;  }
  194.     else
  195.     {   status = MI_ERR;    }

  196.     return status;
  197. }

  198. /////////////////////////////////////////////////////////////////////
  199. //功    能:驗證卡片密碼
  200. //參數(shù)說明: auth_mode[IN]: 密碼驗證模式
  201. //                 0x60 = 驗證A密鑰
  202. //                 0x61 = 驗證B密鑰
  203. //          addr[IN]:塊地址
  204. //          pKey[IN]:密碼
  205. //          pSnr[IN]:卡片序列號,4字節(jié)
  206. //返    回: 成功返回MI_OK
  207. /////////////////////////////////////////////////////////////////////               
  208. char PcdAuthState(u8   auth_mode,u8   addr,u8 *pKey,u8 *pSnr)
  209. {
  210.     char   status;
  211.     u8   unLen;
  212.     u8   i,ucComMF522Buf[MAXRLEN];

  213.     ucComMF522Buf[0] = auth_mode;
  214.     ucComMF522Buf[1] = addr;
  215. //    for (i=0; i<6; i++)
  216. //    {    ucComMF522Buf[i+2] = *(pKey+i);   }
  217. //    for (i=0; i<6; i++)
  218. //    {    ucComMF522Buf[i+8] = *(pSnr+i);   }
  219.     memcpy(&ucComMF522Buf[2], pKey, 6);
  220.     memcpy(&ucComMF522Buf[8], pSnr, 4);
  221.    
  222.     status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
  223.     if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
  224.     {   status = MI_ERR;   }
  225.    
  226.     return status;
  227. }

  228. /////////////////////////////////////////////////////////////////////
  229. //功    能:讀取M1卡一塊數(shù)據(jù)
  230. //參數(shù)說明: addr[IN]:塊地址
  231. //          p [OUT]:讀出的數(shù)據(jù),16字節(jié)
  232. //返    回: 成功返回MI_OK
  233. /////////////////////////////////////////////////////////////////////
  234. char PcdRead(u8   addr,u8 *p )
  235. {
  236.     char   status;
  237.     u8   unLen;
  238.     u8   i,ucComMF522Buf[MAXRLEN];

  239.     ucComMF522Buf[0] = PICC_READ;
  240.     ucComMF522Buf[1] = addr;
  241.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  242.    
  243.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  244.     if ((status == MI_OK) && (unLen == 0x90))
  245. //   {   memcpy(p , ucComMF522Buf, 16);   }
  246.     {
  247.         for (i=0; i<16; i++)
  248.         {    *(p +i) = ucComMF522Buf[i];   }
  249.     }
  250.     else
  251.     {   status = MI_ERR;   }
  252.    
  253.     return status;
  254. }

  255. /////////////////////////////////////////////////////////////////////
  256. //功    能:寫數(shù)據(jù)到M1卡一塊
  257. //參數(shù)說明: addr[IN]:塊地址
  258. //          p [IN]:寫入的數(shù)據(jù),16字節(jié)
  259. //返    回: 成功返回MI_OK
  260. /////////////////////////////////////////////////////////////////////                  
  261. char PcdWrite(u8   addr,u8 *p )
  262. {
  263.     char   status;
  264.     u8   unLen;
  265.     u8   i,ucComMF522Buf[MAXRLEN];
  266.    
  267.     ucComMF522Buf[0] = PICC_WRITE;
  268.     ucComMF522Buf[1] = addr;
  269.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  270.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  271.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  272.     {   status = MI_ERR;   }
  273.         
  274.     if (status == MI_OK)
  275.     {
  276.         //memcpy(ucComMF522Buf, p , 16);
  277.         for (i=0; i<16; i++)
  278.         {   
  279.                 ucComMF522Buf[i] = *(p +i);   
  280.         }
  281.         CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);

  282.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
  283.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  284.         {   status = MI_ERR;   }
  285.     }
  286.    
  287.     return status;
  288. }

  289. /////////////////////////////////////////////////////////////////////
  290. //功    能:命令卡片進入休眠狀態(tài)
  291. //返    回: 成功返回MI_OK
  292. /////////////////////////////////////////////////////////////////////
  293. char PcdHalt(void)
  294. {
  295.     u8   status;
  296.     u8   unLen;
  297.     u8   ucComMF522Buf[MAXRLEN];

  298.     ucComMF522Buf[0] = PICC_HALT;
  299.     ucComMF522Buf[1] = 0;
  300.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  301.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  302.     return MI_OK;
  303. }

  304. /////////////////////////////////////////////////////////////////////
  305. //用MF522計算CRC16函數(shù)
  306. /////////////////////////////////////////////////////////////////////
  307. void CalulateCRC(u8 *pIn ,u8   len,u8 *pOut )
  308. {
  309.     u8   i,n;
  310.     ClearBitMask(DivIrqReg,0x04);
  311.     WriteRawRC(CommandReg,PCD_IDLE);
  312.     SetBitMask(FIFOLevelReg,0x80);
  313.     for (i=0; i<len; i++)
  314.     {   WriteRawRC(FIFODataReg, *(pIn +i));   }
  315.     WriteRawRC(CommandReg, PCD_CALCCRC);
  316.     i = 0xFF;
  317.     do
  318.     {
  319.         n = ReadRawRC(DivIrqReg);
  320.         i--;
  321.     }
  322.     while ((i!=0) && !(n&0x04));
  323.     pOut [0] = ReadRawRC(CRCResultRegL);
  324.     pOut [1] = ReadRawRC(CRCResultRegM);
  325. }

  326. /////////////////////////////////////////////////////////////////////
  327. //功    能:復位RC522
  328. //返    回: 成功返回MI_OK
  329. /////////////////////////////////////////////////////////////////////
  330. char PcdReset(void)
  331. {
  332.         //PORTD|=(1<<RC522RST);
  333.         SET_RC522RST;
  334.     delay_ns(10);
  335.         //PORTD&=~(1<<RC522RST);
  336.         CLR_RC522RST;
  337.     delay_ns(10);
  338.         //PORTD|=(1<<RC522RST);
  339.         SET_RC522RST;
  340.     delay_ns(10);
  341.     WriteRawRC(CommandReg,PCD_RESETPHASE);
  342.         WriteRawRC(CommandReg,PCD_RESETPHASE);
  343.     delay_ns(10);
  344.    
  345.     WriteRawRC(ModeReg,0x3D);            //和Mifare卡通訊,CRC初始值0x6363
  346.     WriteRawRC(TReloadRegL,30);           
  347.     WriteRawRC(TReloadRegH,0);
  348.     WriteRawRC(TModeReg,0x8D);
  349.     WriteRawRC(TPrescalerReg,0x3E);
  350.        
  351.         WriteRawRC(TxAutoReg,0x40);//必須要
  352.    
  353.     return MI_OK;
  354. }
  355. //////////////////////////////////////////////////////////////////////
  356. //設置RC632的工作方式
  357. //////////////////////////////////////////////////////////////////////
  358. char M500PcdConfigISOType(u8   type)
  359. {
  360.    if (type == 'A')                     //ISO14443_A
  361.    {
  362.        ClearBitMask(Status2Reg,0x08);
  363.        WriteRawRC(ModeReg,0x3D);//3F
  364.        WriteRawRC(RxSelReg,0x86);//84
  365.        WriteRawRC(RFCfgReg,0x7F);   //4F
  366.               WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
  367.            WriteRawRC(TReloadRegH,0);
  368.        WriteRawRC(TModeReg,0x8D);
  369.            WriteRawRC(TPrescalerReg,0x3E);
  370.            delay_ns(1000);
  371.        PcdAntennaOn();
  372.    }
  373.    else{ return 1; }
  374.    
  375.    return MI_OK;
  376. }
  377. /////////////////////////////////////////////////////////////////////
  378. //功    能:讀RC632寄存器
  379. //參數(shù)說明:Address[IN]:寄存器地址
  380. //返    回:讀出的值
  381. /////////////////////////////////////////////////////////////////////
  382. u8 ReadRawRC(u8   Address)
  383. {
  384.     u8   ucAddr;
  385.     u8   ucResult=0;
  386.         CLR_SPI_CS;
  387.     ucAddr = ((Address<<1)&0x7E)|0x80;
  388.        
  389.         SPIWriteByte(ucAddr);
  390.         ucResult=SPIReadByte();
  391.         SET_SPI_CS;
  392.    return ucResult;
  393. }

  394. /////////////////////////////////////////////////////////////////////
  395. //功    能:寫RC632寄存器
  396. //參數(shù)說明:Address[IN]:寄存器地址
  397. //          value[IN]:寫入的值
  398. /////////////////////////////////////////////////////////////////////
  399. void WriteRawRC(u8   Address, u8   value)
  400. {  
  401.     u8   ucAddr;
  402. //        u8 tmp;

  403.         CLR_SPI_CS;
  404.     ucAddr = ((Address<<1)&0x7E);

  405.         SPIWriteByte(ucAddr);
  406.         SPIWriteByte(value);
  407.         SET_SPI_CS;

  408. //        tmp=ReadRawRC(Address);
  409. //
  410. //        if(value!=tmp)
  411. //                printf("wrong\n");
  412. }
  413. /////////////////////////////////////////////////////////////////////
  414. //功    能:置RC522寄存器位
  415. //參數(shù)說明:reg[IN]:寄存器地址
  416. //          mask[IN]:置位值
  417. /////////////////////////////////////////////////////////////////////
  418. void SetBitMask(u8   reg,u8   mask)  
  419. {
  420.     char   tmp = 0x0;
  421.     tmp = ReadRawRC(reg);
  422.     WriteRawRC(reg,tmp | mask);  // set bit mask
  423. }

  424. /////////////////////////////////////////////////////////////////////
  425. //功    能:清RC522寄存器位
  426. //參數(shù)說明:reg[IN]:寄存器地址
  427. //          mask[IN]:清位值
  428. /////////////////////////////////////////////////////////////////////
  429. void ClearBitMask(u8   reg,u8   mask)  
  430. {
  431.     char   tmp = 0x0;
  432.     tmp = ReadRawRC(reg);
  433.     WriteRawRC(reg, tmp & ~mask);  // clear bit mask
  434. }

  435. /////////////////////////////////////////////////////////////////////
  436. //功    能:通過RC522和ISO14443卡通訊
  437. //參數(shù)說明:Command[IN]:RC522命令字
  438. //          pIn [IN]:通過RC522發(fā)送到卡片的數(shù)據(jù)
  439. //          InLenByte[IN]:發(fā)送數(shù)據(jù)的字節(jié)長度
  440. //          pOut [OUT]:接收到的卡片返回數(shù)據(jù)
  441. //          *pOutLenBit[OUT]:返回數(shù)據(jù)的位長度
  442. /////////////////////////////////////////////////////////////////////
  443. char PcdComMF522(u8   Command,
  444.                  u8 *pIn ,
  445.                  u8   InLenByte,
  446.                  u8 *pOut ,
  447.                  u8 *pOutLenBit)
  448. {
  449.     char   status = MI_ERR;
  450.     u8   irqEn   = 0x00;
  451.     u8   waitFor = 0x00;
  452.     u8   lastBits;
  453.     u8   n;
  454.     u16   i;
  455.     switch (Command)
  456.     {
  457.         case PCD_AUTHENT:
  458.                         irqEn   = 0x12;
  459.                         waitFor = 0x10;
  460.                         break;
  461.                 case PCD_TRANSCEIVE:
  462.                         irqEn   = 0x77;
  463.                         waitFor = 0x30;
  464.                         break;
  465.                 default:
  466.                         break;
  467.     }
  468.    
  469.     WriteRawRC(ComIEnReg,irqEn|0x80);
  470.     ClearBitMask(ComIrqReg,0x80);        //清所有中斷位
  471.     WriteRawRC(CommandReg,PCD_IDLE);
  472.     SetBitMask(FIFOLevelReg,0x80);                 //清FIFO緩存
  473.    
  474.     for (i=0; i<InLenByte; i++)
  475.     {   WriteRawRC(FIFODataReg, pIn [i]);    }
  476.     WriteRawRC(CommandReg, Command);          
  477. //            n = ReadRawRC(CommandReg);
  478.    
  479.     if (Command == PCD_TRANSCEIVE)
  480.     {    SetBitMask(BitFramingReg,0x80);  }         //開始傳送
  481.                                                                                      
  482.     //i = 600;//根據(jù)時鐘頻率調整,操作M1卡最大等待時間25ms
  483.         i = 2000;
  484.     do
  485.     {
  486.         n = ReadRawRC(ComIrqReg);
  487.         i--;
  488.     }
  489.     while ((i!=0) && !(n&0x01) && !(n&waitFor));
  490.     ClearBitMask(BitFramingReg,0x80);

  491.     if (i!=0)
  492.     {   
  493.         if(!(ReadRawRC(ErrorReg)&0x1B))
  494.         {
  495.             status = MI_OK;
  496.             if (n & irqEn & 0x01)
  497.             {   status = MI_NOTAGERR;   }
  498.             if (Command == PCD_TRANSCEIVE)
  499.             {
  500.                        n = ReadRawRC(FIFOLevelReg);
  501.                       lastBits = ReadRawRC(ControlReg) & 0x07;
  502.                 if (lastBits)
  503.                 {   *pOutLenBit = (n-1)*8 + lastBits;   }
  504.                 else
  505.                 {   *pOutLenBit = n*8;   }
  506.                 if (n == 0)
  507.                 {   n = 1;    }
  508.                 if (n > MAXRLEN)
  509.                 {   n = MAXRLEN;   }
  510.                 for (i=0; i<n; i++)
  511.                 {   pOut [i] = ReadRawRC(FIFODataReg);    }
  512.             }
  513.         }
  514.         else
  515.         {   status = MI_ERR;   }
  516.         
  517.     }
  518.    

  519.     SetBitMask(ControlReg,0x80);           // stop timer now
  520.     WriteRawRC(CommandReg,PCD_IDLE);
  521.     return status;
  522. }

  523. /////////////////////////////////////////////////////////////////////
  524. //開啟天線  
  525. //每次啟動或關閉天險發(fā)射之間應至少有1ms的間隔
  526. /////////////////////////////////////////////////////////////////////
  527. void PcdAntennaOn(void)
  528. {
  529.     u8   i;
  530.     i = ReadRawRC(TxControlReg);
  531.     if (!(i & 0x03))
  532.     {
  533.         SetBitMask(TxControlReg, 0x03);
  534.     }
  535. }


  536. /////////////////////////////////////////////////////////////////////
  537. //關閉天線
  538. /////////////////////////////////////////////////////////////////////
  539. void PcdAntennaOff(void)
  540. {
  541.         ClearBitMask(TxControlReg, 0x03);
  542. }

  543. /////////////////////////////////////////////////////////////////////
  544. //功    能:扣款和充值
  545. //參數(shù)說明: dd_mode[IN]:命令字
  546. //               0xC0 = 扣款
  547. //               0xC1 = 充值
  548. //          addr[IN]:錢包地址
  549. //          pValue[IN]:4字節(jié)增(減)值,低位在前
  550. //返    回: 成功返回MI_OK
  551. /////////////////////////////////////////////////////////////////////                 
  552. /*char PcdValue(u8 dd_mode,u8 addr,u8 *pValue)
  553. {
  554.     char status;
  555.     u8  unLen;
  556.     u8 ucComMF522Buf[MAXRLEN];
  557.     //u8 i;
  558.        
  559.     ucComMF522Buf[0] = dd_mode;
  560.     ucComMF522Buf[1] = addr;
  561.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  562.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  563.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  564.     {   status = MI_ERR;   }
  565.         
  566.     if (status == MI_OK)
  567.     {
  568.         memcpy(ucComMF522Buf, pValue, 4);
  569.         //for (i=0; i<16; i++)
  570.         //{    ucComMF522Buf[i] = *(pValue+i);   }
  571.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
  572.         unLen = 0;
  573.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  574.                 if (status != MI_ERR)
  575.         {    status = MI_OK;    }
  576.     }
  577.    
  578.     if (status == MI_OK)
  579.     {
  580.         ucComMF522Buf[0] = PICC_TRANSFER;
  581.         ucComMF522Buf[1] = addr;
  582.         CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  583.    
  584.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  585.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  586.         {   status = MI_ERR;   }
  587.     }
  588.     return status;
  589. }*/

  590. /////////////////////////////////////////////////////////////////////
  591. //功    能:備份錢包
  592. //參數(shù)說明: sourceaddr[IN]:源地址
  593. //          goaladdr[IN]:目標地址
  594. //返    回: 成功返回MI_OK
  595. /////////////////////////////////////////////////////////////////////
  596. /*char PcdBakValue(u8 sourceaddr, u8 goaladdr)
  597. {
  598.     char status;
  599.     u8  unLen;
  600.     u8 ucComMF522Buf[MAXRLEN];

  601.     ucComMF522Buf[0] = PICC_RESTORE;
  602.     ucComMF522Buf[1] = sourceaddr;
  603.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  604.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  605.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  606.     {   status = MI_ERR;   }
  607.    
  608.     if (status == MI_OK)
  609.     {
  610.         ucComMF522Buf[0] = 0;
  611.         ucComMF522Buf[1] = 0;
  612.         ucComMF522Buf[2] = 0;
  613.         ucComMF522Buf[3] = 0;
  614.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);

  615.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  616.                 if (status != MI_ERR)
  617.         {    status = MI_OK;    }
  618.     }
  619.    
  620.     if (status != MI_OK)
  621.     {    return MI_ERR;   }
  622.    
  623.     ucComMF522Buf[0] = PICC_TRANSFER;
  624.     ucComMF522Buf[1] = goaladdr;

  625.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

  626.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  627.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  628.     {   status = MI_ERR;   }

  629.     return status;
  630. }*/
復制代碼



main.c
  1. #include "output.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "rc522.h"
  5. #include "lcd.h"                         //顯示模塊
  6. #include "key.h"             //矩陣鍵盤模塊
  7. #include "usart.h"
  8. #include "string.h"
  9. //////////////////////////////////////////////////////////
  10. //M1卡分為16個扇區(qū),每個扇區(qū)由4塊(塊0、塊1、塊2、塊3)組成
  11. //我們也將16個扇區(qū)的64個塊按絕對地址編號0~63
  12. //第0扇區(qū)的塊0(即絕對地址0塊),他用於存放廠商代碼,已經固化,不可更改
  13. //每個扇區(qū)的塊0、塊1、塊2為數(shù)據(jù)塊,可用於存放數(shù)據(jù)
  14. //每個扇區(qū)的塊3為控制塊(絕對地址塊3、7、11....),包括了密碼A,存取控制、密碼B。

  15. /*******************************
  16. *連線說明:
  17. *1--SS  <----->PF0
  18. *2--SCK <----->PB13
  19. *3--MOSI<----->PB15
  20. *4--MISO<----->PB14
  21. *5--懸空
  22. *6--GND <----->GND
  23. *7--RST <----->PF1
  24. *8--VCC <----->VCC
  25. ************************************/
  26. /*全局變量*/
  27. unsigned char CT[2];//卡類型
  28. unsigned char SN[4]; //卡號
  29. unsigned char RFID[16];                        //存放RFID
  30. unsigned char lxl_bit=0;
  31. unsigned char card1_bit=0;
  32. unsigned char card2_bit=0;
  33. unsigned char card3_bit=0;
  34. unsigned char card4_bit=0;
  35. unsigned char total=0;
  36. unsigned char lxl[4]={6,109,250,186};
  37. unsigned char card_1[4]={66,193,88,0};
  38. unsigned char card_2[4]={66,191,104,0};
  39. unsigned char card_3[4]={62,84,28,11};
  40. unsigned char card_4[4]={126,252,248,12};
  41. u8 KEY[6]={0xff,0xff,0xff,0xff,0xff,0xff};
  42. unsigned char RFID1[16]={0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x07,0x80,0x29,0xff,0xff,0xff,0xff,0xff,0xff};
  43. /*函數(shù)聲明*/
  44. void ShowID(u16 x,u16 y, u8 *p, u16 charColor, u16 bkColor);         //顯示卡的卡號,以十六進制顯示
  45. void PutNum(u16 x,u16 y, u32 n1,u8 n0, u16 charColor, u16 bkColor);        //顯示余額函數(shù)
  46. void Store(u8 *p,u8 store,u8 cash);//最重要的一個函數(shù)        
  47. int main(void)
  48. {               
  49.         unsigned char status;
  50.         unsigned char s=0x08;
  51.         //u8 Data[16];
  52.         //u8 i;
  53.         u8 t,key;
  54.         //u8 k;//讀寫錯誤重試次數(shù)
  55.         u8 j;

  56.          delay_init();                     //延時函數(shù)初始化         
  57.         NVIC_Configuration();          //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
  58.          OUTPUT_Init();                         //輸出模塊初始化
  59.         uart_init(9600);                                
  60.         LCD_Init();
  61.         KEY_Init();
  62.         InitRc522();                                //初始化射頻卡模塊
  63.         //sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//將LCD ID打印到lcd_id數(shù)組。
  64.         LEDA=1;         
  65.           while(1)
  66.         {                key=KEY_Scan(0);
  67.                        if(key==1){s++;LCD_ShowNum(0,272,s,3,16);}
  68.                         else if(key==3) {s--;LCD_ShowNum(0,272,s,3,16);}
  69.                         status = PcdRequest(PICC_REQALL,CT);/*尋卡*/
  70.                         if(status==MI_OK)//尋卡成功
  71.                         {
  72.                          LCD_ShowString(0,30,200,16,16,"PcdRequest_MI_OK");
  73.                          status=MI_ERR;
  74.                          status = PcdAnticoll(SN);/*防沖撞*/
  75.                         
  76.                         }




  77.                         if (status==MI_OK)//防衝撞成功
  78.                         {
  79.                                 LCD_ShowString(150,30,200,16,16,"PcdAnticoll_MI_OK");
  80.                                 status=MI_ERR;               
  81.                                 LEDA=1;
  82.                                 LEDB=1;
  83.                                 ShowID(0,200,SN,BLUE,WHITE); //在液晶屏上顯示卡的ID號
  84.                                 //printf("ID:%02x %02x %02x %02x\n",SN[0],SN[1],SN[2],SN[3]);//發(fā)送卡號
  85.                                 LCD_ShowString(0,100,200,16,16,"The Card ID is:");
  86.                                 for(j=0;j<4;j++)
  87.                                 {
  88.                                          LCD_ShowNum(0,116+j*16,SN[j],3,16);
  89.                                 }
  90.                                 if((SN[0]==lxl[0])&&(SN[1]==lxl[1])&&(SN[2]==lxl[2])&&(SN[3]==lxl[3]))
  91.                                 {
  92.                                         lxl_bit=1;
  93.                                         LCD_ShowString(0,0,200,16,16,"The User is:lxl");
  94.                                 }
  95.                                 if((SN[0]==card_1[0])&&(SN[1]==card_1[1])&&(SN[2]==card_1[2])&&(SN[3]==card_1[3]))
  96.                                 {
  97.                                         card1_bit=1;
  98.                                         LCD_ShowString(0,0,200,16,16,"The User is:card_1");
  99.                                 }
  100.                                 if((SN[0]==card_2[0])&&(SN[1]==card_2[1])&&(SN[2]==card_2[2])&&(SN[3]==card_2[3]))
  101.                                 {
  102.                                         card2_bit=1;
  103.                                         LCD_ShowString(0,0,200,16,16,"The User is:card_2");
  104.                                 }
  105.                                 
  106.                                 if((SN[0]==card_3[0])&&(SN[1]==card_3[1])&&(SN[2]==card_3[2])&&(SN[3]==card_3[3]))
  107.                                 {
  108.                                         card3_bit=1;
  109.                                         LCD_ShowString(0,0,200,16,16,"The User is:card_3");
  110.                                 }
  111.                                 if((SN[0]==card_4[0])&&(SN[1]==card_4[1])&&(SN[2]==card_4[2])&&(SN[3]==card_4[3]))
  112.                                 {
  113.                                         card4_bit=1;
  114.                                         LCD_ShowString(0,0,200,16,16,"The User is:card_4");
  115.                                 }
  116.                                 total=card1_bit+card2_bit+card3_bit+card4_bit+lxl_bit;
  117.                                 LCD_ShowString(0,16,200,16,16,"total:");
  118.                                 LCD_ShowNum(46,16,total,2,16);

  119.                                 status =PcdSelect(SN);
  120.                                 //Reset_RC522();
  121.                
  122.                         }
  123.                         else
  124.                         {
  125.                                 LEDA=0;//只點亮led0
  126.                                 LEDB=1;
  127.                         }
  128.                         if(status==MI_OK)//選卡成功
  129.                         {
  130.                          //LCD_ShowString(0,50,200,16,16,"PcdAnticoll_MI_OK");
  131.                          LCD_ShowString(0,48,200,16,16,"PcdSelect_MI_OK  ");
  132.                          status=MI_ERR;
  133.                          status =PcdAuthState(0x60,0x09,KEY,SN);
  134.                          }
  135.                          if(status==MI_OK)//驗證成功
  136.                          {
  137.                           LCD_ShowString(0,64,200,16,16,"PcdAuthState_MI_OK  ");
  138.                           status=MI_ERR;
  139.                           status=PcdRead(s,RFID);
  140.                           //status=PcdWrite(s,RFID1);
  141.                           }

  142.                         if(status==MI_OK)//讀卡成功
  143.                          {
  144.                           LCD_ShowString(0,80,200,16,16,"READ_MI_OK");
  145.                           status=MI_ERR;
  146.                           delay_ms(100);
  147.                          }
  148.                         if(key==2)
  149.                         {
  150.                         for(t=0;t<16;t++)                                        //開啟射頻模塊
  151.                 {
  152.                  USART_ClearFlag(USART1,USART_FLAG_TC);                 //讀取USART_SR
  153.                  USART_SendData(USART1,RFID[t]);                         //向串口2發(fā)送數(shù)據(jù)
  154.                  while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); //等待發(fā)送結束
  155.                  }
  156.                         }
  157.                         //else LCD_ShowString(0,80,200,16,16,"READ_MI_ERR ");
  158. //////////////////////////////////////////////////////////////////////////////////////////////////////
  159.                           /*if(status==MI_OK)
  160.                           {
  161.                            LCD_ShowString(120,80,200,16,16,"WRITE_MI_OK");
  162.                            status=MI_ERR;
  163.                           }*/
  164.                           //else LCD_ShowString(120,80,200,16,16,"WRITE_MI_ERR");
  165.                           //Reset_RC522();
  166.         }
  167.                         
  168.                         
  169. //////////////////////////////               
  170.            }
  171.                         



  172. /*************************************
  173. *函數(shù)功能:顯示卡的卡號,以十六進制顯示
  174. *參數(shù):x,y 坐標
  175. *                p 卡號的地址
  176. *                charcolor 字符的顏色
  177. *                bkcolor   背景的顏色
  178. ***************************************/
  179. void ShowID(u16 x,u16 y, u8 *p, u16 charColor, u16 bkColor)         //顯示卡的卡號,以十六進制顯示
  180. {
  181.         u8 num[9];
  182.         u8 i;

  183.         for(i=0;i<4;i++)
  184.         {
  185.                 num[i*2]=p[i]/16;
  186.                 num[i*2]>9?(num[i*2]+='7'):(num[i*2]+='0');
  187.                 num[i*2+1]=p[i]%16;
  188.                 num[i*2+1]>9?(num[i*2+1]+='7'):(num[i*2+1]+='0');
  189.         }
  190.         num[8]=0;
  191.         POINT_COLOR=RED;         
  192.         LCD_ShowString(x,y,200,16,16,"The Card ID is:");        
  193.         //DisplayString(x,y+16,num,charColor,bkColor);
  194.          for(i=0;i<8;i++)
  195.         {
  196.                   LCD_ShowNum(x+16*i,y+16,num[i],2,16);
  197.                   //LCD_ShowNum(x,y+32,num[1],2,16);
  198.                  // LCD_ShowNum(x,y+48,num[2],2,16);
  199.                  // LCD_ShowNum(x,y+64,num[3],2,16);
  200.                   
  201.                  // LCD_ShowNum(x,y+80,num[4],2,16);
  202.                  // LCD_ShowNum(x,y+96,num[5],2,16);
  203.                  // LCD_ShowNum(x,y+16*7,num[6],2,16);
  204.                  // LCD_ShowNum(x,y+16*8,num[7],2,16);
  205.                  // LCD_ShowNum(x,y+16*9,num[8],2,16);
  206.                  // LCD_ShowNum(x,y+16*10,num[9],2,16);
  207.         }
  208.         
  209. }
  210. /********************************
  211. *函數(shù)功能:求p的n次冪
  212. */
  213. int power(u8 p,u8 n)
  214. {
  215.         int pow=1;
  216.         u8 i;
  217.         for(i=0;i<n;i++)
  218.         {
  219.                 pow*=p;        
  220.         }
  221.         return pow;
  222. }

  223. u8 ReadData(u8   addr,u8 *pKey,u8 *pSnr,u8 *dataout)
  224. {
  225.         u8 status,k;
  226.         status=0x02;//
  227.         k=5;
  228.         do
  229.     {
  230.                 status=PcdAuthState(PICC_AUTHENT1A,addr,pKey,pSnr);
  231.                 k--;
  232.                 //printf("AuthState is wrong\n");                                                      
  233.     }while(status!=MI_OK && k>0);

  234.         status=0x02;//
  235.         k=5;
  236.         do
  237.     {
  238.                 status=PcdRead(addr,dataout);
  239.                 k--;
  240.                 //printf("ReadData is wrong\n");                                                              
  241.     }while(status!=MI_OK && k>0);
  242.         return status;
  243. }
  244. u8 WriteData(u8   addr,u8 *pKey,u8 *pSnr,u8 *datain)
  245. {
  246.         u8 status,k;
  247.         status=0x02;//
  248.         k=5;
  249.         do
  250.     {
  251.                 status=PcdAuthState(PICC_AUTHENT1A,addr,pKey,pSnr);
  252.                 k--;
  253.                 //printf("AuthState is wrong\n");                                                      
  254.     }while(status!=MI_OK && k>0);

  255.         status=0x02;//
  256.         k=5;
  257.         do
  258.     {
  259.                 status=PcdWrite(addr,datain);
  260.                 k--;
  261.                 //printf("ReadData is wrong\n");                                                              
  262.     }while(status!=MI_OK && k>0);
  263.         return status;
  264. }
  265. void PutNum(u16 x,u16 y, u32 n1,u8 n0, u16 charColor, u16 bkColor)
  266. {
  267. //        u8 tmp[13];
  268. //        u8 i;

  269.         //LCD_SetRegion(0,0,239,319,FALSE);
  270. //        tmp[0]=n1/1000000000+'0';
  271. //        for(i=1;i<10;i++)
  272. //        {
  273. ///                tmp[i]=n1/(1000000000/power(10,i))%10+'0';
  274. //        }
  275. //        tmp[10]='.';
  276. //        tmp[11]=n0+'0';
  277. //        tmp[12]=0;
  278.         //DisplayString(x,y,tmp,charColor,bkColor);
  279.         //LCD_ShowString(x,y,)

  280.         
  281. }
  282. void Store(u8 *p,u8 store,u8 cash)
  283. {

  284. }

復制代碼


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:113502 發(fā)表于 2016-5-10 09:56 | 只看該作者
不錯謝謝
回復

使用道具 舉報

板凳
ID:44441 發(fā)表于 2016-5-19 15:49 | 只看該作者
不錯謝謝                              
回復

使用道具 舉報

地板
ID:122029 發(fā)表于 2016-5-20 17:42 | 只看該作者
不錯的資料,謝謝分享
回復

使用道具 舉報

5#
ID:134242 發(fā)表于 2016-7-19 14:02 | 只看該作者
供應13.56M非接芯片,兼容CV520,RC522,RC523,F(xiàn)M17520,F(xiàn)M17522.具有絕對成本優(yōu)勢。有意者可加QQ458231727
回復

使用道具 舉報

6#
ID:138305 發(fā)表于 2016-9-2 22:52 | 只看該作者
不錯謝謝
回復

使用道具 舉報

7#
ID:185861 發(fā)表于 2017-4-3 20:54 | 只看該作者
流弊!不過我想要51的!
回復

使用道具 舉報

8#
ID:193265 發(fā)表于 2017-4-25 00:20 | 只看該作者
謝謝分享。。!
回復

使用道具 舉報

9#
ID:200856 發(fā)表于 2017-10-13 12:27 | 只看該作者
請問樓主

工作方式那里是RC632的    RC522的能用么
回復

使用道具 舉報

10#
ID:37730 發(fā)表于 2017-12-18 17:29 | 只看該作者
初學者,路過看看
回復

使用道具 舉報

11#
ID:528105 發(fā)表于 2022-3-23 14:39 | 只看該作者
void Store(u8 *p,u8 store,u8 cash);//最重要的一個函數(shù)     怎么沒有分享出來呢??
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久妇女 | 久草电影网| 日韩一级欧美一级 | 色偷偷噜噜噜亚洲男人 | 亚洲精品一区二区三区在线观看 | 99精品免费久久久久久日本 | 精品国产一级 | 欧美日韩三级在线观看 | 国产精品久久久久久久久久免费看 | 一区二区三区国产精品 | 国产精品久久久久久久久久久久冷 | 亚洲一区二区三区在线视频 | 欧美一区在线视频 | 亚洲一区二区视频在线观看 | 91成人精品 | 美国一级毛片a | 精品国产免费人成在线观看 | 蜜桃视频在线观看免费视频网站www | 亚洲一区自拍 | 亚洲国产精品日韩av不卡在线 | 欧美精品区 | 大乳boobs巨大吃奶挤奶 | 久久人体视频 | 国产精品久久久久久久久久免费看 | 欧美日韩专区 | 日本aa毛片a级毛片免费观看 | 日韩h | 国产成人综合一区二区三区 | 成人h视频在线 | 亚洲男人天堂av | 黄色av观看 | 超碰520| 黄色一级大片在线免费看产 | 欧美另类视频在线 | 成人小视频在线 | 亚洲福利av| 国产在线一区观看 | 国产高清视频一区二区 | 免费看一区二区三区 | 日本视频在线播放 | 国产乱人伦|