查看: 3681|回复: 0

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

[复制链接]
  • TA的每日心情
    难过
    2021-2-27 22:16
  • 签到天数: 1568 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2018-1-12 13:44:28 | 显示全部楼层 |阅读模式
    分享到:
    【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作为读写控制芯片,这款芯片的资料比较多。淘宝也有现成的模块。
           MFRC522的主要特性:

    1.jpg

    2.jpg

    MFRC522模块图:

    3.jpg

    主要代码:
    //******************************************************************/
    //功    能:防冲撞                                                  /
    //参数说明: 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                                      ;
    }

    寻卡,自动读卡的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);
            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)

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

    效果图:

    6.jpg

    7.jpg   

    8---.gif

    9---.gif


    MFRC522数据手册: MF_RC522中文资料.pdf (906.94 KB, 下载次数: 0, 售价: 1 与非币)
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-3-28 22:53 , Processed in 0.111426 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.