2171612_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2171612_zh-CN

2171612_zh-CN

clrc663 lpcd i 和 q 值 i 得到 0x00

我正在使用 clrc663 作为读卡器我在那里实现了 lpcd 模式我在运行 lpcd 校准功能时遇到了问题我得到了 i 而且 q 值是 0x00 我从天线得到的是什么问题怎么解决这个问题

我使用的这个函数

 
/* 执行 LPCD 校准 */
phStatus_t Calibrate_LPCD(uint32_t dwLPCDDemo, uint32_t *pdwLPCDRefValue)
{
phStatus_t wStatus;
uint8_t bValueI = 0;
uint8_t bValueQ = 0;
uint8_t bVersion = 0;
uint8_t bDigitalFilter = PH_ON;
uint16_t wDetectionOption = PHHAL_HW_RC663_FILTER_OPTION1;
uint16_t wPowerDownTimeMs = LPCD_POWERDOWN_TIME;
uint16_t wDetectionTimeUs = LPCD_FIELD_ON_DURATION;
DEBUG_PRINTF("\nLPCD 校准开始。");
phhalHw_FieldOn(pHal);
phhalHw_Wait(pHal, PHHAL_HW_TIME_MILLISECONDS, 5);
 
/* 配置 LPCD 模式默认值,以执行 LPCD 校准循环。
* 提供输入参考 I 和 Q 值为零,并将检测时间提供给
* 在此持续时间内打开射频,使用 I 和 Q 通道值测量负载变化。
* 配置合适的掉电时间以节省 RC663 读卡器IC 的功耗。*/
wStatus = phhalHw_Rc663_Cmd_Lpcd_SetConfig(pHal,PHHAL_HW_RC663_CMD_LPCD_MODE_DEFAULT、
bValueI、bValueQ、wPowerDownTimeMs、wDetectionTimeUs);
CHECK_STATUS(wStatus);
DEBUG_PRINTF("\nphhalHw_Rc663_Cmd_Lpcd_SetConfig.");
/* 读取版本寄存器,以区分 RC663 Old(RC66301、RC66302)和 RC663 Plus(RC66303)。*/
wStatus = phhalHw_Rc663_ReadRegister(pHal,PHHAL_HW_RC663_REG_VERSION,&bVersion);
DEBUG_PRINTF("\nphhalHw_Rc663_ReadRegister.");
CHECK_STATUS(wStatus);
如果 (bVersion == PHHAL_HW_CLRC663PLUS_VERSION)
    {
/* 配置充电泵,使其具有较高的检测范围。
* 启用电荷泵会在检测阶段增加功率级
* 探测范围。这导致平均电流消耗增加。*/
wStatus = phhalHw_SetConfig(pHal,PHHAL_HW_RC663_CONFIG_LPCD_CHARGEPUMP,PH_ON);
CHECK_STATUS(wStatus);
DEBUG_PRINTF("\nphhalHw_SetConfig.");
/* 配置数字滤波器会触发信号 RC663 Plus 算法以获得倍数的平均值
* 检测 I 值和 Q 值的变化。这反过来又延长了射频开启时间
* 增加平均电流消耗。*/
wStatus = phhalHw_SetConfig(pHal,PHHAL_HW_RC663_CONFIG_LPCD_FILTER、
((uint16_t)(bDigitalFilter)|wDetectionOption));
CHECK_STATUS(wStatus);
   }
 
/* 执行 LPCD 校准周期并获取 LPCD 参考 I 和 Q 值。*/
wStatus = phhalHw_Rc663_Cmd_Lpcd_GetConfig(pHal,&bValueI,&bValueQ);
DEBUG_PRINTF("\nphhalHw_Rc663_Cmd_Lpcd_GetConfig.");
CHECK_STATUS(wStatus);
 
*pdwLPCDRefValue = ((bValueI) | (bValueQ<< 0x8));
DEBUG_PRINTF("\npdwLPCDRefValue.");
 
DEBUG_PRINTF("\nLPCD 校准成功。");
 
返回 PH_ERR_SUCCESS;
} 然后我在主 while 循环中调用

