打印
[应用相关]

13..STM32F469---手持式电子标签读写器设计

[复制链接]
713|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
【STM32F469试用】手持式电子标签读写器设计【转】

开发系统环境:
        ●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做一个前期的评估。最近真的好忙啊,上一个项目要结题了,天天加班写文档呢。,真的好累。。断断续续一直在调,今天终于调出点眉目了。开森。
       本设计选用NXP的MFRC522作为读写控制芯片,这款芯片的资料比较多。淘宝也有现成的模块。
   
沙发
wangjiahao88|  楼主 | 2018-2-28 21:00 | 只看该作者
图片如下

1.jpg (343.14 KB )

1.jpg

使用特权

评论回复
板凳
wangjiahao88|  楼主 | 2018-2-28 21:01 | 只看该作者
主要代码:
//******************************************************************/
//功    能:防冲撞                                                  /
//参数说明: 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;
             snr_check ^= ucComMF522Buf;
         }
         if (snr_check != ucComMF522Buf)
         {   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                                      ;
}

使用特权

评论回复
地板
wangjiahao88|  楼主 | 2018-2-28 21:02 | 只看该作者
/功    能:寻卡                                                    /
//参数说明: 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号。

使用特权

评论回复
5
wangjiahao88|  楼主 | 2018-2-28 21:03 | 只看该作者
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);
        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);                                          
}

使用特权

评论回复
6
wangjiahao88|  楼主 | 2018-2-28 21:05 | 只看该作者
如果想实现竖屏显示只需要修改如下代码即可(stm32469i_discovery_lcd.c)

/**
  * @brief  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文件中

**
*  @brief 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;

使用特权

评论回复
7
捉虫天师| | 2018-2-28 22:44 | 只看该作者
可以做门禁应用了。

使用特权

评论回复
8
捉虫天师| | 2018-2-28 22:44 | 只看该作者
好多非接触卡应该都是这种方式做的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

473

主题

7517

帖子

30

粉丝