找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 629|回复: 10
收起左侧

HT7333供电给RC522 空载时电压为3.2V,加了模块后电压升到了4.2V

[复制链接]
ID:1079614 发表于 2024-7-10 19:22 | 显示全部楼层 |阅读模式
HT7333供电给RC522.空载时电压为3.2V,加了模块后电压升到了4.2V,现在读卡也读不到。电路设计是用的我之前可行的电路,程序也是之前可行的直接改的。实在没头绪查问题点。模块换过两个,7333也换了两个,还是这样。

空载

空载

负载

负载

电路

电路

原理图

原理图
回复

使用道具 举报

ID:1079614 发表于 2024-7-10 19:24 | 显示全部楼层
  1. void IC_cl(void)
  2. {
  3.         char status,kk = 0;
  4.         unsigned char snr, buf[16];  


  5.         status= PcdRequest(REQ_ALL,TagType); //寻卡
  6. //        beep();
  7.         if(!status)
  8.         {         //beep();        
  9.                 status = PcdAnticoll(SelectedSnr);        //防冲撞
  10.                 if(!status)
  11.                 {         //beep();
  12.                         status=PcdSelect(SelectedSnr); // 选定卡片
  13.                         if(!status)
  14.                         {  

  15.                                 snr = 2;  //扇区号2
  16.         
  17.                               status = PcdAuthState(KEYA, (snr*4+3), NewKey, SelectedSnr);// 校验1扇区密码,密码位于每一扇区第3块
  18.                                 {        
  19.                                         if(!status)
  20.                                         {

  21.                                                         buf[0] = 0x00;
  22.                                                         status = PcdRead((snr*4+0), buf);  // 读卡,读取1扇区0块数据到buf[0]-buf[16]
  23.                                                         if(buf[0] == 0xF4 || buf[0] == 0xE2)        //进入工作卡
  24.                                                         {
  25.                                                                 if(buf[0] == 0xF4)
  26.                                                                 {
  27.                                                                         IC_Number = buf[1] * 100 + buf[2]; //写入工作卡次数
  28.                                                                         
  29.                                                                 }
  30.                                                                 else  IC_Number = 998;
  31.                                                                 mint = buf[3]; //写入工作卡时间
  32.                                                                 if(IC_Number > 0)
  33.                                                                 {
  34.                                                                         if(buf[0] == 0xF4)
  35.                                                                         {        
  36.                                                                                 IC_Number = IC_Number - 1;
  37.                                                                                 buf[0] = 0xF4; //写入工作卡
  38.                                                                         }
  39.                                                                         else   buf[0] = 0xE2; //写入工作卡
  40.                                                                         buf[1] = IC_Number / 100; //写入工作卡次数
  41.                                                                         buf[2] = IC_Number % 100; //写入工作卡次数
  42.                                                                         buf[3] = mint; //写入工作卡时间
  43.                                                                         status = PcdWrite((snr*4+0), buf);  // 写卡,将buf[0]-buf[16]写入1扇区0块
  44.                                                                         beep_flag = 1;

  45.                         
  46.                                                                 }
  47.         
  48.                                                                 beep();         
  49.         

  50.                                                                 WaitCardOff();        //等待卡离开
  51.                                                         }
  52.                                                 }
  53.                                         }
  54.                                 }
  55.                         }
  56.                
  57.         }
  58.         

  59. }


  60. #include <intrins.h>
  61. //#include "reg52.h"
  62. #include "STC8.h"
  63. //#include "main.h"
  64. #include "mfrc522.h"
  65. #include <string.h>
  66. #define MAXRLEN 18      

  67. //////////////////////////////////
  68. //端口定义
  69. /////////////////////////////////////////////////////////////////////
  70. //MFRC522
  71. sbit     MF522_RST  =    P3^7;//P5^4;//                  //RC500片选
  72. sbit     MF522_NSS  =    P2^1;//P3^3;//
  73. sbit     MF522_SCK  =    P2^2;//P1^5;//
  74. sbit     MF522_MOSI =    P2^3;//P1^6;//
  75. sbit         MF522_MISO =    P2^0;//P1^7;//  单片机做输入脚
  76. /*********************************************************/                  
  77. /////////////////////////////////////////////////////////////////////
  78. //功    能:寻卡
  79. //参数说明: req_code[IN]:寻卡方式
  80. //                0x52 = 寻感应区内所有符合14443A标准的卡
  81. //                0x26 = 寻未进入休眠状态的卡
  82. //          pTagType[OUT]:卡片类型代码
  83. //                0x4400 = Mifare_UltraLight
  84. //                0x0400 = Mifare_One(S50)
  85. //                0x0200 = Mifare_One(S70)
  86. //                0x0800 = Mifare_Pro(X)
  87. //                0x4403 = Mifare_DESFire
  88. //返    回: 成功返回MI_OK
  89. /////////////////////////////////////////////////////////////////////
  90. char PcdRequest(unsigned char req_code,unsigned char *pTagType)
  91. {
  92.    char status;  
  93.    unsigned int  unLen;
  94.    unsigned char ucComMF522Buf[MAXRLEN];
  95. //  unsigned char xTest ;
  96.    ClearBitMask(Status2Reg,0x08);//寄存器包含接收器和发送器和数据模式检测器的状态标志
  97.    WriteRawRC(BitFramingReg,0x07);//不启动数据发送


  98.    SetBitMask(TxControlReg,0x03);//TX1、TX2输出信号将传递经发送数据调制的13.56MHz的能量载波信号。

  99.    ucComMF522Buf[0] = req_code;

  100.    status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
  101.    //通过522发送req_code命令,并接收返回数据,存到ucComMF522Buf中
  102. //     if(status  == MI_OK )
  103. //   { LED_GREEN  =0 ;}
  104. //   else {LED_GREEN =1 ;}
  105.    if ((status == MI_OK) && (unLen == 0x10)) //这个为啥是0x10,因为是2个字节共16bit
  106.    {   
  107.        *pTagType     = ucComMF522Buf[0];
  108.        *(pTagType+1) = ucComMF522Buf[1]; //获取卡类型
  109.    }
  110.    else
  111.    {   status = MI_ERR;   }
  112.    
  113.    return status;
  114. }
  115. /****************************************************************/
  116. /////////////////////////////////////////////////////////////////////
  117. //功    能:防冲撞
  118. //参数说明: pSnr[OUT]:卡片序列号,4字节
  119. //返    回: 成功返回MI_OK
  120. /////////////////////////////////////////////////////////////////////  
  121. char PcdAnticoll(unsigned char *pSnr)
  122. {
  123.     char status;
  124.     unsigned char i,snr_check=0;
  125.     unsigned int  unLen;
  126.     unsigned char ucComMF522Buf[MAXRLEN];
  127.    

  128.     ClearBitMask(Status2Reg,0x08);//寄存器包含接收器和发送器和数据模式检测器的状态标志
  129.     WriteRawRC(BitFramingReg,0x00);//不启动数据发送,接收的LSB位存放在位0,接收到的第二位放在位1,定义发送的最后一个字节的位数为8
  130.     ClearBitMask(CollReg,0x80);//所有接收的位在冲突后将被清除。

  131.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  132.     ucComMF522Buf[1] = 0x20;

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

  134.     if (status == MI_OK)
  135.     {
  136.              for (i=0; i<4; i++)
  137.          {   
  138.              *(pSnr+i)  = ucComMF522Buf[i];
  139.              snr_check ^= ucComMF522Buf[i];
  140.          }
  141.          if (snr_check != ucComMF522Buf[i])//返回四个字节,最后一个字节为校验位
  142.          {   status = MI_ERR;    }
  143.     }
  144.    
  145.     SetBitMask(CollReg,0x80);
  146.     return status;
  147. }
  148. /***********************************************************/
  149. /////////////////////////////////////////////////////////////////////
  150. //功    能:选定卡片
  151. //参数说明: pSnr[IN]:卡片序列号,4字节
  152. //返    回: 成功返回MI_OK
  153. /////////////////////////////////////////////////////////////////////
  154. char PcdSelect(unsigned char *pSnr)
  155. {
  156.     char status;
  157.     unsigned char i;
  158.     unsigned int  unLen;
  159.     unsigned char ucComMF522Buf[MAXRLEN];
  160.    
  161.     ucComMF522Buf[0] = PICC_ANTICOLL1;
  162.     ucComMF522Buf[1] = 0x70;
  163.     ucComMF522Buf[6] = 0;
  164.     for (i=0; i<4; i++)
  165.     {
  166.             ucComMF522Buf[i+2] = *(pSnr+i);
  167.             ucComMF522Buf[6]  ^= *(pSnr+i);
  168.     }
  169.     CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);//计算CRC装填至ucComMF522Buf[7]
  170.   
  171.     ClearBitMask(Status2Reg,0x08);//寄存器包含接收器和发送器和数据模式检测器的状态标志

  172.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
  173.    
  174.     if ((status == MI_OK) && (unLen == 0x18))//成功,返回SAK,包括1字节的SAK和2字节的CRC_A
  175.     {   status = MI_OK;  }
  176.     else
  177.     {   status = MI_ERR;    }

  178.     return status;
  179. }
  180. /**************************************************************/
  181. /////////////////////////////////////////////////////////////////////
  182. //功    能:验证卡片密码
  183. //参数说明: auth_mode[IN]: 密码验证模式
  184. //                 0x60 = 验证A密钥
  185. //                 0x61 = 验证B密钥
  186. //          addr[IN]:块地址
  187. //          pKey[IN]:密码
  188. //          pSnr[IN]:卡片序列号,4字节
  189. //返    回: 成功返回MI_OK
  190. /////////////////////////////////////////////////////////////////////               
  191. char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
  192. {
  193.     char status;
  194.     unsigned int  unLen;
  195.     unsigned char i,ucComMF522Buf[MAXRLEN];

  196.     ucComMF522Buf[0] = auth_mode;
  197.     ucComMF522Buf[1] = addr;
  198.     for (i=0; i<6; i++)
  199.     {    ucComMF522Buf[i+2] = *(pKey+i);   }
  200.     for (i=0; i<6; i++)
  201.     {    ucComMF522Buf[i+8] = *(pSnr+i);   }
  202. //   memcpy(&ucComMF522Buf[2], pKey, 6);
  203. //   memcpy(&ucComMF522Buf[8], pSnr, 4);
  204.    
  205.     status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
  206.     if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
  207.     {   status = MI_ERR;   }
  208.    
  209.     return status;
  210. }
  211. /****************************************************************/
  212. /////////////////////////////////////////////////////////////////////
  213. //功    能:读取M1卡一块数据
  214. //参数说明: addr[IN]:块地址
  215. //          pData[OUT]:读出的数据,16字节
  216. //返    回: 成功返回MI_OK
  217. /////////////////////////////////////////////////////////////////////
  218. char PcdRead(unsigned char addr,unsigned char *pData)
  219. {
  220.     char status;
  221.     unsigned int  unLen;
  222.     unsigned char i,ucComMF522Buf[MAXRLEN];

  223.     ucComMF522Buf[0] = PICC_READ;
  224.     ucComMF522Buf[1] = addr;
  225.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  226.    
  227.     status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
  228.     if ((status == MI_OK) && (unLen == 0x90))
  229. //   {   memcpy(pData, ucComMF522Buf, 16);   }
  230.     {
  231.         for (i=0; i<16; i++)
  232.         {    *(pData+i) = ucComMF522Buf[i];  _nop_();}
  233.     }
  234.     else
  235.     {   status = MI_ERR;   _nop_();}
  236.    
  237.     return status;
  238. }
  239. /********************************************************************/
  240. /////////////////////////////////////////////////////////////////////
  241. //功    能:写数据到M1卡一块
  242. //参数说明: addr[IN]:块地址
  243. //          pData[IN]:写入的数据,16字节
  244. //返    回: 成功返回MI_OK
  245. /////////////////////////////////////////////////////////////////////                  
  246. char PcdWrite(unsigned char addr,unsigned char *pData)
  247. {
  248.     char status;
  249.     unsigned int  unLen;
  250.     unsigned char i,ucComMF522Buf[MAXRLEN];
  251.    
  252.     ucComMF522Buf[0] = PICC_WRITE;                                          //写块
  253.     ucComMF522Buf[1] = addr;                                                  //写地址
  254.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);           

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

  256.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  257.     {   status = MI_ERR;   _nop_();}
  258.         
  259.     if (status == MI_OK)
  260.     {
  261.         //memcpy(ucComMF522Buf, pData, 16);
  262.         for (i=0; i<16; i++)
  263.         {    ucComMF522Buf[i] = *(pData+i);   _nop_();}
  264.         CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);

  265.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
  266.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  267.         {   status = MI_ERR;  _nop_(); }
  268.     }
  269.    
  270.     return status;
  271. }
  272. /*******************************************************************
  273. /////////////////////////////////////////////////////////////////////
  274. //写数据到卡上的一块
  275. //input:adde=要写的绝对块号
  276. //      writedata=写入数据
  277. /////////////////////////////////////////////////////////////////////
  278. //char PcdWrite(unsigned char addr,unsigned char *pWritedata)
  279. char PcdWrite(unsigned char addr,unsigned char *pData)
  280. {
  281.     char status;
  282.     struct TranSciveBuffer MfComData;
  283.     struct TranSciveBuffer *pi;
  284.     pi = &MfComData;
  285.    
  286.     PcdSetTmo(5);
  287.     WriteRawRC(RegChannelRedundancy,0x07);
  288.     MfComData.MfCommand = PCD_TRANSCEIVE;
  289.     MfComData.MfLength  = 2;
  290.     MfComData.MfData[0] = PICC_WRITE;
  291.     MfComData.MfData[1] = addr;

  292.     status = PcdComTransceive(pi);
  293.     if (status != MI_NOTAGERR)
  294.     {
  295.         if(MfComData.MfLength != 4)
  296.         {   status=MI_BITCOUNTERR;   }
  297.         else
  298.         {
  299.            MfComData.MfData[0] &= 0x0F;
  300.            switch (MfComData.MfData[0])
  301.            {
  302.               case 0x00:
  303.                  status = MI_NOTAUTHERR;
  304.                  break;
  305.               case 0x0A:
  306.                  status = MI_OK;
  307.                  break;
  308.               default:
  309.                  status = MI_CODEERR;
  310.                  break;
  311.            }
  312.         }
  313.     }
  314.     if (status == MI_OK)
  315.     {
  316.         PcdSetTmo(5);
  317.         MfComData.MfCommand = PCD_TRANSCEIVE;
  318.         MfComData.MfLength  = 16;
  319.         memcpy(&MfComData.MfData[0], pData,16);//pWritedata, 16);
  320.         
  321.         status = PcdComTransceive(pi);
  322.         if (status != MI_NOTAGERR)
  323.         {
  324.             MfComData.MfData[0] &= 0x0F;
  325.             switch(MfComData.MfData[0])
  326.             {
  327.                case 0x00:
  328.                   status = MI_WRITEERR;
  329.                   break;
  330.                case 0x0A:
  331.                   status = MI_OK;
  332.                   break;
  333.                default:
  334.                   status = MI_CODEERR;
  335.                   break;
  336.            }
  337.         }
  338.         PcdSetTmo(4);
  339.     }
  340.     return status;
  341. }
  342. /**********************************************/
  343. /////////////////////////////////////////////////////////////////////
  344. //功    能:命令卡片进入休眠状态
  345. //返    回: 成功返回MI_OK
  346. /////////////////////////////////////////////////////////////////////
  347. char PcdHalt(void)
  348. {
  349.     char status;
  350.     unsigned int  unLen;
  351.     unsigned char ucComMF522Buf[MAXRLEN];

  352.     ucComMF522Buf[0] = PICC_HALT;
  353.     ucComMF522Buf[1] = 0;
  354.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

  356.     return MI_OK;
  357. }
  358. /****************************************************************/
  359. /////////////////////////////////////////////////////////////////////
  360. //用MF522计算CRC16函数
  361. /////////////////////////////////////////////////////////////////////
  362. void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
  363. {
  364.     unsigned char i,n;
  365.     ClearBitMask(DivIrqReg,0x04);
  366.     WriteRawRC(CommandReg,PCD_IDLE);
  367.     SetBitMask(FIFOLevelReg,0x80);
  368.     for (i=0; i<len; i++)
  369.     {   WriteRawRC(FIFODataReg, *(pIndata+i));   }
  370.     WriteRawRC(CommandReg, PCD_CALCCRC);
  371.     i = 0xFF;
  372.     do
  373.     {
  374.         n = ReadRawRC(DivIrqReg);
  375.         i--;
  376.     }
  377.     while ((i!=0) && !(n&0x04));
  378.     pOutData[0] = ReadRawRC(CRCResultRegL);
  379.     pOutData[1] = ReadRawRC(CRCResultRegM);
  380. }
  381. /****************************************************************/
  382. /////////////////////////////////////////////////////////////////////
  383. //功    能:复位RC522
  384. //返    回: 成功返回MI_OK
  385. /////////////////////////////////////////////////////////////////////
  386. char PcdReset(void)
  387. {
  388.     MF522_RST=1;
  389.     _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();  nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();
  390.     MF522_RST=0;
  391.     _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();  nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();
  392.     MF522_RST=1;
  393.      _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();          nop_();_nop_();_nop_();_nop_();_nop_();  _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();
  394.     WriteRawRC(CommandReg,PCD_RESETPHASE);
  395.     _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();
  396.    
  397.     WriteRawRC(ModeReg,0x3D);            //和Mifare卡通讯,CRC初始值0x6363
  398.     WriteRawRC(TReloadRegL,30);           
  399.     WriteRawRC(TReloadRegH,0);
  400.     WriteRawRC(TModeReg,0x8D);
  401.     WriteRawRC(TPrescalerReg,0x3E);
  402.     WriteRawRC(TxAutoReg,0x40);     
  403.     return MI_OK;
  404. }
  405. /****************************************************************/
  406. //////////////////////////////////////////////////////////////////////
  407. //设置RC632的工作方式
  408. //////////////////////////////////////////////////////////////////////
  409. char M500PcdConfigISOType(unsigned char type)
  410. {
  411.    if (type == 'A')                     //ISO14443_A
  412.    {
  413.        ClearBitMask(Status2Reg,0x08);


  414.        WriteRawRC(ModeReg,0x3D);//3F

  415.        WriteRawRC(RxSelReg,0x86);//84
  416. //      WriteRawRC(RxThresholdReg,0x84);//as default
  417. //      WriteRawRC(DemodReg,0x4D);      //as default

  418. //      WriteRawRC(ModWidthReg,0x13);//26
  419.        WriteRawRC(RFCfgReg,0x7F);   //4F

  420.               WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
  421.            WriteRawRC(TReloadRegH,0);
  422.        WriteRawRC(TModeReg,0x8D);
  423.            WriteRawRC(TPrescalerReg,0x3E);
  424.            

  425.   //     PcdSetTmo(106);
  426.                             delay_10ms(2);
  427.        PcdAntennaOn();
  428.    }
  429.    else{ return -1; }
  430.    
  431.    return MI_OK;
  432. }
  433. /****************************************************************/
  434. /////////////////////////////////////////////////////////////////////
  435. //功    能:读RC632寄存器
  436. //参数说明:Address[IN]:寄存器地址
  437. //返    回:读出的值
  438. /////////////////////////////////////////////////////////////////////
  439. unsigned char ReadRawRC(unsigned char Address)
  440. {
  441.      unsigned char i, ucAddr;
  442.      unsigned char ucResult=0;

  443.      MF522_SCK = 0;
  444.      MF522_NSS = 0;
  445.      ucAddr = ((Address<<1)&0x7E)|0x80;

  446.      for(i=8;i>0;i--)
  447.      {
  448.          MF522_SCK = 0;
  449.                   if(ucAddr&0x80)
  450.                  {
  451.                  MF522_MOSI = 1;         _nop_();_nop_();_nop_();_nop_();
  452.                 }
  453.                  else
  454.                  {
  455.                          MF522_MOSI = 0;         _nop_();_nop_();_nop_();_nop_();
  456.                 }
  457.          MF522_SCK = 1;          _nop_();_nop_();_nop_();_nop_();
  458.          ucAddr <<= 1;          _nop_();_nop_();_nop_();_nop_();
  459.      }

  460.      for(i=8;i>0;i--)
  461.      {
  462.          MF522_SCK = 0;
  463.          ucResult <<= 1;_nop_();_nop_();_nop_();_nop_();
  464.          MF522_SCK = 1;
  465.                  if(MF522_MISO == 1)
  466.                  ucResult |= 1;
  467.                 _nop_();_nop_();_nop_();_nop_();
  468.      }

  469.      MF522_NSS = 1;
  470.      MF522_SCK = 1;
  471.      return ucResult;
  472. }
  473. /****************************************************************/
  474. /////////////////////////////////////////////////////////////////////
  475. //功    能:写RC632寄存器
  476. //参数说明:Address[IN]:寄存器地址
  477. //          value[IN]:写入的值
  478. /////////////////////////////////////////////////////////////////////
  479. void WriteRawRC(unsigned char Address, unsigned char value)
  480. {  
  481.     unsigned char i, ucAddr;

  482.     MF522_SCK = 0;
  483.     MF522_NSS = 0;
  484.     ucAddr = ((Address<<1)&0x7E);

  485.     for(i=8;i>0;i--)
  486.     {
  487.                 if(ucAddr&0x80)
  488.                 MF522_MOSI = 1;
  489.                 else
  490.                         MF522_MOSI = 0;
  491.                 _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();
  492.         MF522_SCK = 1; _nop_();_nop_();_nop_();_nop_();        _nop_();_nop_();_nop_();_nop_();
  493.         ucAddr <<= 1;
  494.         MF522_SCK = 0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  495.     }

  496.     for(i=8;i>0;i--)
  497.     {
  498.                 if(value&0x80)
  499.                 MF522_MOSI = 1;
  500.                 else
  501.                         MF522_MOSI = 0;
  502.                 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  503.         MF522_SCK = 1; _nop_();_nop_();_nop_();_nop_();        _nop_();_nop_();_nop_();_nop_();
  504.         value <<= 1;
  505.         MF522_SCK = 0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  506.     }
  507.     MF522_NSS = 1;
  508.     MF522_SCK = 1;
  509. }
  510. /****************************************************************/
  511. /////////////////////////////////////////////////////////////////////
  512. //功    能:置RC522寄存器位
  513. //参数说明:reg[IN]:寄存器地址
  514. //          mask[IN]:置位值
  515. /////////////////////////////////////////////////////////////////////
  516. void SetBitMask(unsigned char reg,unsigned char mask)  
  517. {
  518.     char tmp = 0x0;
  519.     tmp = ReadRawRC(reg);
  520.     WriteRawRC(reg,tmp | mask);  // set bit mask
  521. }
  522. /****************************************************************/
  523. /////////////////////////////////////////////////////////////////////
  524. //功    能:清RC522寄存器位
  525. //参数说明:reg[IN]:寄存器地址
  526. //          mask[IN]:清位值
  527. /////////////////////////////////////////////////////////////////////
  528. void ClearBitMask(unsigned char reg,unsigned char mask)  
  529. {
  530.     char tmp = 0x0;
  531.     tmp = ReadRawRC(reg);
  532.     WriteRawRC(reg, tmp & ~mask);  // clear bit mask
  533. }
  534. /****************************************************************/
  535. /////////////////////////////////////////////////////////////////////
  536. //功    能:通过RC522和ISO14443卡通讯
  537. //参数说明:Command[IN]:RC522命令字
  538. //          pInData[IN]:通过RC522发送到卡片的数据
  539. //          InLenByte[IN]:发送数据的字节长度
  540. //          pOutData[OUT]:接收到的卡片返回数据
  541. //          *pOutLenBit[OUT]:返回数据的位长度
  542. /////////////////////////////////////////////////////////////////////
  543. char PcdComMF522(unsigned char Command,
  544.                  unsigned char *pInData,
  545.                  unsigned char InLenByte,
  546.                  unsigned char *pOutData,
  547.                  unsigned int  *pOutLenBit)
  548. {
  549.     char status = MI_ERR;
  550.     unsigned char irqEn   = 0x00;
  551.     unsigned char waitFor = 0x00;
  552.     unsigned char lastBits;
  553.     unsigned char n;
  554.     unsigned int i;
  555.     switch (Command)                                          
  556.     {
  557.        case PCD_AUTHENT:
  558.           irqEn   = 0x12;
  559.           waitFor = 0x10;
  560.           break;
  561.        case PCD_TRANSCEIVE:
  562.           irqEn   = 0x77;
  563.           waitFor = 0x30;
  564.           break;
  565.        default:
  566.          break;
  567.     }
  568.    
  569.     WriteRawRC(ComIEnReg,irqEn|0x80);
  570.     ClearBitMask(ComIrqReg,0x80);
  571.     WriteRawRC(CommandReg,PCD_IDLE);
  572.     SetBitMask(FIFOLevelReg,0x80);
  573.    
  574.     for (i=0; i<InLenByte; i++)
  575.     {   WriteRawRC(FIFODataReg, pInData[i]);    }
  576.     WriteRawRC(CommandReg, Command);
  577.    
  578.    
  579.     if (Command == PCD_TRANSCEIVE)
  580.     {    SetBitMask(BitFramingReg,0x80);  }
  581.    
  582. //    i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
  583. i = 2000;
  584.     do
  585.     {
  586.          n = ReadRawRC(ComIrqReg);
  587.          i--;
  588.     }
  589.     while ((i!=0) && !(n&0x01) && !(n&waitFor));
  590.     ClearBitMask(BitFramingReg,0x80);
  591.               
  592.     if (i!=0)
  593.     {   
  594.          if(!(ReadRawRC(ErrorReg)&0x1B))
  595.          {
  596.              status = MI_OK;
  597.              if (n & irqEn & 0x01)
  598.              {   status = MI_NOTAGERR;   }
  599.              if (Command == PCD_TRANSCEIVE)
  600.              {
  601.                        n = ReadRawRC(FIFOLevelReg);
  602.                       lastBits = ReadRawRC(ControlReg) & 0x07;
  603.                 if (lastBits)
  604.                 {   *pOutLenBit = (n-1)*8 + lastBits;   }
  605.                 else
  606.                 {   *pOutLenBit = n*8;   }
  607.                 if (n == 0)
  608.                 {   n = 1;    }
  609.                 if (n > MAXRLEN)
  610.                 {   n = MAXRLEN;   }
  611.                 for (i=0; i<n; i++)
  612.                 {   pOutData[i] = ReadRawRC(FIFODataReg);    }
  613.             }
  614.          }
  615.          else
  616.          {   status = MI_ERR;   }
  617.         
  618.    }
  619.    

  620.    SetBitMask(ControlReg,0x80);           // stop timer now
  621.    WriteRawRC(CommandReg,PCD_IDLE);
  622.    return status;
  623. }

  624. /****************************************************************/
  625. /////////////////////////////////////////////////////////////////////
  626. //开启天线  
  627. //每次启动或关闭天险发射之间应至少有1ms的间隔
  628. /////////////////////////////////////////////////////////////////////
  629. void PcdAntennaOn()
  630. {
  631.     unsigned char i;
  632.     i = ReadRawRC(TxControlReg);
  633.     if (!(i & 0x03))
  634.     {
  635.         SetBitMask(TxControlReg, 0x03);
  636.     }
  637. }

  638. /****************************************************************/
  639. /////////////////////////////////////////////////////////////////////
  640. //关闭天线
  641. /////////////////////////////////////////////////////////////////////
  642. void PcdAntennaOff()
  643. {
  644.     ClearBitMask(TxControlReg, 0x03);
  645. }
  646. //------------------------------------------------------------------
  647. //等待卡离开
  648. void WaitCardOff(void)
  649. {
  650.         char status, TagType[2];

  651.         while(1)
  652.         {
  653.                 status = PcdRequest(REQ_ALL, TagType);
  654.                 if(status)
  655.                 {
  656.                         status = PcdRequest(REQ_ALL, TagType);
  657.                         if(status)
  658.                         {
  659.                                 status = PcdRequest(REQ_ALL, TagType);
  660.                                 if(status)
  661.                                 {
  662.                                         return;
  663.                                 }
  664.                         }
  665.                 }
  666.                 delay_10ms(1);
  667.         }
  668. }
  669. /****************************************************************/
  670. /////////////////////////////////////////////////////////////////////
  671. //功    能:扣和充
  672. //参数说明: dd_mode[IN]:命令字
  673. //               0xC0 = 扣
  674. //               0xC1 = 充
  675. //          addr[IN]:包地址
  676. //          pValue[IN]:4字节增(减)值,低位在前
  677. //返    回: 成功返回MI_OK
  678. /////////////////////////////////////////////////////////////////////                 
  679. char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
  680. {
  681.     char status;
  682.     unsigned int  unLen;
  683.     unsigned char ucComMF522Buf[MAXRLEN];
  684.    
  685.     ucComMF522Buf[0] = dd_mode;
  686.     ucComMF522Buf[1] = addr;
  687.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

  689.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  690.     {   status = MI_ERR;   }
  691.         
  692.     if (status == MI_OK)
  693.     {
  694.         memcpy(ucComMF522Buf, pValue, 4);
  695. //       for (i=0; i<16; i++)
  696. //       {    ucComMF522Buf[i] = *(pValue+i);   }
  697.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
  698.         unLen = 0;
  699.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  700.         if (status != MI_ERR)
  701.         {    status = MI_OK;    }
  702.     }
  703.    
  704.     if (status == MI_OK)
  705.     {
  706.         ucComMF522Buf[0] = PICC_TRANSFER;
  707.         ucComMF522Buf[1] = addr;
  708.         CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
  709.    
  710.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);

  711.         if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  712.         {   status = MI_ERR;   }
  713.     }
  714.     return status;
  715. }
  716. /****************************************************************/
  717. /////////////////////////////////////////////////////////////////////
  718. //功    能:备份包
  719. //参数说明: sourceaddr[IN]:源地址
  720. //          goaladdr[IN]:目标地址
  721. //返    回: 成功返回MI_OK
  722. /////////////////////////////////////////////////////////////////////
  723. char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
  724. {
  725.     char status;
  726.     unsigned int  unLen;
  727.     unsigned char ucComMF522Buf[MAXRLEN];

  728.     ucComMF522Buf[0] = PICC_RESTORE;
  729.     ucComMF522Buf[1] = sourceaddr;
  730.     CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);

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

  732.     if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
  733.     {   status = MI_ERR;   }
  734.    
  735.     if (status == MI_OK)
  736.     {
  737.         ucComMF522Buf[0] = 0;
  738.         ucComMF522Buf[1] = 0;
  739.         ucComMF522Buf[2] = 0;
  740.         ucComMF522Buf[3] = 0;
  741.         CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);

  742.         status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
  743.         if (status != MI_ERR)
  744.         {    status = MI_OK;    }
  745.     }
  746.    
  747.     if (status != MI_OK)
  748.     {    return MI_ERR;   }
  749.    
  750.     ucComMF522Buf[0] = PICC_TRANSFER;
  751.     ucComMF522Buf[1] = goaladdr;

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

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

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

  756.     return status;
  757. }
  758. /********************************************************/

  759. /********************************************************/
  760. void delay_50us(unsigned char k)                //@22.1184MHz
  761. {
  762.         unsigned char i, j;

  763.         _nop_();
  764.         _nop_();
  765.         i = 2;
  766.         j = 15;
  767.         do
  768.         {
  769.                 do
  770.                 {
  771.                         while (--j);
  772.                 } while (--i);
  773.         }while (--k);
  774. }
  775. /********************************************************/
  776. ///////////////////////////////////////////////////////////////////////
  777. // Delay 10ms
  778. ///////////////////////////////////////////////////////////////////////
  779. void delay_10ms(unsigned int _10ms)
  780. {
  781. #ifndef NO_TIMER2

  782.         unsigned char i, j, k;

  783.         _nop_();
  784.         _nop_();
  785.         i = 1;
  786.         j = 216;
  787.         k = 35;
  788.         do
  789.         {
  790.                 do
  791.                 {
  792.                         do
  793.                         {
  794.                                 while (--k);
  795.                         } while (--j);
  796.                 } while (--i);
  797.         }while (--_10ms);

  798. #else
  799.     while (_10ms--)
  800.     {
  801.             delay_50us(19);
  802.             if (CmdValid)
  803.                 return;
  804.             delay_50us(20);
  805.             if (CmdValid)
  806.                 return;
  807.             delay_50us(20);
  808.             if (CmdValid)
  809.                 return;
  810.             delay_50us(20);
  811.             if (CmdValid)
  812.                 return;
  813.             delay_50us(20);
  814.             if (CmdValid )
  815.                 return;
  816.             delay_50us(20);
  817.             if (CmdValid)
  818.                 return;
  819.             delay_50us(20);
  820.             if (CmdValid)
  821.                 return;
  822.             delay_50us(20);
  823.             if (CmdValid)
  824.                 return;
  825.             delay_50us(20);
  826.             if (CmdValid)
  827.                 return;
  828.             delay_50us(19);
  829.             if (CmdValid)
  830.                 return;
  831.     }
  832. #endif
  833. }
  834. /********************************************************/
复制代码
回复

使用道具 举报

ID:1034262 发表于 2024-7-10 21:59 | 显示全部楼层
HT7xxx系列的LDO十几年来都不敢再用,当年,2006年,用的HT7533,12V一接上,先冲到10V再回到3.3V,烧单片机。
回复

使用道具 举报

ID:401564 发表于 2024-7-10 23:33 | 显示全部楼层
蜂鸣器如果没有加二极管,我认为问题就出在蜂鸣器上
回复

使用道具 举报

ID:466250 发表于 2024-7-11 00:07 | 显示全部楼层
coody_sz 发表于 2024-7-10 21:59
HT7xxx系列的LDO十几年来都不敢再用,当年,2006年,用的HT7533,12V一接上,先冲到10V再回到3.3V,烧单片机 ...

我这里有没有过冲的75与73系列,而且也才0.1x
回复

使用道具 举报

ID:466250 发表于 2024-7-11 00:11 | 显示全部楼层
升到4.2的原因是模块的电流不稳定,使用的73系列在供电时动态响应不够快,就会出现上下冲的问题。
解决方法:
第一种是在3.3V输出端并100uf或以上的电解电容作为动态不足的缓冲
第二种换动态响应足够快的73系列,可提供,可私信。
回复

使用道具 举报

ID:344848 发表于 2024-7-11 02:11 | 显示全部楼层
蓝蓝小星星 发表于 2024-7-11 00:11
升到4.2的原因是模块的电流不稳定,使用的73系列在供电时动态响应不够快,就会出现上下冲的问题。
解决方 ...

明显要销售产品了,
回复

使用道具 举报

ID:466250 发表于 2024-7-11 10:05 | 显示全部楼层
donglw 发表于 2024-7-11 02:11
明显要销售产品了,

能解决问题才是关键
回复

使用道具 举报

ID:879348 发表于 2024-7-11 10:59 | 显示全部楼层
LDO在差的动态响应应该也不会这么离谱,好好检查一下实物高压是从哪里来的
回复

使用道具 举报

ID:1123773 发表于 2024-7-11 13:52 | 显示全部楼层
看俩个测试图,感觉你这也不是测的一个点呢,第二个表显示的时负4.2V时,红表笔测的是排线3脚,这脚是地,你的黑表笔没接第一图的电容上啊,你黑表笔接哪里了?
回复

使用道具 举报

ID:1079614 发表于 2024-7-11 15:28 | 显示全部楼层
土豆我是地瓜 发表于 2024-7-11 13:52
看俩个测试图,感觉你这也不是测的一个点呢,第二个表显示的时负4.2V时,红表笔测的是排线3脚,这脚是地, ...

都接地
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表