/* ------------------------------------------------------------------
* 开机后运行一次 LPCD 校准
* ------------------------------------------------------------------ */
phStatus_t LPCD_Calibrate(void)
{
phStatus_t status;
uint32_t refVal;
char dbg_buf[64];

// 确保在校准前开启 RF
phhalHw_FieldOn(pHal);
phhalHw_Wait(pHal,PHHAL_HW_TIME_MILLISECONDS,5);

status = Calibrate_LPCD(LPCD_DEMO_MODE_DEFAULT,&refVal);

// 校准后关闭射频
phhalHw_FieldOff(pHal);

if (status == PH_ERR_SUCCESS)
{
gLpcdValueI = (uint8_t)(refVal& 0xFF);
gLpcdValueQ = (uint8_t)((refVal 0xFF)); gLpcdValueQ = (uint8_t)((refVal 0xFF)).>> & 0xFF);
gLpcdCalibrated = 1;

sprintf(dbg_buf,"LPCD Calibration OK (I=0x%02X, Q=0x%02X)\r\n",
gLpcdValueI, gLpcdValueQ);
DEBUG_UART2((unsigned char*)dbg_buf, strlen(dbg_buf));
}
else
{
DEBUG_UART2((unsigned char*)"LPCD Calibration FAILED\r\n", 28);
}

return status;
}

如果 (!lpcdCalibrated)
    {
如果 (LPCD_Calibrate() == PH_ERR_SUCCESS)
{
lpcdCalibrated = 1; // 标记为已完成
DEBUG_UART2((unsigned char*)"LPCD Calibration OK\r\n", 23);
 
 
     }
不然
{
DEBUG_UART2((unsigned char*)"LPCD Calibration FAILED\r\n", 28);
     }
   }
Re: clrc663 lpcd i and q value i getting 0x00

 

您好,先生,

非常感谢您与我们分享您的示意图。不过,我还是要问一下你们天线的史密斯图。我们确实有一份应用笔记,其中显示了使用廉价的纳米VNA进行这些测量的步骤。

Re: clrc663 lpcd i and q value i getting 0x00

我在这里附上我的硬件测试和原理图,在正常模式下,我得到的是 uid,这不是问题;在 lpcd 模式下,我得到的是 0x00,0x00 的 q 值。在此查看我的测试文件。

Re: clrc663 lpcd i and q value i getting 0x00

抱歉,但是对自定义板的支持非常有限。

 

要提供任何具体信息,我需要您的硬件,因为评估套件的天线设置配置与您的配置存在很大差异。

 

不过,您是否介意分享一下天线的史密斯图和原理图,这将是我们提供良好建议的一个很好的起点。

 

正如我在上一篇文章中提到的那样,我们建议从一开始就遵循一些步骤。其中之一是将我们的 EVK 与您的新天线和新的匹配电路一起使用。所有这些都显示在我们的许多文档中。请看 NFC天线设计|恩智浦半导体视频2。

 

发送 RF 开启命令后,I 和 Q 值应显示与 0x0 不同的值。

Fabian_R_0-1758670886630.png


Re: clrc663 lpcd i and q value i getting 0x00

我使用的是带有 stm32 硬件的定制 PCB Clrc663,只有在软件中天线调谐是正确的,我使用了 nfcrdlibEx6_rc663_LPCD_Demo.c 库中的校准演示代码,但 i 和 q 值均为 0x00,然后我使用错误寄存器来确定我在其中出现了什么错误。

printf debug i getting


=== EEPROM / LPCD 检查开始 ===
VERSION(0x7F)=0x1A
ERROR(before)=0x00
ERROR(after LOADREG)=0x80
> > > EEPROM 错误 (0x80) 仍然存在。LPCD 可能无法正确校准!
=== EEPROM / LPCD 检查完成 ===

// 这是代码


