ST意法半导体
直播中

王婷

8年用户 1079经验值
私信 关注
[问答]

请问如何修复初始化自检中的“IRQ 线不工作”错误?

嗨圣,
我们去年买了一个 ST25RU3993-HEPV 来评估 RFID 芯片,想用 SPI 控制它(见那个问题,你已经帮助了我们)。主 SPI 是 Cortex A15。
我们设法设置 SPI 通信并实现 spiTxRx() 以读/写寄存器(单次和连续读/写)。

我们从ST25RU3993 STUHFL SDK包v3-0-2-0开始集成其他ST函数,特别是st25RU3993Initialize函数。
在做任何事情之前,这个函数运行一个自检来检查三件事:
  • SPI 通信工作(在调制器控制寄存器 1 寄存器中写入和读取 4 个字节)
  • 通过调用 st25RU3993ResetDoNotPreserveRegisters 检查 EN 引脚
    • 我们暂时没有将 EN 引脚连接到 GPIO,因此芯片始终处于启用状态。我用 Soft Init (83h) 单个命令替换了 EN 引脚的 OFF/ON。
  • 通过在 FIFO 寄存器中发送 24 个字节而不是宣布的 48 个字节,并等待超过 40 毫秒,在 ST25RU3993 端触发超时,检查 IRQ 线是否正常工作。
前两步没问题,但我们正在努力处理最后一步:Irq_fifo
(中断寄存器 1 的字节 5)不触发。
读取中断寄存器 2 (38h) 时,第 0 位(前同步码检测错误/FIFO 溢出错误)为高电平,FIFO 状态寄存器的第 5 位也为高电平(超过 24 个字节被加载到其中一个 FIFO)。

你能帮我们吗?

这是我们正在努力处理的 ST 代码的一部分:
  • // set up 48Byte transmission, but we supply less, therefore a fifo underflow IRQ is produced
  •         st25RU3993SingleWrite(spictx, ST25RU3993_REG_TXLENGTHUP, 0x03);
  •         st25RU3993SingleCommand(spictx, ST25RU3993_CMD_TRANSMCRC);
  •         st25RU3993ContinuousWrite(spictx, ST25RU3993_REG_FIFO, myBuf, 4);
  •         st25RU3993ContinuousWrite(spictx, ST25RU3993_REG_FIFO, myBuf, 4);
  •         st25RU3993ContinuousWrite(spictx, ST25RU3993_REG_FIFO, myBuf, 4);
  •         st25RU3993ContinuousWrite(spictx, ST25RU3993_REG_FIFO, myBuf, 4);
  •         st25RU3993ContinuousWrite(spictx, ST25RU3993_REG_FIFO, myBuf, 4);
  •         st25RU3993ContinuousWrite(spictx, ST25RU3993_REG_FIFO, myBuf, 4);
  •         st25RU3993WaitForResponse(spictx, RESP_FIFO);
  •         if (!(st25RU3993GetResponse(spictx) & RESP_FIFO)) {
  •                 dev_err(&spictx->spidev->dev, "%s(%d): IRQ line not workingn", __FUNCTION__, __LINE__);
  •                 return 3;
  •         }
这是我们对 st25RU3993ResetDoNotPreserveRegisters 的新实现:
  • void st25RU3993ResetDoNotPreserveRegisters(struct st25ru3993_spi_context *spictx)
  • {
  • #if ST25RU3993_ENABLE_CONTROL
  •         gpio_set_value(spictx->enable_gpio, LOW);
  •         delay_ms(1);
  •         gpio_set_value(spictx->enable_gpio, HIGH);
  •         delay_us(10);
  • #else
  •         st25RU3993SingleCommand(spictx, ST25RU3993_CMD_SOFT_INIT);
  • #endif
  •         st25RU3993WaitForStartup(spictx);
  • }



回帖(1)

张舒婷

2022-12-26 15:52:33
我们发现了问题!当向我的 Linux 内核驱动程序声明 IRQ 时,我将检测放在下降沿而不是上升沿!
举报

更多回帖

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