ST意法半导体
直播中

吴湛

10年用户 860经验值
擅长:电源/新能源
私信 关注
[问答]

怎样在X-NUCLEO-NFC04A1板上正确地设置GPO中断呢

我在从评估板设置 GPO 中断时遇到问题。
我的应用是使用 I2C 将一些数据写入标签,然后从阅读器读取。为了避免冲突(当没有正在进行的 RF 操作时使用 I2C 写入 EEPROM)我正在尝试设置标签以启用 RF_ACtiVITY 中断,据我所知,应该将 GPO 引脚从 RF 命令拉低(from reader) SOF 到标签 EOF 的 RF 响应,然后返回 1。
现在,我正在使用一个代码:
1) 当前 I2C 密码,默认设置为 64 位零;
2)使用库中的函数将命令写入寄存器
3) 尝试使用其功能读取 GPO 引脚,当有 RF 命令时,该功能应返回零。我想,在这里,RF 命令甚至意味着来自阅读器的读取命令。我正在使用 X-NUCLEO-NFC03A1 及其演示代码和库,因此我认为读者始终处于阅读模式。
这是我的代码:
  • ST25DV_PASSWD password; //it is a struct MsbPasswd and LsbPasswd both with 32 bits each, total 64 bits of password
  •    password.MsbPasswd = 0;
  •    password.LsbPasswd = 0;
  •    Serial.print("DEBUG: I2C password (decimal value) is ");
  •    Serial.print(password.MsbPasswd);
  •    Serial.println(password.LsbPasswd);
  •    Serial.print("DEBUG: Size of total password is ");
  •    Serial.print(sizeof(password.MsbPasswd)+sizeof(password.LsbPasswd));
  •    Serial.println(" bytes");
  •    NFCTAG_StatusTypeDef NFC_tag_status = ST25DV_i2c_PresentI2CPassword(password);
  •    if (NFC_tag_status == 0)
  •    {
  •     Serial.println("DEBUG: Command to present I2C password sent successfully!");
  •    }
  •    else
  •    {
  •     Serial.print("DEBUG: Error while sending command to present I2C password. Error code is: ");
  •     Serial.println(NFC_tag_status);
  •    }
  • // Now trying to call the function to set the GPO register correctly, to enable GPO pin trigger on RF_ACTIVITY. The correct value for pinGPOConf should be hex = 0x02
  •    unsigned int pinGPOConf = 0x82;
  •    NFC_tag_status = ST25DV_i2c_ConfigureGPO(pinGPOConf);
  •    if (NFC_tag_status == 0)
  •    {
  •     Serial.println("DEBUG: Command to configure GPO Pin to RF_ACTIVITY sent successfully!");
  •    }
  •    else
  •    {
  •     Serial.print("DEBUG: Error while sending command to configure GPO Pin. Error code is: ");
  •     Serial.println(NFC_tag_status);
  •    }
  • void loop() {
  • // Try some functions to know the status of the GPO pin, which is already initialized by the X_Nucleo_Nfc04.begin() function at the beginning
  •     int statusGPO = X_Nucleo_Nfc04.ST25DV_GPO_ReadPin();
  •     if (statusGPO == 0) Serial.println("GPO set to zero!");
  • }
NFC_tag_status 始终返回零,因此显示 I2C 密码和配置 GPO 寄存器的命令都可以,事实上,对于 ST25 Android 应用程序,我可以看到使用此代码发送给它的正确值。
问题是,在循环函数中,GPO 引脚始终读取为 1,即使我将标签呈现给阅读器并从中读取也是如此。奇怪的是,我的一个朋友尝试用示波器连接到 GPO 引脚(使用 Arduino 引脚配置应该是数字 12,从那里引脚似乎总是为零!
此外,pinGPOConf,这是配置 GPO 寄存器的值,我尝试同时使用 0x02(它将 GPO 寄存器的 b1 设置为 1,其余位为零,b1 应该是指 RF_ACTIVITY 事件的那个),还有 0x82,即 b7=1 和 b1=1,其中 b7 是 GPO 寄存器的 GPO_Enable 位,根据数据表。正如所解释的,这两种配置都给出了相同的结果。
那么任何人都可以帮我找出问题所在吗?也许我误解了什么。


回帖(1)

马雁翔

2022-12-14 11:27:47
ST25DV-I2C NFC 标签有两个不同的版本:ST25DVxxK-JF 和 ST25DVxxK-IE。
-JF 版本是 12 针版本,-IE 是 8 针版本。主要区别是 -JF 12 针版本有一个 GPO 引脚,这是一个 CMOS 推挽版本,而 -IE 8 针版本有一个 GPO 引脚,它是一个漏极开路版本。
开漏输出必须上拉至 VCC 并且低电平有效。
CMOS 推挽版本为高电平有效,必须通过 VDCG 引脚(5V 至 1.8V)供电。
X-NUCLEO-NFC04A1 使用的是 ST25DV-I2C 的 -JF 12 引脚版本。因此,ST25DV-I2C 的 GPO 输出在 X-NUCLEO-NFC04A1 中为高电平有效。当 GPO 未激活时,此板上的 GPO 引脚为低电平。
还,
现在关于配置 GPO 使 RF_ACTIVITY 中断工作,您需要激活 GPO 配置字节中的两个位:


  • RF_ACTIVITY_EN 位 1 必须设置为 1 以启用 RF_ACTIVITY 中断
  • GPO_EN 位 7 必须设置为 1 以启用 GPO 输出引脚。

因此,值 0x82 必须写入 GPO 配置静态寄存器,位于 I2C 系统地址 0000h。
还有一条评论:RF_ACTIVITY 从 RF 请求 EOF(不是 SOF)到 RF 响应 EOF 是活跃的。
在捕获 GPO 引脚值的方式中,您可能会错过 GPO 处于活动状态的时刻(大约只有几毫秒)。大多数时候,GPO 并不活跃,因为阅读器不会持续发送 RF 命令。
您可以通过触发 GPO 引脚上升沿来检查示波器是否正常工作。您还可以检查 VDCG 引脚是否正确供电至至少 1.8V。
举报

更多回帖

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