STM32
直播中

张飞雄

7年用户 982经验值
私信 关注
[问答]

使用ST25R3912/3911读写ISO15693卡片扇区报错的原因?

使用ST25R3912/3911 读写ISO15693卡片扇区的报错,卡片ID可以正常读出
以下是串口打印的内容:
错误ID为21(ERR_CRC  CRC错误)
ISO15693/NFC-V card found. UID: E007A40003BCD511Read Block: FAIL Data: C4A5DC68err = 21下面是移植的例程
bool demoPollNFCV( void ){  ReturnCode            err;  rfalNfcvListenDevice  nfcvDev;  bool                  found = false;  uint8_t               devCnt = 0;  uint8_t               devUID[RFAL_NFCV_UID_LEN];  uint16_t              rcvLen;  uint8_t               blockNum = 1;  uint8_t               rxBuf[ 1 + DEMO_NFCV_BLOCK_LEN + RFAL_CRC_LEN ];                        /* Flags + Block Data + CRC */  uint8_t               wrData[DEMO_NFCV_BLOCK_LEN] = { 0x11, 0x22, 0x33, 0x99 };             /* Write block example */        uint8_t               reqFlag;  /*******************************************************************************/  /* ISO15693/NFC_V_PASSIVE_POLL_MODE                                            */  /*******************************************************************************/  rfalNfcvPollerInitialize();           /* Initialize for NFC-V */  rfalFieldOnAndStartGT();              /* Turns the Field On if not already and start GT timer */  err = rfalNfcvPollerCollisionResolution(1,  nfcvDev,  devCnt);  if( (err == ERR_NONE)    (devCnt > 0) )  {    /******************************************************/    /* NFC-V card found                                   */    /* NFCID/UID is contained in: invRes.UID */    ST_MEMCPY(devUID, nfcvDev.InvRes.UID, RFAL_NFCV_UID_LEN);   /* Copy the UID into local var */    REVERSE_BYTES(devUID, RFAL_NFCV_UID_LEN);                   /* Reverse the UID for display purposes */    found = true;    printf("ISO15693/NFC-V card found. UID: %srn", hex2Str(devUID, RFAL_NFCV_UID_LEN));#if 1 /*寻址模式  *///RFAL_NFCV_REQ_FLAG_DEFAULT      err = rfalNfcvPollerReadSingleBlock((RFAL_NFCV_REQ_FLAG_DEFAULT | RFAL_NFCV_REQ_FLAG_SELECT), nfcvDev.InvRes.UID, blockNum, rxBuf, sizeof(rxBuf),  rcvLen);    //  printf(" Read Block: %s Data: %s rn", (err != ERR_NONE) ? "FAIL": "OK", (err != ERR_NONE) ? "" : hex2Str(  rxBuf[1], DEMO_NFCV_BLOCK_LEN) );         printf(" Read Block: %s Data: %s rn", (err != ERR_NONE) ? "FAIL": "OK", hex2Str(  rxBuf[1], DEMO_NFCV_BLOCK_LEN) );  #if 0 /* 写*/      err = rfalNfcvPollerWriteSingleBlock(RFAL_NFCV_REQ_FLAG_DEFAULT, nfcvDev.InvRes.UID, blockNum, wrData, sizeof(wrData));      platformLog(" Write Block: %s Data: %srn", (err != ERR_NONE) ? "FAIL": "OK", hex2Str( wrData, DEMO_NFCV_BLOCK_LEN) );      err = rfalNfcvPollerReadSingleBlock(RFAL_NFCV_REQ_FLAG_DEFAULT, nfcvDev.InvRes.UID, blockNum, rxBuf, sizeof(rxBuf),  rcvLen);      platformLog(" Read Block: %s Data: %srn", (err != ERR_NONE) ? "FAIL": "OK", (err != ERR_NONE) ? "" : hex2Str(  rxBuf[1], DEMO_NFCV_BLOCK_LEN) );  #endif#else  /* Using Select mode */  printf("rfalNfcvPollerSelectrn");        reqFlag = RFAL_NFCV_REQ_FLAG_DEFAULT;                err = rfalNfcvPollerSelect( reqFlag,  nfcvDev.InvRes.UID);        printf(" Select %s rn", (err != ERR_NONE) ? "FAIL (revert to addressed mode)": "OK" );        if( err == ERR_NONE )        {            reqFlag = (RFAL_NFCV_REQ_FLAG_DEFAULT | RFAL_NFCV_REQ_FLAG_SELECT);        }      err = rfalNfcvPollerReadSingleBlock(RFAL_NFCV_REQ_FLAG_DEFAULT, nfcvDev.InvRes.UID, blockNum, rxBuf, sizeof(rxBuf),  rcvLen);      printf(" Read Block: %s Data: %srn", (err != ERR_NONE) ? "FAIL": "OK", hex2Str(  rxBuf[0], rcvLen) );            if(err != ERR_NONE)                 printf("err = %drn",err);  #if 0 /* Writing example */      err = rfalNfcvPollerWriteSingleBlock(RFAL_NFCV_REQ_FLAG_DEFAULT, NULL, blockNum, wrData, sizeof(wrData));      platformLog(" Write Block: %s Data: %srn", (err != ERR_NONE) ? "FAIL": "OK", hex2Str( wrData, DEMO_NFCV_BLOCK_LEN) );      err = rfalNfcvPollerReadSingleBlock(RFAL_NFCV_REQ_FLAG_DEFAULT, NULL, blockNum, rxBuf, sizeof(rxBuf),  rcvLen);      platformLog(" Read Block: %s Data: %srn", (err != ERR_NONE) ? "FAIL": "OK", (err != ERR_NONE) ? "" : hex2Str(  rxBuf[1], DEMO_NFCV_BLOCK_LEN) );  #endif#endif  }  return found;}


回帖(1)

李斌

2024-3-12 17:17:40
从错误信息来看,报错原因是CRC错误。ISO15693标准的读写操作中,读取数据时需要通过CRC校验来确保数据的完整性,如果CRC校验失败,则会报错。这通常是由于通信过程中发生了一些错误导致的,比如传输过程中发生了干扰、噪声等。

在你的移植例程中,可能存在以下一些可能导致CRC错误的问题:

1. 通信距离过远:ISO15693标准的读写距离一般为10cm,如果距离过远,信号衰减可能会导致通信错误。尝试将读写设备靠近ISO15693卡片。

2. 通信速率不匹配:ISO15693卡片和读写设备之间的通信速率需要相匹配,检查你的读写器设备和ISO15693卡片的通信速率设置是否一致。

3. 通信设置错误:检查你的读写器设备与ISO15693卡片之间的通信参数设置是否正确,包括波特率、帧格式等。

4. 设备硬件问题:可能是你的读写器设备或ISO15693卡片本身存在硬件故障或损坏导致通信错误。

通过检查以上可能的问题,你可以找到导致CRC错误的具体原因,并进行相应的修复和调整。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分