phStatus_t Rc663_EepromInitAndCalibrateLPCD(
phhalHw_Rc663_DataParams_t *pHal,
uint32_t *pdwLPCDRefValue)
{
phStatus_t status;
uint8_t bVersion, bIrq1, bErr;
uint8_t bValueI = 0, bValueQ = 0;
char dbg[64];
uint8_t eepromVal;
uint8_t addr;

sprintf(dbg,"\r\n=== EEPROM + LPCD Init ===\r\n");
DEBUG_UART2((uint8_t*)dbg, strlen(dbg));

/* 1.读取芯片版本 */
status = phhalHw_Rc663_ReadRegister(pHal, PHHAL_HW_RC663_REG_VERSION,&bVersion);
CHECK_STATUS(status);
sprintf(dbg,"VERSION(0x7F)=0x%02X\r\n", bVersion);
DEBUG_UART2((uint8_t*)dbg, strlen(dbg));

/* 2.清除任何现有错误 */
phhalHw_Rc663_ReadRegister(pHal, PHHAL_HW_RC663_REG_ERROR,&bErr);
sprintf(dbg,"ERROR(before)=0x%02X\r\n", bErr);
DEBUG_UART2((uint8_t*)dbg, strlen(dbg));

/* 3. 强制将 LOADREG 从 EEPROM 写入寄存器 */
status = phhalHw_Rc663_WriteRegister(pHal,
PHHAL_HW_RC663_REG_COMMAND,
PHHAL_HW_RC663_CMD_LOADREG);
CHECK_STATUS(status);

/* EEPROM 加载稍有延迟 */
phhalHw_Wait(pHal, PHHAL_HW_TIME_MILLISECONDS, 5);

/* 4.再次检查错误寄存器 */
phhalHw_Rc663_ReadRegister(pHal, PHHAL_HW_RC663_REG_ERROR,&bErr);
sprintf(dbg,"ERROR(after LOADREG)=0x%02X\r\n", bErr);
DEBUG_UART2((uint8_t*)dbg, strlen(dbg));

if (bErr& PHHAL_HW_RC663_BIT_EE_ERR)
{
sprintf(dbg,"> > > EEPROM 错误 (0x%02X) detected!\r\n" 、berR);
DEBUG_UART2 ((uint8_t*) dbg、strlen (dbg));

/*---EEPROM 转储(前 16 个字节用于调试)---*/

for (addr = 0;addr < 0x10;addr++)
{
phalHW_rc663_cmd_reade2 (phAL,addr,1,& eePromade2) val); spr
intf (dbg," EEPROM [0x%02X] = 0x%02X\ r\n ",addr,eepromVal);DEBUG_UART2 ((uint8_t*) dbg,strlen (dbg));} /*---绕过 EEPROM 继续手动初始化---*/




sprintf (dbg," 绕过 EEPROM,使用手动 RF 设置...\ r\n ");
DEBUG_UART2 ((uint8_t*) dbg、strlen (dbg));phhalHW_rc663_WriteRegister(phal,PHHAL_HW_RC663_RC663_REGISTER,PHAL_HW_RC663_RC663_RC663_);

phalHW_RC663_WriteRegister REG_TXAMP,0x1F);phhalHW_RC663_WriteRegister(phal,PHHAL_HW_RC663_REG_DRVCON,0x18);} else {sprintf(dbg," EEPROM LOADREG OK。





\ r\n ");
DEBUG_UART2 ((uint8_t*) dbg,strlen (dbg));} /* 5.


清除 IRQ 标志 */
phHALHW_RC663_WriteRegister(phal、PHHAL_HW_RC663_REG_IRQ0、0x7F);phalHW_RC663_WriteRegister(phal、PHHAL_HW_RC663_REG_IRQ1、0x7F);/* 6。


启用校准模式 */
phHALHW_RC663_WriteRegister (phAL、PHHAL_HW_RC663_REG_LPCD_OPTIONS、0x02);/* 7.

启动 LPCD_CALIBRATE(0x37 是隐藏的校准命令)*/ phhalHW_RC663_WriteRegister(
phal,PHHAL_HW_RC663_REG_COMMAND,0x37);/* 8。

等待 LPCDIRQ */
做 {phHalHW_rc663_readRegister (
phAL、PHHAL_HW_RC663_REG_IRQ1、& birQ1);} while (!
(birQ1 & PHHAL_HW_RC663_BIT_LPCDIRQ)); /* 9.

读取 I/Q 结果 */
phHALHW_RC663_readRegister(phal、PHHAL_HW_RC663_REG_LPCD_RESULT_I、& bValueI);phalHW_rc663_readRegister(phal、PHHAL_HW_RC663_REG_LPCD_RESULT_Q、& bValueQ);/* 10。


存储 */
*pdwLPCDRefValue = (uint32_t)bValueI | ((uint32_t)bValueQ<< 8);

sprintf(dbg,"[LPCD] 校准完成:I=0x%02X Q=0x%02X Ref=0x%08X\r\n",
bValueI, bValueQ, *pdwLPCDRefValue);
DEBUG_UART2((uint8_t*)dbg, strlen(dbg));

return PH_ERR_SUCCESS;
}

Re: clrc663 lpcd i and q value i getting 0x00

您好,先生,

为了校准 CLRC663 的 LPCD,我们强烈建议您使用NFC Cockpit。

这是一个图形用户界面工具,允许用户以图形方式对天线进行微调,同时进行LPCD 校准(第 4.5 节)。我们鼓励您使用这种方法,因为校准必须根据您自己的设计进行。没有任何手册可以按部就班地完成这一程序。

NFC Cockpit 允许用户在读写器卸载和加载时进行实时校准。

请探讨查看以下天线设计视频系列的第 4 段视频的可能性:NFC 天线设计 | 恩智浦半导体

Tags (1)
No ratings
Version history
Last update:
‎11-20-2025 11:43 PM
Updated by: