本帖最后由 绝影 于 2015-12-30 21:36 编辑
开发系统环境:
●OS:Windows 7 Ultimate (32bit)
●IDE:IAR Emedded Workbench 7.40.7.9865
下载链接及**方法:【链接:http://pan.baidu.com/s/1hrkUhy0 密码:mpsb】
●Board:STM32F469I—Disco
●Firmware:HAL库V1.10.0
由于下一个研发的项目就是手持式的电子标签读写器,这也是我申请试用STM32F469-Disco的初衷,想用STM32F469做一个前期的评估。最近真的好忙啊,上一个项目要结题了,天天加班写文档呢。,真的好累。。断断续续一直在调,今天终于调出点眉目了。开森。:lol
本设计选用NXP的MFRC522作为读写控制芯片,这款芯片的资料比较多。淘宝也有现成的模块。
MFRC522的主要特性:
MFRC522模块图:
本设计采用SPI接口控制MFRC522,接线如下所示:
接口 | STM32F469—Disco | MFRC522 | CLK | CN5-6(D13) | SCK | MOSI | CN5-4(D11) | MOSI | MISO | CN5-5(D12) | MISO | CS | CN5-3(D10) | SDA | RST | CN5-2(D9) | RST | 3.3V | CN6-4(3.3V) | 3.3V | GND | CN6-6(GND) | GND | 主要代码:
//******************************************************************/
//功 能:防冲撞 /
//参数说明: 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)
工程文件:
MFRC522.zip
(1.18 MB)
|
|