<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic RC522/FM17550 Read Fifo Failer in Other NXP Products</title>
    <link>https://community.nxp.com/t5/Other-NXP-Products/RC522-FM17550-Read-Fifo-Failer/m-p/678342#M4794</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;hi&lt;/P&gt;&lt;P&gt;this problem is :when i use the following function to&amp;nbsp;write and read Rc522 Fifo ,it will success read and write if i write 64 bytes,but if i write over 64 bytes,the operation will fail,it can be successed read 128 bytes.&lt;/P&gt;&lt;P&gt;i will apperated if you can correct &amp;nbsp;me the following funciton .&lt;/P&gt;&lt;P&gt;thank you&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;uint8 PcdComMF522(&lt;BR /&gt; uint8 Command, &lt;BR /&gt; uint8 *pInData, &lt;BR /&gt; uint8 InLenByte, &lt;BR /&gt; uint8 *pOutData, &lt;BR /&gt; uint16 *pOutLenBit)&lt;BR /&gt;{&lt;BR /&gt; uint32 j =0;&lt;BR /&gt; unsigned char n=0;&lt;BR /&gt; uint32 i=0;&lt;BR /&gt; uint8 recebyte = 0;&lt;BR /&gt; uint8 status;&lt;BR /&gt; unsigned char irqEn = 0x00;&lt;BR /&gt; unsigned char waitFor = 0x00;&lt;BR /&gt; unsigned char lastBits;&lt;BR /&gt; uint8 LastLenth,gFifoLenth,ErrorFlag;&lt;BR /&gt; volatile uint16 k;&lt;BR /&gt; &lt;BR /&gt; switch (Command)&lt;BR /&gt; {&lt;BR /&gt; case PCD_IDLE:&lt;BR /&gt; irqEn = 0x00;&lt;BR /&gt; waitFor = 0x10;&lt;BR /&gt; break;&lt;BR /&gt; case PCD_AUTHENT: &lt;BR /&gt; irqEn = 0x12; &lt;BR /&gt; waitFor = 0x10; &lt;BR /&gt; break;&lt;BR /&gt; case PCD_CALCCRC:&lt;BR /&gt; irqEn = 0x11;&lt;BR /&gt; waitFor = 0x10;&lt;BR /&gt; break;&lt;BR /&gt; case PCD_RECEIVE:&lt;BR /&gt; irqEn = 0x06;&lt;BR /&gt; waitFor = 0x10;&lt;BR /&gt; recebyte=1;&lt;BR /&gt; break;&lt;BR /&gt; case PCD_TRANSMIT:&lt;BR /&gt; irqEn = 0x05;&lt;BR /&gt; waitFor = 0x10;&lt;BR /&gt; break;&lt;BR /&gt; case PCD_TRANSCEIVE:&lt;BR /&gt; irqEn = 0x3F;&lt;BR /&gt; waitFor = 0x30;&lt;BR /&gt; recebyte=1;&lt;BR /&gt; break;&lt;BR /&gt; default:&lt;BR /&gt; Command = RFID_UNKNOWN;&lt;BR /&gt; break;&lt;BR /&gt; }&lt;BR /&gt; &lt;BR /&gt; //STEP 1 配置&lt;BR /&gt; //改变WaterLevelRegChallege的值来调整接收到的有效数据数量&lt;BR /&gt; if (Command != RFID_UNKNOWN)&lt;BR /&gt; { &lt;BR /&gt; WriteRawRC(ComIEnReg,irqEn|0x80); &lt;BR /&gt; SetBitMask(FIFOLevelReg,0x80); //清FIFO&lt;BR /&gt; WriteRawRC(WaterLevelReg,20); //上下限字节数为WaterLevelRegChallege个&lt;BR /&gt; ClearBitMask(ComIrqReg,0x80);&lt;BR /&gt; WriteRawRC(CommandReg,PCD_IDLE);//进入到空闲状态(取消上一次命令&lt;BR /&gt; &lt;BR /&gt; LastLenth = InLenByte;&lt;BR /&gt; if(LastLenth&amp;gt;64)&lt;BR /&gt; {&lt;BR /&gt; WriteRawRC(CommandReg, Command); //向命令寄存器写操作码，连续发送状态（数据超过64个字节），必须先发发送命令。&lt;BR /&gt; }&lt;BR /&gt; &lt;BR /&gt; while(1) //一个小算法用于发送超过FIFO容量（64字节）的数据。&lt;BR /&gt; {&lt;BR /&gt; gFifoLenth = FIFO_MAX_RLEN-(ReadRawRC(FIFOLevelReg)&amp;amp;0x7f);//得到剩余FIFO空间&lt;BR /&gt; if(LastLenth&amp;gt;gFifoLenth) &lt;BR /&gt; { //说明一次不能发完所有的数据，需要分包发送&lt;BR /&gt; LastLenth -=gFifoLenth; //还剩下没有发送的数据&lt;BR /&gt; for(k=0; k&amp;lt;gFifoLenth; k++) //本次需要发送数据的长度&lt;BR /&gt; {&lt;BR /&gt; WriteRawRC(FIFODataReg, pInData[j++]);&lt;BR /&gt; }&lt;BR /&gt; if(Command== PCD_TRANSCEIVE) //在RC522中要想发送超过64个字节的数据，这个启动发送放置的位置非常重要&lt;BR /&gt; { &lt;BR /&gt; SetBitMask(BitFramingReg,0x80); //启动发送&lt;BR /&gt; }&lt;BR /&gt; i = 0x3500;&lt;BR /&gt; do&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(ComIrqReg); &lt;BR /&gt; i--;&lt;BR /&gt; }&lt;BR /&gt; while ((i!=0) &amp;amp;&amp;amp; !(n&amp;amp;irqEn&amp;amp;0x04)&amp;amp;&amp;amp;!(n&amp;amp;waitFor)); //下限到了可以发送数据&lt;BR /&gt; &lt;BR /&gt; if((n&amp;amp;0x04))&lt;BR /&gt; {&lt;BR /&gt; WriteRawRC(ComIrqReg,0x04); //清下限状态寄存器&lt;BR /&gt; continue; //还需要继续发送数据&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; return MI_ERR;&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; for(k=0; k&amp;lt;LastLenth; k++) //发送最后一包数据&lt;BR /&gt; {&lt;BR /&gt; WriteRawRC(FIFODataReg, pInData[j++]);&lt;BR /&gt; }&lt;BR /&gt; if(InLenByte&amp;gt;64)&lt;BR /&gt; {&lt;BR /&gt; if(Command== PCD_TRANSCEIVE) //在RC522中要想发送超过64个字节的数据，这个启动发送放置的位置非常重要&lt;BR /&gt; { &lt;BR /&gt; SetBitMask(BitFramingReg,0x80); //启动发送&lt;BR /&gt; }&lt;BR /&gt; i = 0x3500;&lt;BR /&gt; do&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(ComIrqReg);&lt;BR /&gt; i--;&lt;BR /&gt; }while ((i!=0) &amp;amp;&amp;amp; !(n&amp;amp;irqEn&amp;amp;0x01) &amp;amp;&amp;amp; !(n&amp;amp;0x40)&amp;amp;&amp;amp;!(n&amp;amp;waitFor)); //0x01表示定时器溢出//waitFor表示发送和接收都结束//0x40表示发送结束&lt;BR /&gt; }&lt;BR /&gt; break;&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; if(InLenByte&amp;lt;=64)&lt;BR /&gt; {&lt;BR /&gt; WriteRawRC(CommandReg,Command);&lt;BR /&gt; if(Command== PCD_TRANSCEIVE)&lt;BR /&gt; { &lt;BR /&gt; SetBitMask(BitFramingReg,0x80); //启动发送&lt;BR /&gt; }&lt;BR /&gt; i = 0x3500;&lt;BR /&gt; do&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(ComIrqReg);&lt;BR /&gt; i--;&lt;BR /&gt; }while ((i!=0) &amp;amp;&amp;amp; !(n&amp;amp;irqEn&amp;amp;0x01) &amp;amp;&amp;amp; !(n&amp;amp;0x40)&amp;amp;&amp;amp;!(n&amp;amp;waitFor)); //0x01表示定时器溢出//waitFor表示发送和接收都结束//0x40表示发送结束&lt;BR /&gt; }&lt;BR /&gt; j=0; //接收计数器&lt;BR /&gt; status = MI_ERR;&lt;BR /&gt; *pOutLenBit =0;&lt;BR /&gt; WriteRawRC(ComIrqReg,0x08); //清上限状态寄存器&lt;BR /&gt; &lt;BR /&gt; &lt;BR /&gt; while(1)&lt;BR /&gt; {&lt;BR /&gt; i = 0x6500; &lt;BR /&gt; do&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(ComIrqReg);&lt;BR /&gt; i--;&lt;BR /&gt; }while ((i!=0) &amp;amp;&amp;amp; !(n&amp;amp;irqEn&amp;amp;0x01)&amp;amp;&amp;amp;!(n&amp;amp;0x20) &amp;amp;&amp;amp; !(n&amp;amp;0x08)&amp;amp;&amp;amp;!(n&amp;amp;waitFor)); //0x01表示定时器溢出//waitFor表示发送和接收都结束//0x20表示接收完成//0x08高限告警&lt;/P&gt;&lt;P&gt;if((i==0)||(n &amp;amp; irqEn &amp;amp; 0x01)) //表示超时&lt;BR /&gt; { &lt;BR /&gt; status = MI_NOTAGERR; &lt;BR /&gt; break;&lt;BR /&gt; }&lt;BR /&gt; &lt;BR /&gt; else if((n&amp;amp;0x20)||(n&amp;amp;waitFor)) //接收结束或者超时就退出 &lt;BR /&gt; {&lt;BR /&gt; ErrorFlag = ReadRawRC(ErrorReg);&lt;BR /&gt; if (!(ErrorFlag&amp;amp;0x9F))&lt;BR /&gt; {&lt;BR /&gt; status = MI_OK;&lt;BR /&gt; if (recebyte)&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(FIFOLevelReg);&lt;BR /&gt; n = ReadRawRC(FIFOLevelReg);&lt;BR /&gt; lastBits = ReadRawRC(ControlReg) &amp;amp; 0x07;&lt;BR /&gt; if (lastBits)&lt;BR /&gt; {&lt;BR /&gt; *pOutLenBit += (n-1)*8 + lastBits;&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; *pOutLenBit += n*8;&lt;BR /&gt; }&lt;BR /&gt; if (n == 0)&lt;BR /&gt; {&lt;BR /&gt; n = 1;&lt;BR /&gt; }&lt;BR /&gt; for (k=0; k&amp;lt;n; k++)&lt;BR /&gt; {&lt;BR /&gt; pOutData[j++] = ReadRawRC(FIFODataReg);&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; break;&lt;BR /&gt; }&lt;BR /&gt; else if (ErrorFlag&amp;amp;0x08)&lt;BR /&gt; {&lt;BR /&gt; status = MI_ERR;&lt;BR /&gt; if (recebyte)&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(FIFOLevelReg);&lt;BR /&gt; lastBits = ReadRawRC(ControlReg) &amp;amp; 0x07;&lt;BR /&gt; if (lastBits)&lt;BR /&gt; {&lt;BR /&gt; *pOutLenBit = (n-1)*8 + lastBits;&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; *pOutLenBit = n*8;&lt;BR /&gt; }&lt;BR /&gt; if (n == 0)&lt;BR /&gt; {&lt;BR /&gt; n = 1;&lt;BR /&gt; }&lt;BR /&gt; for (i=0; i&amp;lt;n; i++)&lt;BR /&gt; {&lt;BR /&gt; pOutData[i+1] = ReadRawRC(FIFODataReg);&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; pOutData[0]=ReadRawRC(CollReg)&amp;amp;0x07;&lt;BR /&gt; }&lt;BR /&gt; else if (!(ReadRawRC(ErrorReg)&amp;amp;0x17))&lt;BR /&gt; { &lt;BR /&gt; status = MI_ERR; &lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; { &lt;BR /&gt; status = MI_ERR; &lt;BR /&gt; }&lt;/P&gt;&lt;P&gt;break;&lt;BR /&gt; }&lt;BR /&gt; else if(n&amp;amp;0x08) //FIFO数据过高中断&lt;BR /&gt; {&lt;BR /&gt; if (recebyte)&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(FIFOLevelReg);&lt;BR /&gt; do&lt;BR /&gt; { &lt;BR /&gt; *pOutLenBit += n*8; //累计接收计数&lt;BR /&gt; for (k=0; k&amp;lt;n; k++)&lt;BR /&gt; {&lt;BR /&gt; pOutData[j++] = ReadRawRC(FIFODataReg);&lt;BR /&gt; }&lt;BR /&gt; n = ReadRawRC(FIFOLevelReg);&lt;BR /&gt; }while(n);&lt;BR /&gt; WriteRawRC(ComIrqReg,0x08); //清上限状态寄存器 &lt;BR /&gt; }&lt;BR /&gt; continue;&lt;BR /&gt; } &lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; continue;&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; WriteRawRC(BitFramingReg,0x00); //停止发送，清收发位存储&lt;BR /&gt; WriteRawRC(ComIEnReg,0x7F); &lt;BR /&gt; WriteRawRC(ComIrqReg,0x7F); &lt;BR /&gt; SetBitMask(ControlReg,0x80);&lt;BR /&gt; WriteRawRC(CommandReg,PCD_IDLE); &lt;BR /&gt; }&lt;BR /&gt; return status;&lt;BR /&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 30 Jun 2017 03:00:48 GMT</pubDate>
    <dc:creator>yaowuhe</dc:creator>
    <dc:date>2017-06-30T03:00:48Z</dc:date>
    <item>
      <title>RC522/FM17550 Read Fifo Failer</title>
      <link>https://community.nxp.com/t5/Other-NXP-Products/RC522-FM17550-Read-Fifo-Failer/m-p/678342#M4794</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;hi&lt;/P&gt;&lt;P&gt;this problem is :when i use the following function to&amp;nbsp;write and read Rc522 Fifo ,it will success read and write if i write 64 bytes,but if i write over 64 bytes,the operation will fail,it can be successed read 128 bytes.&lt;/P&gt;&lt;P&gt;i will apperated if you can correct &amp;nbsp;me the following funciton .&lt;/P&gt;&lt;P&gt;thank you&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;uint8 PcdComMF522(&lt;BR /&gt; uint8 Command, &lt;BR /&gt; uint8 *pInData, &lt;BR /&gt; uint8 InLenByte, &lt;BR /&gt; uint8 *pOutData, &lt;BR /&gt; uint16 *pOutLenBit)&lt;BR /&gt;{&lt;BR /&gt; uint32 j =0;&lt;BR /&gt; unsigned char n=0;&lt;BR /&gt; uint32 i=0;&lt;BR /&gt; uint8 recebyte = 0;&lt;BR /&gt; uint8 status;&lt;BR /&gt; unsigned char irqEn = 0x00;&lt;BR /&gt; unsigned char waitFor = 0x00;&lt;BR /&gt; unsigned char lastBits;&lt;BR /&gt; uint8 LastLenth,gFifoLenth,ErrorFlag;&lt;BR /&gt; volatile uint16 k;&lt;BR /&gt; &lt;BR /&gt; switch (Command)&lt;BR /&gt; {&lt;BR /&gt; case PCD_IDLE:&lt;BR /&gt; irqEn = 0x00;&lt;BR /&gt; waitFor = 0x10;&lt;BR /&gt; break;&lt;BR /&gt; case PCD_AUTHENT: &lt;BR /&gt; irqEn = 0x12; &lt;BR /&gt; waitFor = 0x10; &lt;BR /&gt; break;&lt;BR /&gt; case PCD_CALCCRC:&lt;BR /&gt; irqEn = 0x11;&lt;BR /&gt; waitFor = 0x10;&lt;BR /&gt; break;&lt;BR /&gt; case PCD_RECEIVE:&lt;BR /&gt; irqEn = 0x06;&lt;BR /&gt; waitFor = 0x10;&lt;BR /&gt; recebyte=1;&lt;BR /&gt; break;&lt;BR /&gt; case PCD_TRANSMIT:&lt;BR /&gt; irqEn = 0x05;&lt;BR /&gt; waitFor = 0x10;&lt;BR /&gt; break;&lt;BR /&gt; case PCD_TRANSCEIVE:&lt;BR /&gt; irqEn = 0x3F;&lt;BR /&gt; waitFor = 0x30;&lt;BR /&gt; recebyte=1;&lt;BR /&gt; break;&lt;BR /&gt; default:&lt;BR /&gt; Command = RFID_UNKNOWN;&lt;BR /&gt; break;&lt;BR /&gt; }&lt;BR /&gt; &lt;BR /&gt; //STEP 1 配置&lt;BR /&gt; //改变WaterLevelRegChallege的值来调整接收到的有效数据数量&lt;BR /&gt; if (Command != RFID_UNKNOWN)&lt;BR /&gt; { &lt;BR /&gt; WriteRawRC(ComIEnReg,irqEn|0x80); &lt;BR /&gt; SetBitMask(FIFOLevelReg,0x80); //清FIFO&lt;BR /&gt; WriteRawRC(WaterLevelReg,20); //上下限字节数为WaterLevelRegChallege个&lt;BR /&gt; ClearBitMask(ComIrqReg,0x80);&lt;BR /&gt; WriteRawRC(CommandReg,PCD_IDLE);//进入到空闲状态(取消上一次命令&lt;BR /&gt; &lt;BR /&gt; LastLenth = InLenByte;&lt;BR /&gt; if(LastLenth&amp;gt;64)&lt;BR /&gt; {&lt;BR /&gt; WriteRawRC(CommandReg, Command); //向命令寄存器写操作码，连续发送状态（数据超过64个字节），必须先发发送命令。&lt;BR /&gt; }&lt;BR /&gt; &lt;BR /&gt; while(1) //一个小算法用于发送超过FIFO容量（64字节）的数据。&lt;BR /&gt; {&lt;BR /&gt; gFifoLenth = FIFO_MAX_RLEN-(ReadRawRC(FIFOLevelReg)&amp;amp;0x7f);//得到剩余FIFO空间&lt;BR /&gt; if(LastLenth&amp;gt;gFifoLenth) &lt;BR /&gt; { //说明一次不能发完所有的数据，需要分包发送&lt;BR /&gt; LastLenth -=gFifoLenth; //还剩下没有发送的数据&lt;BR /&gt; for(k=0; k&amp;lt;gFifoLenth; k++) //本次需要发送数据的长度&lt;BR /&gt; {&lt;BR /&gt; WriteRawRC(FIFODataReg, pInData[j++]);&lt;BR /&gt; }&lt;BR /&gt; if(Command== PCD_TRANSCEIVE) //在RC522中要想发送超过64个字节的数据，这个启动发送放置的位置非常重要&lt;BR /&gt; { &lt;BR /&gt; SetBitMask(BitFramingReg,0x80); //启动发送&lt;BR /&gt; }&lt;BR /&gt; i = 0x3500;&lt;BR /&gt; do&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(ComIrqReg); &lt;BR /&gt; i--;&lt;BR /&gt; }&lt;BR /&gt; while ((i!=0) &amp;amp;&amp;amp; !(n&amp;amp;irqEn&amp;amp;0x04)&amp;amp;&amp;amp;!(n&amp;amp;waitFor)); //下限到了可以发送数据&lt;BR /&gt; &lt;BR /&gt; if((n&amp;amp;0x04))&lt;BR /&gt; {&lt;BR /&gt; WriteRawRC(ComIrqReg,0x04); //清下限状态寄存器&lt;BR /&gt; continue; //还需要继续发送数据&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; return MI_ERR;&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; for(k=0; k&amp;lt;LastLenth; k++) //发送最后一包数据&lt;BR /&gt; {&lt;BR /&gt; WriteRawRC(FIFODataReg, pInData[j++]);&lt;BR /&gt; }&lt;BR /&gt; if(InLenByte&amp;gt;64)&lt;BR /&gt; {&lt;BR /&gt; if(Command== PCD_TRANSCEIVE) //在RC522中要想发送超过64个字节的数据，这个启动发送放置的位置非常重要&lt;BR /&gt; { &lt;BR /&gt; SetBitMask(BitFramingReg,0x80); //启动发送&lt;BR /&gt; }&lt;BR /&gt; i = 0x3500;&lt;BR /&gt; do&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(ComIrqReg);&lt;BR /&gt; i--;&lt;BR /&gt; }while ((i!=0) &amp;amp;&amp;amp; !(n&amp;amp;irqEn&amp;amp;0x01) &amp;amp;&amp;amp; !(n&amp;amp;0x40)&amp;amp;&amp;amp;!(n&amp;amp;waitFor)); //0x01表示定时器溢出//waitFor表示发送和接收都结束//0x40表示发送结束&lt;BR /&gt; }&lt;BR /&gt; break;&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; if(InLenByte&amp;lt;=64)&lt;BR /&gt; {&lt;BR /&gt; WriteRawRC(CommandReg,Command);&lt;BR /&gt; if(Command== PCD_TRANSCEIVE)&lt;BR /&gt; { &lt;BR /&gt; SetBitMask(BitFramingReg,0x80); //启动发送&lt;BR /&gt; }&lt;BR /&gt; i = 0x3500;&lt;BR /&gt; do&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(ComIrqReg);&lt;BR /&gt; i--;&lt;BR /&gt; }while ((i!=0) &amp;amp;&amp;amp; !(n&amp;amp;irqEn&amp;amp;0x01) &amp;amp;&amp;amp; !(n&amp;amp;0x40)&amp;amp;&amp;amp;!(n&amp;amp;waitFor)); //0x01表示定时器溢出//waitFor表示发送和接收都结束//0x40表示发送结束&lt;BR /&gt; }&lt;BR /&gt; j=0; //接收计数器&lt;BR /&gt; status = MI_ERR;&lt;BR /&gt; *pOutLenBit =0;&lt;BR /&gt; WriteRawRC(ComIrqReg,0x08); //清上限状态寄存器&lt;BR /&gt; &lt;BR /&gt; &lt;BR /&gt; while(1)&lt;BR /&gt; {&lt;BR /&gt; i = 0x6500; &lt;BR /&gt; do&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(ComIrqReg);&lt;BR /&gt; i--;&lt;BR /&gt; }while ((i!=0) &amp;amp;&amp;amp; !(n&amp;amp;irqEn&amp;amp;0x01)&amp;amp;&amp;amp;!(n&amp;amp;0x20) &amp;amp;&amp;amp; !(n&amp;amp;0x08)&amp;amp;&amp;amp;!(n&amp;amp;waitFor)); //0x01表示定时器溢出//waitFor表示发送和接收都结束//0x20表示接收完成//0x08高限告警&lt;/P&gt;&lt;P&gt;if((i==0)||(n &amp;amp; irqEn &amp;amp; 0x01)) //表示超时&lt;BR /&gt; { &lt;BR /&gt; status = MI_NOTAGERR; &lt;BR /&gt; break;&lt;BR /&gt; }&lt;BR /&gt; &lt;BR /&gt; else if((n&amp;amp;0x20)||(n&amp;amp;waitFor)) //接收结束或者超时就退出 &lt;BR /&gt; {&lt;BR /&gt; ErrorFlag = ReadRawRC(ErrorReg);&lt;BR /&gt; if (!(ErrorFlag&amp;amp;0x9F))&lt;BR /&gt; {&lt;BR /&gt; status = MI_OK;&lt;BR /&gt; if (recebyte)&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(FIFOLevelReg);&lt;BR /&gt; n = ReadRawRC(FIFOLevelReg);&lt;BR /&gt; lastBits = ReadRawRC(ControlReg) &amp;amp; 0x07;&lt;BR /&gt; if (lastBits)&lt;BR /&gt; {&lt;BR /&gt; *pOutLenBit += (n-1)*8 + lastBits;&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; *pOutLenBit += n*8;&lt;BR /&gt; }&lt;BR /&gt; if (n == 0)&lt;BR /&gt; {&lt;BR /&gt; n = 1;&lt;BR /&gt; }&lt;BR /&gt; for (k=0; k&amp;lt;n; k++)&lt;BR /&gt; {&lt;BR /&gt; pOutData[j++] = ReadRawRC(FIFODataReg);&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; break;&lt;BR /&gt; }&lt;BR /&gt; else if (ErrorFlag&amp;amp;0x08)&lt;BR /&gt; {&lt;BR /&gt; status = MI_ERR;&lt;BR /&gt; if (recebyte)&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(FIFOLevelReg);&lt;BR /&gt; lastBits = ReadRawRC(ControlReg) &amp;amp; 0x07;&lt;BR /&gt; if (lastBits)&lt;BR /&gt; {&lt;BR /&gt; *pOutLenBit = (n-1)*8 + lastBits;&lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; *pOutLenBit = n*8;&lt;BR /&gt; }&lt;BR /&gt; if (n == 0)&lt;BR /&gt; {&lt;BR /&gt; n = 1;&lt;BR /&gt; }&lt;BR /&gt; for (i=0; i&amp;lt;n; i++)&lt;BR /&gt; {&lt;BR /&gt; pOutData[i+1] = ReadRawRC(FIFODataReg);&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; pOutData[0]=ReadRawRC(CollReg)&amp;amp;0x07;&lt;BR /&gt; }&lt;BR /&gt; else if (!(ReadRawRC(ErrorReg)&amp;amp;0x17))&lt;BR /&gt; { &lt;BR /&gt; status = MI_ERR; &lt;BR /&gt; }&lt;BR /&gt; else&lt;BR /&gt; { &lt;BR /&gt; status = MI_ERR; &lt;BR /&gt; }&lt;/P&gt;&lt;P&gt;break;&lt;BR /&gt; }&lt;BR /&gt; else if(n&amp;amp;0x08) //FIFO数据过高中断&lt;BR /&gt; {&lt;BR /&gt; if (recebyte)&lt;BR /&gt; {&lt;BR /&gt; n = ReadRawRC(FIFOLevelReg);&lt;BR /&gt; do&lt;BR /&gt; { &lt;BR /&gt; *pOutLenBit += n*8; //累计接收计数&lt;BR /&gt; for (k=0; k&amp;lt;n; k++)&lt;BR /&gt; {&lt;BR /&gt; pOutData[j++] = ReadRawRC(FIFODataReg);&lt;BR /&gt; }&lt;BR /&gt; n = ReadRawRC(FIFOLevelReg);&lt;BR /&gt; }while(n);&lt;BR /&gt; WriteRawRC(ComIrqReg,0x08); //清上限状态寄存器 &lt;BR /&gt; }&lt;BR /&gt; continue;&lt;BR /&gt; } &lt;BR /&gt; else&lt;BR /&gt; {&lt;BR /&gt; continue;&lt;BR /&gt; }&lt;BR /&gt; }&lt;BR /&gt; WriteRawRC(BitFramingReg,0x00); //停止发送，清收发位存储&lt;BR /&gt; WriteRawRC(ComIEnReg,0x7F); &lt;BR /&gt; WriteRawRC(ComIrqReg,0x7F); &lt;BR /&gt; SetBitMask(ControlReg,0x80);&lt;BR /&gt; WriteRawRC(CommandReg,PCD_IDLE); &lt;BR /&gt; }&lt;BR /&gt; return status;&lt;BR /&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 30 Jun 2017 03:00:48 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Other-NXP-Products/RC522-FM17550-Read-Fifo-Failer/m-p/678342#M4794</guid>
      <dc:creator>yaowuhe</dc:creator>
      <dc:date>2017-06-30T03:00:48Z</dc:date>
    </item>
  </channel>
</rss>

