找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7906|回复: 3
打印 上一主题 下一主题
收起左侧

rc522 rc523 pn512的底层代码和14443A 和14443B

[复制链接]
跳转到指定楼层
楼主
关于rc522 rc523 pn512的底层代码和14443A 和14443B 只要掌握了这些代码就可以开发对应的M1卡和CPU卡读写程序


单片机源程序如下:
  1. // 文 件 名:    PN512.c
  2. // 文件描述:    PN512底层函数
  3. // 版    本:    V1.00
  4. // 创 建 人:        曾本森
  5. // 创建日期:        2010.01.26
  6. // 说    明:        注意超时变量g_ucPCDTimeOutCnt定义和有关源代码。
  7. //=================================================================================================
  8. //-----------------修改记录------------------------------------------------------------------------

  9. //-------------------------------------------------------------------------------------------------
  10. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  11. #define PN512_GLOBALS
  12. #include <string.h>
  13. #include "PcdInclude.h"
  14. //============= 常量定义 ==========================================================================
  15. #define PCD_FIFO_MAX_SIZE                        64                        // PCD FIFO的最大为64 - 2字节
  16. #define PCD_FIFO_WATER_LEVEL                16                        // PCD FIFO警戒线
  17. //============= 全局变量定义 ======================================================================
  18. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  19. // 函数原型:        void ResetInfo(void)
  20. // 函数功能:        复位命令信息
  21. // 入口参数:        -
  22. // 出口参数:        -
  23. // 返 回 值:        -
  24. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  25. void ResetInfo(void)
  26. {
  27.         INT8U i;
  28.         INT8U *BfrPtr = (INT8U *)(&MInfo);
  29.        
  30.         for(i=0 ; i<sizeof(MfCmdInfo); i++)
  31.                 BfrPtr[i] = 0;
  32. }
  33. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  34. // 函数原型:    void WriteReg(INT8U ucReg,INT8U ucValue)
  35. // 函数功能:    写寄存器
  36. // 入口参数:    INT8U Reg               // 寄存器地址
  37. //              INT8U Value             // 写入的数据
  38. // 出口参数:    -
  39. // 返 回 值:    -
  40. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  41. #if PCD_WRITE_REG_EN
  42. void WriteReg(INT8U ucReg,INT8U  ucValue)
  43. {
  44.         if(ucReg == JREG_TXCONTROL)
  45.         {
  46.                 g_ucTxConMask = ucValue & 0x03;
  47.         }
  48.         RcSetReg(ucReg, ucValue);
  49. }
  50. #endif                                // PCD_WRITE_REG_EN
  51. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  52. // 函数原型:    INT8U ReadReg(INT8U ucReg)
  53. // 函数功能:    写寄存器
  54. // 入口参数:    INT8U ucReg                                // 寄存器地址
  55. // 出口参数:    -
  56. // 返 回 值:    读出的数据
  57. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. #if PCD_READ_REG_EN
  59. INT8U ReadReg(INT8U ucReg)
  60. {
  61.         return RcGetReg(ucReg);
  62. }
  63. #endif                                // PCD_READ_REG_EN
  64. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  65. // 函数原型:   void PcdHardRst(void)
  66. // 函数功能:   PCD硬件复位
  67. // 入口参数:   -
  68. // 出口参数:   -
  69. // 返 回 值:   -
  70. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  71. void PcdHardRst(void)
  72. {
  73.         INTU i;

  74.         PcdClrTPD();
  75.         for(i = 0; i < 75; i++);                                        // 低电平脉冲宽度大于100ns即可
  76.         PcdSetTPD();
  77.         for(i = 0;i < 2500; i++);                                        // 等待晶振稳定,根据晶振起振情况调整此延时时间
  78. }
  79. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  80. // 函数原型:        void PcdClose(void)
  81. // 函数功能:        关闭PCD
  82. // 入口参数:        -
  83. // 出口参数:        -
  84. // 返 回 值:        -
  85. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  86. #if        PCD_CLOSE_EN
  87. void PcdClose()
  88. {
  89. #if        HARDWARE_MODE
  90.         PcdClrTPD();
  91. #else
  92.         RcSetReg(JREG_COMMAND, JCMD_SOFTRESET);                // 软件复位
  93. #endif                                // HARDWARE_MODE
  94. }
  95. #endif                                // PCD_CLOSE_EN
  96. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  97. // 函数原型:        void SetTimeOut(INT32U _302us)
  98. // 函数功能:        设置定时器超时。
  99. // 入口参数:        INT32U _302us                        ; 超时时间 = (_302us) * 302 (us)
  100. // 出口参数:        -
  101. // 返 回 值:        -
  102. // 说    明:        在PcdConfig()中已将预分频器设置为每302us输出一计数脉冲。
  103. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  104. void SetTimeOut(INT32U _302us)
  105. {
  106.     RcSetReg(JREG_TRELOADLO, ((INT8U)(_302us & 0xff)));
  107.     RcSetReg(JREG_TRELOADHI, ((INT8U)((_302us >> 8) & 0xff)));
  108. }
  109. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  110. // 函数原型:        void PcdISOType(INT8U ucType)
  111. // 函数功能:        修改PCD的模式
  112. // 入口参数:        INT8U ucType                                        // ISO14443_TYPEA,
  113. //                                                                                                // ISO14443_TYPEB
  114. //                                                                                                // ISO18092_NFCIP
  115. // 出口参数:        -
  116. // 返 回 值:        -
  117. // 说    明:        默认模式为TYPEA
  118. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  119. void PcdISOType(INT8U ucType)
  120. {
  121. #if PCD_MODE == PN512
  122. // 使用PN512
  123.         if(ucType == ISO18092_NFCIP)
  124.         {
  125.                 RcSetReg(JREG_CONTROL, 0x10);
  126.                 RcSetReg(JREG_TXMODE, 0x92);
  127.                 RcSetReg(JREG_RXMODE, 0x96);
  128.                 //RcSetReg(JREG_TXCONTROL, 0x80);
  129.                 RcSetReg(JREG_TXASK, 0x37);       
  130.                 RcSetReg(JREG_RXTHRESHOLD, 0x55);
  131.                 RcSetReg(JREG_DEMOD, 0x41);
  132. //                RcSetReg(JREG_MIFNFC, 0x62);
  133. //                RcSetReg(JREG_TXBITPHASE, (RcGetReg(JREG_TXASK) & 0x80) | 0x0f);
  134.                 RcSetReg(JREG_RFCFG, 0x59);               
  135.                 RcSetReg(JREG_GSN, 0xFF);
  136.                 RcSetReg(JREG_CWGSP, 0x3F);       
  137.                 RcSetReg(JREG_MODGSP, 0x0F);
  138.         }
  139.         else if (ucType == ISO14443_TYPEB)
  140.         {
  141.                 RcSetReg(JREG_TXASK, 0x00);               
  142.                 RcSetReg(JREG_CONTROL, 0x10);               
  143.                 RcSetReg(JREG_TXMODE, 0x03);
  144.                 RcSetReg(JREG_RXMODE, 0x0B);
  145.                 RcSetReg(JREG_TYPEB, 0x03);               
  146.                                                                                                
  147.                 RcSetReg(JREG_DEMOD, 0x4D);
  148.                 RcSetReg(JREG_GSN, 0xFF);
  149.                 RcSetReg(JREG_CWGSP, 0x3F);               
  150.                 //                RcSetReg(JREG_MODGSP, 0x1b);
  151.                 RcSetReg(JREG_MODGSP, 0x18);       
  152.                 RcSetReg(JREG_RXTHRESHOLD, 0x55);       
  153.                 RcSetReg(JREG_RFCFG, 0x68);               
  154.         }
  155.         else
  156.         {
  157.                 RcSetReg(JREG_TXASK, 0x40);        
  158.                 RcSetReg(JREG_CONTROL, 0x10);       
  159.                 RcSetReg(JREG_TXMODE, 0x00);       
  160.                 RcSetReg(JREG_RXMODE, 0x08);       

  161.                 RcSetReg(JREG_DEMOD, 0x4D);
  162.                 RcSetReg(JREG_CWGSP, 0x3F);                       
  163.                 RcSetReg(JREG_RXTHRESHOLD, 0x84);       
  164.                 RcSetReg(JREG_RFCFG, 0x48);                       
  165.    }
  166. #elif PCD_MODE == RC523
  167. // 使用RC523
  168.    if(ucType == ISO14443_TYPEB)
  169.    {
  170.              RcSetReg(JREG_TXASK, 0x00);               
  171.                 RcSetReg(JREG_CONTROL, 0x10);               
  172.              RcSetReg(JREG_TXMODE, 0x03);               
  173.                 RcSetReg(JREG_RXMODE, 0x0B);       
  174.                 RcSetReg(JREG_TYPEB, 0x03);                       
  175.                                                                                                                
  176.                 RcSetReg(JREG_DEMOD, 0x4d);
  177.                 RcSetReg(JREG_GSN, 0xff);
  178.                 RcSetReg(JREG_CWGSP, 0x3f);                       
  179. //                RcSetReg(JREG_MODGSP, 0x1b);       
  180.                 RcSetReg(JREG_MODGSP, 0x18);               
  181.                 RcSetReg(JREG_RXTHRESHOLD, 0x55);       
  182.                 RcSetReg(JREG_RFCFG, 0x68);                       
  183.         }
  184.         else
  185.         {
  186.                 RcSetReg(JREG_TXASK, 0x40);                
  187.                 RcSetReg(JREG_CONTROL, 0x10);               
  188.                 RcSetReg(JREG_TXMODE, 0x00);               
  189.                 RcSetReg(JREG_RXMODE, 0x08);               

  190.                 RcSetReg(JREG_DEMOD, 0x4D);
  191.                 RcSetReg(JREG_CWGSP, 0x3F);                       
  192.                 RcSetReg(JREG_RXTHRESHOLD, 0x84);       
  193.                 RcSetReg(JREG_RFCFG, 0x48);                       
  194.    }
  195. #else
  196. // 使用RC522
  197.         ucType = ucType;
  198.         RcSetReg(JREG_TXASK, 0x40);        
  199.         RcSetReg(JREG_CONTROL, 0x10);       
  200.         RcSetReg(JREG_TXMODE, 0x00);               
  201.         RcSetReg(JREG_RXMODE, 0x08);               

  202.         RcSetReg(JREG_DEMOD, 0x4D);
  203.         RcSetReg(JREG_CWGSP, 0x3F);                       
  204.         RcSetReg(JREG_RXTHRESHOLD, 0x84);               
  205.         RcSetReg(JREG_RFCFG, 0x48);                       
  206. #endif
  207. }
  208. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  209. // 函数原型:        INT8U PcdConfig(INT8U ucType)
  210. // 函数功能:        配置芯片
  211. // 入口参数:        INT8U ucType                                        // TYPEA -- ISO14443A,TYPEB -- ISO14443B
  212. // 出口参数:        -
  213. // 返 回 值:        STATUS_SUCCESS -- 操作成功,其他值 -- 操作失败
  214. // 说    明:        -
  215. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  216. INT8U PcdConfig(INT8U ucType)
  217. {
  218.         INT8U ucRegVal;

  219. #if        HARDWARE_MODE
  220.         PcdHardRst();                                                                // 硬件复位
  221. #else
  222.         RcSetReg(JREG_COMMAND, JCMD_SOFTRESET);                // 复位芯片
  223. #endif                                // HARDWARE_MODE
  224.        
  225.         PcdISOType(ucType);
  226.        
  227.         RcSetReg(JREG_GSN, 0xF0 | 0x04);       
  228.         ucRegVal = RcGetReg(JREG_GSN);
  229.         if(ucRegVal != 0xF4)                       
  230.                 return STATUS_INIT_ERROR;



  231.         RcSetReg(JREG_TPRESCALER, FREQ_SPLI_302us & 0xff);
  232.         RcSetReg(JREG_TMODE, JBIT_TAUTO | ((FREQ_SPLI_302us >> 8) & JMASK_TPRESCALER_HI));                                               

  233.         SetTimeOut(RIC_DELAY5MS);                       
  234.        

  235.     RcModifyReg(JREG_TXCONTROL, 1, JBIT_TX2RFEN | JBIT_TX1RFEN);

  236.     RcModifyReg(JREG_CONTROL, 1, JBIT_TSTARTNOW);

  237.     do {
  238.         ucRegVal = RcGetReg(JREG_COMMIRQ);
  239.     }while(!(ucRegVal & JBIT_TIMERI));

  240.     RcSetReg(JREG_COMMIRQ, JBIT_TIMERI);       
  241.         RcSetReg(JREG_COMMAND, JCMD_IDLE);
  242.         RcSetReg(JREG_ANALOGTEST, 0xCD);
  243.        
  244.         RcSetReg(JREG_TXSEL, 0x17);
  245.        
  246. #if PCD_IRQ_EN
  247.         RcSetReg(JREG_WATERLEVEL, PCD_FIFO_WATER_LEVEL);       
  248. #endif                                // INIT_MODE_EN

  249.         g_ucTxConMask = 0x03;

  250.         return STATUS_SUCCESS;
  251. }
  252. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  253. // 函数原型:        void PCDISR (void)
  254. // 函数功能:        Pcd中断服务程序
  255. // 入口参数:        -
  256. // 出口参数:        -
  257. // 返 回 值:        -
  258. // 说    明:        -
  259. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  260. #if PCD_IRQ_EN

  261. #ifdef __C51__
  262. void PCDISR (void) interrupt 0 using 1       
  263. {       
  264.         IE0 = 0;                                                        
  265. #else
  266. void PCDISR (void)
  267. {
  268. #endif                        // __C51__
  269.        
  270.         MInfo.Irq = (INT8U)(RcGetReg(JREG_COMMIRQ) & MInfo.CommIrqEn);
  271. //        MInfo.Irq  = RcGetReg(JREG_COMMIRQ);       
  272. //        MInfo.Irq &= MInfo.CommIrqEn;
  273.         if (MInfo.Irq & JBIT_LOALERTI)       
  274.         {// FIFO空中断
  275.                 MInfo.nBytes = MInfo.nBytesToSend - MInfo.nBytesSent;
  276.                 if (MInfo.nBytes < PCD_FIFO_MAX_SIZE - 2 * PCD_FIFO_WATER_LEVEL)
  277.                 {
  278.                         if(MInfo.nBytes)                       
  279.                         {
  280.                                 WriteFIFO(MInfo.pExBuf + MInfo.nBytesSent, MInfo.nBytes);
  281.                                 MInfo.nBytesSent += MInfo.nBytes;
  282.                         }
  283.                         if (MInfo.DoRcv)                       
  284.                                 MInfo.CommIrqEn |= JBIT_RXI | JBIT_HIALERTI;
  285.                         MInfo.CommIrqEn &= ~JBIT_LOALERTI;       
  286.                         RcSetReg(JREG_COMMIEN, (INT8U)(JBIT_IRQINV | MInfo.CommIrqEn));               
  287.                         RcSetReg(JREG_COMMIRQ, JBIT_LOALERTI);                                                                       

  288.                 }
  289.                 else
  290.                 {
  291.                         WriteFIFO(MInfo.pExBuf + MInfo.nBytesSent, PCD_FIFO_MAX_SIZE - 2 * PCD_FIFO_WATER_LEVEL);
  292.                         RcSetReg(JREG_COMMIRQ, JBIT_LOALERTI);               
  293.                         MInfo.nBytesSent += PCD_FIFO_MAX_SIZE - 2 * PCD_FIFO_WATER_LEVEL;
  294.                 }
  295.         }
  296.         if (MInfo.Irq & JBIT_TXI)
  297.         {
  298.                 MInfo.CommIrqEn &= ~(JBIT_TXI | JBIT_LOALERTI);       
  299.                 if (MInfo.DoRcv)                                                               
  300.                         MInfo.CommIrqEn |= JBIT_RXI | JBIT_HIALERTI;
  301.                 RcSetReg(JREG_COMMIEN, (INT8U)(JBIT_IRQINV | MInfo.CommIrqEn));       
  302.                 RcSetReg(JREG_COMMIRQ, JBIT_TXI | JBIT_LOALERTI);       
  303.                
  304.         }

  305.         if (MInfo.Irq & (JBIT_HIALERTI | JBIT_IDLEI |JBIT_RXI))       
  306.         {
  307.                 if(MInfo.DoRcv)
  308.                 {
  309.                         MInfo.nBitsReceived =  RcGetReg(JREG_FIFOLEVEL);
  310.                         ReadFIFO(MInfo.pExBuf + MInfo.nBytesReceived, MInfo.nBitsReceived);
  311.                         MInfo.nBytesReceived += MInfo.nBitsReceived;
  312.                         MInfo.nBitsReceived = (INT8U)(RcGetReg(JREG_CONTROL) & 0x07);
  313.             if(MInfo.nBitsReceived && MInfo.nBytesReceived)       
  314.                 MInfo.nBytesReceived --;
  315.                         RcSetReg(JREG_COMMIRQ, JBIT_HIALERTI | JBIT_RXI | JBIT_IDLEI);
  316.                 }
  317.         }

  318.         if (MInfo.Irq & JBIT_IDLEI)
  319.         {
  320.                 RcModifyReg(JREG_COMMIEN, 0, JBIT_TIMERI| JBIT_IDLEI);
  321.                 RcSetReg(JREG_COMMIRQ, JBIT_TIMERI | JBIT_IDLEI);       
  322.         }
  323.        
  324.         if (MInfo.Irq & JBIT_TIMERI)
  325.         {
  326.                 RcModifyReg(JREG_COMMIEN, 0, JBIT_TIMERI);
  327.                 RcSetReg(JREG_COMMIRQ, JBIT_TIMERI);
  328.                 MInfo.Status = STATUS_IO_TIMEOUT;
  329.         }
  330.        
  331.         if (MInfo.Irq & JBIT_ERRI)
  332.         {
  333.                 MInfo.nBytes = RcGetReg(JREG_ERROR);
  334.                 if(MInfo.nBytes)                               
  335.                 {
  336.                         if(MInfo.nBytes & JBIT_COLLERR)
  337.                                 MInfo.Status = STATUS_COLLISION_ERROR;
  338.                         else if(MInfo.nBytes & JBIT_PARITYERR)
  339.                                 MInfo.Status = STATUS_PARITY_ERROR;

  340.                         if(MInfo.nBytes & JBIT_PROTERR)
  341.                                 MInfo.Status = STATUS_PROTOCOL_ERROR;
  342.                         else if(MInfo.nBytes & JBIT_BUFFEROVFL)
  343.                                 MInfo.Status = STATUS_BUFFER_OVERFLOW;
  344.                         else if(MInfo.nBytes & JBIT_CRCERR)
  345.                         {                                                                          
  346.                                 if(MInfo.nBytesReceived == 0x01 &&
  347.                                         (MInfo.nBitsReceived == 0x04 ||
  348.                                          MInfo.nBitsReceived == 0x00))
  349.                                 {  
  350.                                         MInfo.pExBuf[0] = RcGetReg(JREG_FIFODATA);
  351.                                         MInfo.nBytesReceived = 1;
  352.                                         MInfo.Status = STATUS_ACK_SUPPOSED;
  353.                                 }
  354.                                 else
  355.                                         MInfo.Status = STATUS_CRC_ERROR;
  356.                         }
  357.                         else if(MInfo.nBytes & JBIT_TEMPERR)
  358.                                 MInfo.Status = STATUS_TEMP_ERROR;   

  359.                         if(MInfo.nBytes & JBIT_WRERR)
  360.                                 MInfo.Status = STATUS_FIFO_WRITE_ERROR;
  361.                         if(MInfo.Status == STATUS_SUCCESS)
  362.                                 MInfo.Status = STATUS_ERROR_NY_IMPLEMENTED;
  363.                                
  364.                 }

  365.                 RcSetReg(JREG_ERROR, 0);
  366.                 RcSetReg(JREG_COMMIRQ, JBIT_ERRI);               
  367.         }
  368.         MInfo.AllCommIrq |= MInfo.Irq;                       

  369.         MInfo.Irq  = (INT8U)(RcGetReg(JREG_DIVIRQ) & MInfo.DivIrqEn);
  370.         if (MInfo.Irq)
  371.         {
  372.                 if (MInfo.Irq & JBIT_SIGINACTI)
  373.                 {
  374.                         RcSetReg(JREG_DIVIRQ, JBIT_SIGINACTI);       
  375.                 }

  376.                 if (MInfo.Irq & JBIT_MODE)
  377.                 {
  378.                         RcSetReg(JREG_DIVIRQ, JBIT_MODE);       
  379.                 }

  380.                 if (MInfo.Irq & JBIT_CRCI)
  381.                 {
  382.                         RcSetReg(JREG_DIVIRQ, JBIT_CRCI);
  383.                 }

  384.                 if (MInfo.Irq & JBIT_RFON)
  385.                 {
  386.                         RcSetReg(JREG_DIVIRQ, JBIT_RFON);
  387.                 }

  388.                 if (MInfo.Irq & JBIT_RFOFF)
  389.                 {       
  390.                         RcSetReg(JREG_DIVIRQ, JBIT_RFOFF);       
  391.                 }
  392.                 MInfo.AllDivIrq |= MInfo.Irq;       
  393.         }       
  394. }
  395. #endif                                // PCD_IRQ_EN
  396. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  397. // 函数原型:        INT8U  PcdCmd(INT8U ucCmd,INT16U nCmdLen,INT8U *pExchangeBuf)
  398. // 函数功能:        Pcd将数据发送到卡,然后等待接收从卡返回的数据。
  399. // 入口参数:        INT8U ucCmd                                                // 命令
  400. //                                INT16U nCmdLen                                        // 命令长度
  401. //                                INT8U *pExchangeBuf                                // 发送数据缓冲区首址。
  402. // 出口参数:        INT8U *pExchangeBuf                                // 接收数据缓冲区首址。
  403. // 返 回 值:        STATUS_SUCCESS -- 操作成功,其他值 -- 操作失败
  404. // 说    明:        -
  405. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  406. #if        PCD_IRQ_EN
  407. // 使用中断模式
  408. INT8U  PcdCmd(INT8U ucCmd,INT16U nCmdLen,INT8U *pExchangeBuf)
  409. {
  410.         INT8U  ucRegVal;
  411.        
  412.         MInfo.Status = STATUS_SUCCESS;
  413.         MInfo.Cmd = ucCmd;
  414.         MInfo.pExBuf = pExchangeBuf;
  415.         MInfo.nBytesToSend = nCmdLen;
  416. //        MInfo.nBytesSent = 0;
  417.                
  418. //        RcSetReg(JREG_COMMIEN, 0x00);       
  419. //    RcSetReg(JREG_DIVIEN, 0x00);
  420.     RcSetReg(JREG_COMMIRQ, 0x7F);       
  421.     RcSetReg(JREG_DIVIRQ, 0x7F);
  422.     RcSetReg(JREG_FIFOLEVEL, JBIT_FLUSHBUFFER);

  423.     ucRegVal = RcGetReg(JREG_COMMAND);   
  424.     if(MInfo.Cmd == JCMD_TRANSCEIVE)
  425.     {                                                                               
  426.         RcSetReg(JREG_COMMAND, (INT8U)((ucRegVal & ~JMASK_COMMAND) | JCMD_TRANSCEIVE));
  427.     }
  428.     else
  429.     {                                                                       
  430.         RcSetReg(JREG_COMMAND, (INT8U)(ucRegVal & ~JMASK_COMMAND));
  431.     }
  432.     switch(MInfo.Cmd)
  433.     {
  434.                case JCMD_IDLE:
  435.                         MInfo.WaitForComm = 0;
  436.             MInfo.WaitForDiv  = 0;
  437.             break;
  438. #ifndef RC522
  439.                 case JCMD_MEM:
  440.                         MInfo.CommIrqEn = JBIT_IDLEI;
  441.             MInfo.WaitForComm = JBIT_IDLEI;
  442.             break;
  443. #endif
  444.         case JCMD_CALCCRC:
  445.             MInfo.WaitForComm = 0;
  446.             MInfo.WaitForDiv  = 0;
  447.             break;
  448.         case JCMD_TRANSMIT:
  449.             MInfo.CommIrqEn   = JBIT_TXI | JBIT_TIMERI| JBIT_LOALERTI | JBIT_ERRI;
  450.             MInfo.WaitForComm = JBIT_TXI | JBIT_ERRI;
  451.             break;
  452.         case JCMD_RECEIVE:
  453.             MInfo.CommIrqEn   = JBIT_RXI | JBIT_TIMERI | JBIT_HIALERTI |JBIT_ERRI;
  454.             MInfo.WaitForComm = JBIT_RXI | JBIT_TIMERI | JBIT_ERRI;
  455.                         MInfo.DoRcv = 1;
  456.             break;
  457.         case JCMD_TRANSCEIVE:
  458.             MInfo.CommIrqEn   = JBIT_RXI | JBIT_TIMERI | JBIT_LOALERTI | JBIT_ERRI;
  459.             MInfo.WaitForComm = JBIT_RXI | JBIT_TIMERI | JBIT_ERRI;
  460.                         MInfo.DoRcv = 1;
  461.             break;
  462.         case JCMD_AUTHENT:
  463.             MInfo.CommIrqEn   = JBIT_IDLEI | JBIT_TIMERI | JBIT_ERRI;
  464.             MInfo.WaitForComm = JBIT_IDLEI | JBIT_TIMERI | JBIT_ERRI;
  465.             break;
  466.         case JCMD_SOFTRESET:
  467.             MInfo.WaitForComm = 0;
  468.             MInfo.WaitForDiv  = 0;
  469.             break;
  470.         default:
  471.             MInfo.Status = STATUS_UNSUPPORTED_COMMAND;
  472.     }
  473.        
  474.     if(MInfo.Status == STATUS_SUCCESS)
  475.     {

  476.                 OS_ENTER_CRITICAL();               
  477.         RcSetReg(JREG_COMMIEN,         JBIT_IRQINV | MInfo.CommIrqEn);
  478. //     RcSetReg(JREG_DIVIEN,  MInfo.DivIrqEn);       
  479.                 RcSetReg(JREG_DIVIEN,  JBIT_IRQPUSHPULL | MInfo.DivIrqEn);
  480.         OS_EXIT_CRITICAL();                       
  481.         
  482.         if(MInfo.Cmd == JCMD_TRANSCEIVE)
  483.         {                                                       
  484.             RcModifyReg(JREG_BITFRAMING, 1, JBIT_STARTSEND);
  485.         }
  486.         else
  487.             RcSetReg(JREG_COMMAND, (INT8U)((RcGetReg(JREG_COMMAND) & ~JMASK_COMMAND) | MInfo.Cmd));
  488.             
  489.       
  490.         while(!(MInfo.WaitForComm ? (MInfo.WaitForComm & MInfo.AllCommIrq) : 1) ||
  491.               !(MInfo.WaitForDiv  ? (MInfo.WaitForDiv  & MInfo.AllDivIrq ) : 1))
  492.         {      
  493.                          OSSemPend(PcdIntSem,100,&ucRegVal);
  494.                     if(ucRegVal != OS_NO_ERR)
  495.                     {
  496.                                 MInfo.Status = STATUS_ACCESS_TIMEOUT;
  497.                                 break;                      
  498.                     }      
  499.                
  500.         }
  501.     }

  502. //    RcModifyReg(JREG_COMMIEN, 0, MInfo.CommIrqEn);
  503. //    RcModifyReg(JREG_DIVIEN,  0, MInfo.DivIrqEn);
  504.         RcSetReg(JREG_COMMIEN, 0x80);               
  505.     RcSetReg(JREG_DIVIEN, 0x00);

  506.     RcSetReg(JREG_COMMIRQ, 0x7F);
  507.     RcSetReg(JREG_DIVIRQ, 0X7F);
  508.     RcSetReg(JREG_FIFOLEVEL, JBIT_FLUSHBUFFER);

  509.     RcSetReg(JREG_BITFRAMING, 0);
  510.    
  511.    
  512.     return MInfo.Status;
  513. }
  514. #else
  515. // 使用查询模式
  516. INT8U  PcdCmd(INT8U ucCmd,INT16U ucCmdLen,INT8U *pExchangeBuf)
  517. {
  518.     INT8U  ucStatus = STATUS_SUCCESS;
  519.        
  520.     INT8U  CommIrqEn   = 0;
  521.     INT8U  divIrqEn    = 0;
  522.     INT8U  WaitForComm = JBIT_ERRI | JBIT_TXI;
  523.     INT8U  WaitForDiv  = 0;
  524.     INT8U  doReceive   = 0;
  525.     INT8U  getRegVal,setRegVal;
  526.     INT8U  nbytes;
  527.         INT16U nbits;
  528.    
  529.         MInfo.Cmd = ucCmd;
  530.         MInfo.nBytesToSend = (INT8U)(ucCmdLen & 0xFF);       
  531.     RcSetReg(JREG_COMMIRQ, 0x7F);                               
  532.     RcSetReg(JREG_DIVIRQ, 0x7F);
  533.     RcSetReg(JREG_FIFOLEVEL, JBIT_FLUSHBUFFER);

  534.     getRegVal = RcGetReg(JREG_COMMAND);                   
  535.     if(MInfo.Cmd == JCMD_TRANSCEIVE)
  536.     {                                                                                       
  537.         setRegVal = (getRegVal & ~JMASK_COMMAND) | JCMD_TRANSCEIVE;
  538.         RcSetReg(JREG_COMMAND, setRegVal);
  539.     }
  540.     else
  541.     {                                                                                       
  542.         setRegVal = (getRegVal & ~JMASK_COMMAND);
  543.         RcSetReg(JREG_COMMAND, setRegVal);
  544.     }
  545.     switch(MInfo.Cmd)
  546.     {
  547.                case JCMD_IDLE:
  548.                         WaitForComm = 0;
  549.             WaitForDiv  = 0;
  550.             break;
  551. #ifndef RC522
  552.                 case JCMD_MEM:
  553.                         CommIrqEn = JBIT_IDLEI;
  554.             WaitForComm = JBIT_IDLEI;
  555.             break;
  556. #endif
  557.         case JCMD_CALCCRC:
  558.             WaitForComm = 0;
  559.             WaitForDiv  = 0;
  560.             break;
  561.         case JCMD_TRANSMIT:
  562.             CommIrqEn = JBIT_TXI | JBIT_TIMERI;
  563.             WaitForComm = JBIT_TXI;
  564.             break;
  565.         case JCMD_RECEIVE:
  566.             CommIrqEn = JBIT_RXI | JBIT_TIMERI;                //| JBIT_ERRI;
  567.             WaitForComm = JBIT_RXI | JBIT_TIMERI;         //| JBIT_ERRI;
  568.             doReceive = 1;
  569.             break;
  570.         case JCMD_TRANSCEIVE:
  571.             CommIrqEn = JBIT_RXI | JBIT_TIMERI;         //| JBIT_ERRI;
  572.             WaitForComm = JBIT_RXI | JBIT_TIMERI;        //| JBIT_ERRI;
  573.             doReceive = 1;
  574.             break;
  575.         case JCMD_AUTHENT:
  576.             CommIrqEn = JBIT_IDLEI | JBIT_TIMERI;        //| JBIT_ERRI;
  577.             WaitForComm = JBIT_IDLEI | JBIT_TIMERI;        //| JBIT_ERRI;
  578.             break;
  579.         case JCMD_SOFTRESET:
  580.             WaitForComm = 0;
  581.             WaitForDiv  = 0;
  582.             break;
  583.         default:
  584.             ucStatus = STATUS_UNSUPPORTED_COMMAND;
  585.     }
  586.        
  587.     if(ucStatus == STATUS_SUCCESS)
  588.     {                                                                               
  589.         getRegVal = RcGetReg(JREG_COMMIEN);
  590.         RcSetReg(JREG_COMMIEN, (INT8U)(getRegVal | CommIrqEn));

  591.         getRegVal = RcGetReg(JREG_DIVIEN);
  592.         RcSetReg(JREG_DIVIEN, (INT8U)(getRegVal | divIrqEn));

  593.         WriteFIFO(pExchangeBuf,MInfo.nBytesToSend);

  594.         
  595.         if(MInfo.Cmd == JCMD_TRANSCEIVE)               
  596.         {                                                                               
  597.             RcModifyReg(JREG_BITFRAMING, 1, JBIT_STARTSEND);
  598.         }
  599.         else
  600.         {
  601.             getRegVal = RcGetReg(JREG_COMMAND);
  602.             RcSetReg(JREG_COMMAND, (INT8U)((getRegVal & ~JMASK_COMMAND) | MInfo.Cmd));
  603.         }
  604.         getRegVal = 0;                                       
  605.         setRegVal = 0;
  606.         
  607.                 g_ucPCDTmOut = PCD_DELAY555MS;               
  608.         while(!(WaitForComm ? (WaitForComm & setRegVal) : 1) ||
  609.               !(WaitForDiv ? (WaitForDiv & getRegVal) :1))
  610.         {
  611.             setRegVal = RcGetReg(JREG_COMMIRQ);
  612.             getRegVal = RcGetReg(JREG_DIVIRQ);
  613.             if(g_ucPCDTmOut == 0)
  614.                 break;                                               
  615.         }
  616.                 if(g_ucPCDTmOut == 0)
  617.                 {
  618.                         ucStatus = STATUS_ACCESS_TIMEOUT;
  619.                 }
  620.                 else
  621.                 {                                                               
  622.                 WaitForComm = (INT8U)(WaitForComm & setRegVal);
  623.                 WaitForDiv  = (INT8U)(WaitForDiv & getRegVal);
  624.        
  625.                 if (setRegVal & JBIT_TIMERI)          
  626.                 {
  627.                     ucStatus = STATUS_IO_TIMEOUT;
  628.                 }
  629.                 }
  630.     }

  631.     RcModifyReg(JREG_COMMIEN, 0, CommIrqEn);  
  632.     RcModifyReg(JREG_DIVIEN, 0, divIrqEn);

  633.     if(doReceive && (ucStatus == STATUS_SUCCESS))
  634.     {                                                                                
  635.         MInfo.nBytesReceived = RcGetReg(JREG_FIFOLEVEL);
  636.         nbytes = MInfo.nBytesReceived;
  637.         getRegVal = RcGetReg(JREG_CONTROL);
  638.         MInfo.nBitsReceived = (INT8U)(getRegVal & 0x07);
  639.         nbits = MInfo.nBitsReceived;

  640.         getRegVal = RcGetReg(JREG_ERROR);

  641.         if(getRegVal)                               
  642.         {
  643.             if(getRegVal & JBIT_COLLERR)
  644.                 ucStatus = STATUS_COLLISION_ERROR;
  645.             else if(getRegVal & JBIT_PARITYERR)
  646.                 ucStatus = STATUS_PARITY_ERROR;     

  647.             if(getRegVal & JBIT_PROTERR)
  648.                 ucStatus = STATUS_PROTOCOL_ERROR;  
  649.             else if(getRegVal & JBIT_BUFFEROVFL)
  650.                 ucStatus = STATUS_BUFFER_OVERFLOW;  
  651.             else if(getRegVal & JBIT_CRCERR)
  652.             {                                                                  
  653.                 if(MInfo.nBytesReceived == 0x01 &&
  654.                     (MInfo.nBitsReceived == 0x04 ||
  655.                      MInfo.nBitsReceived == 0x00))
  656.                 {  
  657.                     pExchangeBuf[0] = RcGetReg(JREG_FIFODATA);
  658.                     MInfo.nBytesReceived = 1;
  659.                     ucStatus = STATUS_ACK_SUPPOSED;       
  660.                 }
  661.                 else
  662.                     ucStatus = STATUS_CRC_ERROR;   
  663.             }
  664.             else if(getRegVal & JBIT_TEMPERR)
  665.                 ucStatus = STATUS_TEMP_ERROR;  
  666.             if(getRegVal & JBIT_WRERR)
  667.                 ucStatus = STATUS_FIFO_WRITE_ERROR;
  668.             if(ucStatus == STATUS_SUCCESS)
  669.                 ucStatus = STATUS_ERROR_NY_IMPLEMENTED;

  670.             RcSetReg(JREG_ERROR, 0);
  671.         }

  672.         if(ucStatus != STATUS_ACK_SUPPOSED)       
  673.         {
  674.             ReadFIFO(pExchangeBuf,MInfo.nBytesReceived);
  675.             if(MInfo.nBitsReceived && MInfo.nBytesReceived)       
  676.                 MInfo.nBytesReceived --;
  677.         }
  678.     }
  679.     RcSetReg(JREG_COMMIRQ, WaitForComm);
  680.     RcSetReg(JREG_DIVIRQ, WaitForDiv);
  681.     RcSetReg(JREG_FIFOLEVEL, JBIT_FLUSHBUFFER);
  682.     RcSetReg(JREG_COMMIRQ, JBIT_TIMERI);
  683.     RcSetReg(JREG_BITFRAMING, 0);
  684.     return ucStatus;
  685. }
  686. #endif                                // PCD_IRQ_EN
  687. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  688. // 函数原型:        void CardReset(INT8U ucPause_1ms,INT8U ucWait_1ms)
  689. // 函数功能:        使RF场产生1个暂停,让卡复位
  690. // 入口参数:        INT8U ucPause_1ms                ; 暂停时间,关闭RF场该时间后重新打开,
  691. //                                                                                                ; 若为0则不重新打开
  692. //                                INT8U ucWait_1ms                ; RF场重新打开后持续等待该时间,若为0则不等待
  693. // 出口参数:        -
  694. // 返 回 值:        -
  695. // 说    明:        等待时间可根据卡的功耗而定,如Mifare1卡的功耗较小,等待数毫秒即可,
  696. //                                而CPU卡功耗较大,需要等待80毫秒左右。
  697. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  698. #if PCD_CARD_REST_EN
  699. void CardReset(INT8U ucPause_1ms,INT8U ucWait_1ms)
  700. {
  701.         INT8U RegVal;

  702.         // 关闭RF场
  703. ……………………

  704. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
Driver.zip (33.43 KB, 下载次数: 137)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:482193 发表于 2019-8-23 09:07 | 只看该作者
有使用示例吗??
回复

使用道具 举报

板凳
ID:369226 发表于 2020-6-22 13:08 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:888543 发表于 2024-12-20 10:06 | 只看该作者
整合需要,下载试试。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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