久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7868|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

rc522 rc523 pn512的底層代碼和14443A 和14443B

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:244139 發(fā)表于 2018-11-12 17:17 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)于rc522 rc523 pn512的底層代碼和14443A 和14443B 只要掌握了這些代碼就可以開發(fā)對(duì)應(yīng)的M1卡和CPU卡讀寫程序


單片機(jī)源程序如下:
  1. // 文 件 名:    PN512.c
  2. // 文件描述:    PN512底層函數(shù)
  3. // 版    本:    V1.00
  4. // 創(chuàng) 建 人:        曾本森
  5. // 創(chuàng)建日期:        2010.01.26
  6. // 說    明:        注意超時(shí)變量g_ucPCDTimeOutCnt定義和有關(guān)源代碼。
  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字節(jié)
  16. #define PCD_FIFO_WATER_LEVEL                16                        // PCD FIFO警戒線
  17. //============= 全局變量定義 ======================================================================
  18. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  19. // 函數(shù)原型:        void ResetInfo(void)
  20. // 函數(shù)功能:        復(fù)位命令信息
  21. // 入口參數(shù):        -
  22. // 出口參數(shù):        -
  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. // 函數(shù)原型:    void WriteReg(INT8U ucReg,INT8U ucValue)
  35. // 函數(shù)功能:    寫寄存器
  36. // 入口參數(shù):    INT8U Reg               // 寄存器地址
  37. //              INT8U Value             // 寫入的數(shù)據(jù)
  38. // 出口參數(shù):    -
  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. // 函數(shù)原型:    INT8U ReadReg(INT8U ucReg)
  53. // 函數(shù)功能:    寫寄存器
  54. // 入口參數(shù):    INT8U ucReg                                // 寄存器地址
  55. // 出口參數(shù):    -
  56. // 返 回 值:    讀出的數(shù)據(jù)
  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. // 函數(shù)原型:   void PcdHardRst(void)
  66. // 函數(shù)功能:   PCD硬件復(fù)位
  67. // 入口參數(shù):   -
  68. // 出口參數(shù):   -
  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++);                                        // 等待晶振穩(wěn)定,根據(jù)晶振起振情況調(diào)整此延時(shí)時(shí)間
  78. }
  79. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  80. // 函數(shù)原型:        void PcdClose(void)
  81. // 函數(shù)功能:        關(guān)閉PCD
  82. // 入口參數(shù):        -
  83. // 出口參數(shù):        -
  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);                // 軟件復(fù)位
  93. #endif                                // HARDWARE_MODE
  94. }
  95. #endif                                // PCD_CLOSE_EN
  96. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  97. // 函數(shù)原型:        void SetTimeOut(INT32U _302us)
  98. // 函數(shù)功能:        設(shè)置定時(shí)器超時(shí)。
  99. // 入口參數(shù):        INT32U _302us                        ; 超時(shí)時(shí)間 = (_302us) * 302 (us)
  100. // 出口參數(shù):        -
  101. // 返 回 值:        -
  102. // 說    明:        在PcdConfig()中已將預(yù)分頻器設(shè)置為每302us輸出一計(jì)數(shù)脈沖。
  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. // 函數(shù)原型:        void PcdISOType(INT8U ucType)
  111. // 函數(shù)功能:        修改PCD的模式
  112. // 入口參數(shù):        INT8U ucType                                        // ISO14443_TYPEA,
  113. //                                                                                                // ISO14443_TYPEB
  114. //                                                                                                // ISO18092_NFCIP
  115. // 出口參數(shù):        -
  116. // 返 回 值:        -
  117. // 說    明:        默認(rèn)模式為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. // 函數(shù)原型:        INT8U PcdConfig(INT8U ucType)
  210. // 函數(shù)功能:        配置芯片
  211. // 入口參數(shù):        INT8U ucType                                        // TYPEA -- ISO14443A,TYPEB -- ISO14443B
  212. // 出口參數(shù):        -
  213. // 返 回 值:        STATUS_SUCCESS -- 操作成功,其他值 -- 操作失敗
  214. // 說    明:        -
  215. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  216. INT8U PcdConfig(INT8U ucType)
  217. {
  218.         INT8U ucRegVal;

  219. #if        HARDWARE_MODE
  220.         PcdHardRst();                                                                // 硬件復(fù)位
  221. #else
  222.         RcSetReg(JREG_COMMAND, JCMD_SOFTRESET);                // 復(fù)位芯片
  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. // 函數(shù)原型:        void PCDISR (void)
  254. // 函數(shù)功能:        Pcd中斷服務(wù)程序
  255. // 入口參數(shù):        -
  256. // 出口參數(shù):        -
  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. // 函數(shù)原型:        INT8U  PcdCmd(INT8U ucCmd,INT16U nCmdLen,INT8U *pExchangeBuf)
  398. // 函數(shù)功能:        Pcd將數(shù)據(jù)發(fā)送到卡,然后等待接收從卡返回的數(shù)據(jù)。
  399. // 入口參數(shù):        INT8U ucCmd                                                // 命令
  400. //                                INT16U nCmdLen                                        // 命令長(zhǎng)度
  401. //                                INT8U *pExchangeBuf                                // 發(fā)送數(shù)據(jù)緩沖區(qū)首址。
  402. // 出口參數(shù):        INT8U *pExchangeBuf                                // 接收數(shù)據(jù)緩沖區(qū)首址。
  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. // 函數(shù)原型:        void CardReset(INT8U ucPause_1ms,INT8U ucWait_1ms)
  689. // 函數(shù)功能:        使RF場(chǎng)產(chǎn)生1個(gè)暫停,讓卡復(fù)位
  690. // 入口參數(shù):        INT8U ucPause_1ms                ; 暫停時(shí)間,關(guān)閉RF場(chǎng)該時(shí)間后重新打開,
  691. //                                                                                                ; 若為0則不重新打開
  692. //                                INT8U ucWait_1ms                ; RF場(chǎng)重新打開后持續(xù)等待該時(shí)間,若為0則不等待
  693. // 出口參數(shù):        -
  694. // 返 回 值:        -
  695. // 說    明:        等待時(shí)間可根據(jù)卡的功耗而定,如Mifare1卡的功耗較小,等待數(shù)毫秒即可,
  696. //                                而CPU卡功耗較大,需要等待80毫秒左右。
  697. /////////////////////////////////////////////////////////////////////////////////////////////////////////////
  698. #if PCD_CARD_REST_EN
  699. void CardReset(INT8U ucPause_1ms,INT8U ucWait_1ms)
  700. {
  701.         INT8U RegVal;

  702.         // 關(guān)閉RF場(chǎng)
  703. ……………………

  704. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
Driver.zip (33.43 KB, 下載次數(shù): 137)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:482193 發(fā)表于 2019-8-23 09:07 | 只看該作者
有使用示例嗎??
回復(fù)

使用道具 舉報(bào)

板凳
ID:369226 發(fā)表于 2020-6-22 13:08 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

地板
ID:888543 發(fā)表于 2024-12-20 10:06 | 只看該作者
整合需要,下載試試。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产免费一区 | 午夜理伦三级理论三级在线观看 | 水蜜桃久久夜色精品一区 | 黄网站在线观看 | 国产精久久久久久 | 青青青伊人 | 久久综合狠狠综合久久 | 亚洲精品欧美一区二区三区 | 国产精品毛片一区二区在线看 | 精品日韩在线 | 97伦理电影网 | 久久久久黑人 | 国产99小视频 | 亚洲国产精品va在线看黑人 | 激情六月丁香 | 久久精品综合 | 玖玖爱365| 99国内精品久久久久久久 | 久久久www成人免费精品 | 亚洲精品二区 | 综合久久久久 | 国产一区二区三区久久久久久久久 | 都市激情亚洲 | 99热在这里只有精品 | 激情91| av黄色片| 蜜桃视频在线观看免费视频网站www | 俺去俺来也www色官网cms | 亚洲精品一区二区三区蜜桃久 | 日韩在线欧美 | 91在线网| 黄色免费在线观看 | 国产精品国产三级国产aⅴ入口 | 成人欧美一区二区三区黑人孕妇 | 男人的天堂中文字幕 | 中文字幕第一页在线 | 中文字幕视频在线看 | 日本一区二区高清不卡 | 国产精品久久久久久久久免费 | 日韩在线免费视频 | 欧美激情在线一区二区三区 |