- //******************************************************************/
- //功 能:防冲撞 /
- //参数说明: pSnr[OUT]:卡片序列号,4字节 /
- //返 回: 成功返回MI_OK /
- //******************************************************************/
- char PcdAnticoll(unsigned char *pSnr)
- {
- char status;
- unsigned char i,snr_check=0;
- unsigned int unLen;
- unsigned char ucComMF522Buf[MAXRLEN];
-
- ClearBitMask(Status2Reg,0x08);
- WriteRawRC(BitFramingReg,0x00);
- ClearBitMask(CollReg,0x80);
-
- ucComMF522Buf[0] = PICC_ANTICOLL1;
- ucComMF522Buf[1] = 0x20;
- status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
- if (status == MI_OK)
- {
- for (i=0; i<4; i++)
- {
- *(pSnr+i) = ucComMF522Buf[i];
- snr_check ^= ucComMF522Buf[i];
- }
- if (snr_check != ucComMF522Buf[i])
- { status = MI_ERR; }
- }
- SetBitMask(CollReg,0x80);
- return status;
- }
- //******************************************************************/
- //功 能:寻卡 /
- //参数说明: req_code[IN]:寻卡方式 /
- // 0x52 = 寻感应区内所有符合14443A标准的卡 /
- // 0x26 = 寻未进入休眠状态的卡 /
- // pTagType[OUT]:卡片类型代码 /
- // 0x4400 = Mifare_UltraLight /
- // 0x0400 = Mifare_One(S50) /
- // 0x0200 = Mifare_One(S70) /
- // 0x0800 = Mifare_Pro(X) /
- // 0x4403 = Mifare_DESFire /
- //返 回: 成功返回MI_OK /
- //******************************************************************/
- char PcdRequest(unsigned char req_code,unsigned char *pTagType)
- {
- char status ;
- unsigned int unLen ;
- unsigned char ucComMF522Buf[MAXRLEN] ;
- ClearBitMask(Status2Reg,0x08) ;
- WriteRawRC(BitFramingReg,0x07) ;
- SetBitMask(TxControlReg,0x03) ;
-
- ucComMF522Buf[0] = req_code ;
- status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,
- 1,ucComMF522Buf,&unLen );
- if ((status == MI_OK) && (unLen == 0x10))
- {
- *pTagType = ucComMF522Buf[0] ;
- *(pTagType+1) = ucComMF522Buf[1] ;
- }
- else
- status = MI_ERR ;
- return status ;
- }
寻卡,自动读卡的ID号。
- void Auto_Reader(void)
- {
- uint8_t i,j;
- while(1)
- {
- if(PcdRequest(0x52,Temp)==MI_OK)
- {
- if(Temp[0]==0x04&&Temp[1]==0x00)
- BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"MFOne-S50", LEFT_MODE);
- else if(Temp[0]==0x02&&Temp[1]==0x00)
- BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"MFOne-S70", LEFT_MODE);
- else if(Temp[0]==0x44&&Temp[1]==0x00)
- BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"MF-UltraLight", LEFT_MODE);
- else if(Temp[0]==0x08&&Temp[1]==0x00)
- BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"MF-Pro", LEFT_MODE);
- else if(Temp[0]==0x44&&Temp[1]==0x03)
- BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"MF Desire", LEFT_MODE);
- else
- BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"Unknown", LEFT_MODE);
- if(PcdAnticoll(UID)==MI_OK)
- {
- BSP_LCD_DisplayStringAt(0, 30, (uint8_t *)"Card Id is:", LEFT_MODE);
- for(i = 0; i < 4;i++)
- changeid(UID[i],i);
- for(j = 0;j < 10;j++)
- BSP_LCD_DisplayChar(j*15,60,tochar(ID[j]));
- }
- }
- }
- }
- void Find_Card(void)
- {
- if(PcdRequest(0x52,Temp)==MI_OK)
- {
- if(Temp[0]==0x04&&Temp[1]==0x00)
- BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"MFOne-S50", LEFT_MODE);
- else if(Temp[0]==0x02&&Temp[1]==0x00)
- BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"MFOne-S70", LEFT_MODE);
- else if(Temp[0]==0x44&&Temp[1]==0x00)
- BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"MF-UltraLight", LEFT_MODE);
- else if(Temp[0]==0x08&&Temp[1]==0x00)
- BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"MF-Pro", LEFT_MODE);
- else if(Temp[0]==0x44&&Temp[1]==0x03)
- BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"MF Desire", LEFT_MODE);
- else
- BSP_LCD_DisplayStringAt(0, 0, (uint8_t *)"Unknown", LEFT_MODE);
- BSP_LCD_DisplayStringAt(0, 20, (uint8_t *)"Success!", LEFT_MODE);
- }
- else
- BSP_LCD_DisplayStringAt(0, 20, (uint8_t *)"Faile!", LEFT_MODE);
- }
如果想实现竖屏显示只需要修改如下代码即可(stm32469i_discovery_lcd.c):
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] Initializes the DSI LCD.
- * @param None
- * @retval LCD state
- */
- uint8_t BSP_LCD_Init(void)
- {
- return (BSP_LCD_InitEx(LCD_ORIENTATION_PORTRAIT));
- }
宏定义在stm32469i_discovery_lcd.h文件中- **
- * [url=home.php?mod=space&uid=247401]@brief[/url] LCD_OrientationTypeDef
- * Possible values of Display Orientation
- */
- typedef enum
- {
- LCD_ORIENTATION_PORTRAIT = 0x00, /*!< Portrait orientation choice of LCD screen */
- LCD_ORIENTATION_LANDSCAPE = 0x01, /*!< Landscape orientation choice of LCD screen */
- LCD_ORIENTATION_INVALID = 0x02 /*!< Invalid orientation choice of LCD screen */
- } LCD_OrientationTypeDef;
效果图:
目前只实现了读卡的ID号,后期会移植STemWin界面,增加写标签的功能,以及标签数据上传的功能,持续更新,请关注。

MFRC522数据手册:
MF_RC522中文资料.pdf
(906.94 KB, 下载次数: 10)
工程文件:
MFRC522.zip
(1.18 MB, 下载次数: 12)