嗨圣,
我们去年买了一个 ST25RU3993-HEPV 来评估 RFID 芯片,想用 SPI 控制它(见
那个问题,你已经帮助了我们)。主 SPI 是 Cortex A15。
我们设法设置 SPI
通信并实现 spiTxRx() 以读/写寄存器(单次和连续读/写)。
我们从ST25RU3993 STUHFL SDK包v3-0-2-0开始集成其他ST函数,特别是st25RU3993Ini
tialize函数。
在做任何事情之前,这个函数运行一个自检来检查三件事:
- 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);
- }