ST25R100 NFC Tag Read Problems
Hi everyone,
I’m trying to interface an ST25R100 NFC reader with my MCU, and I’m having trouble reading ISO15693 tags. My initialization seems to work, but I never get any response from the tag. I’m hoping someone can spot what I might be missing.
This is what my uart debugging spits out:
INIT - NFC
NFC: Init start (POR -> RESET -> POWER-DOWN -> Ready Mode)
ROP_REG_OPERATION = 0x00 (after PD write)
ROP_REG_GENERAL = 0x01 (after write)
ROP_REG_REGULATOR = 0x08 (after write)
NFC IRQ triggered!
IRQ: I_osc Oscillator ready
ROP_REG_OPERATION = 0x0A (after enable)
ROP_REG_OPERATION = 0x0A (check mode)
Chip is in READY mode (en = 1)
STATUS register = 0x00
NFC Reader Operation
ROP_REG_PROTOCOL = 0x85 (after write)
ROP_REG_OPERATION = 0x3A (after write)
NFC IRQ triggered!
IRQ: I_txe End of transmission
NFC IRQ triggered!
IRQ: I_nre No-response timer expired
This is consistent with what the datasheet says on page 22.
But now I don't quiet see how I can get it to read data from my NFC-Tag
void NFC_Init(void)
{
uint8_t status, val;
printf("\tNFC: Init start (POR -> RESET -> POWER-DOWN -> Ready Mode)\r\n");
/* 1. Hardware reset: enter reset mode (optional if POR occurred) */
HAL_GPIO_WritePin(NFC_RST_GPIO_Port, NFC_RST_Pin, GPIO_PIN_SET);
HAL_Delay(10); // hold RESET low 10 ms
/* 2. Release RESET pin */
HAL_GPIO_WritePin(NFC_RST_GPIO_Port, NFC_RST_Pin, GPIO_PIN_RESET);
HAL_Delay(2); // small delay for POR completion
/* 3. Ensure device is in Power-Down mode (en = 0), (wk = 0) */
NFC_WriteReg(ROP_REG_OPERATION, 0x00);
val = NFC_ReadReg(ROP_REG_OPERATION);
printf("\tROP_REG_OPERATION = 0x%02X (after PD write)\r\n", val);
HAL_Delay(2);
/* 4. Configure general register (safe in PD) */
NFC_WriteReg(ROP_REG_GENERAL, 0x01);
val = NFC_ReadReg(ROP_REG_GENERAL);
printf("\tROP_REG_GENERAL = 0x%02X (after write)\r\n", val);
/* 5. Configure regulators (recommended) */
NFC_WriteReg(ROP_REG_REGULATOR, 0b00001000); // 3.26V
val = NFC_ReadReg(ROP_REG_REGULATOR);
printf("\tROP_REG_REGULATOR = 0x%02X (after write)\r\n", val);
/* 6. Enable device: set en = 1 to transition to READY */
NFC_WriteReg(ROP_REG_OPERATION, 0b00001010);
val = NFC_ReadReg(ROP_REG_OPERATION);
HAL_Delay(5);
printf("\tROP_REG_OPERATION = 0x%02X (after enable)\r\n", val);
/* 7. Verify device is in the correct mode */
val = NFC_ReadReg(ROP_REG_OPERATION);
printf("\tROP_REG_OPERATION = 0x%02X (check mode)\r\n", val);
if ((val & 0x01) != 0)
{
printf("\tChip is in Wake up mode (wu_en = 1)\r\n");
}
else
{
printf("\tChip is in READY mode (en = 1)\r\n");
}
/* Optional: read STATUS register for additional info */
status = NFC_ReadReg(ROP_REG_STATUS);
printf("\tSTATUS register = 0x%02X\r\n", status);
//init in reader mode
configureReaderOperation();
//NFC_WakeUpConfigure();
}
void configureReaderOperation(void)
{
uint8_t val;
printf_yellow("\tNFC Reader Operation\r\n");
//1. Set protocol register: OM bits, TX rate, RX rate
NFC_WriteReg(ROP_REG_PROTOCOL, 0b10000101);
val = NFC_ReadReg(ROP_REG_PROTOCOL);
printf("\tROP_REG_PROTOCOL = 0x%02X (after write)\r\n", val);
// 2. Enable TX and RX in Operation register
NFC_WriteReg(ROP_REG_OPERATION, 0b00111010);
val = NFC_ReadReg(ROP_REG_OPERATION);
printf("\tROP_REG_OPERATION = 0x%02X (after write)\r\n", val);
HAL_Delay(10);
//Recommended preparation and execution of a transceiver operation:
// 1. Stop all activities
NFC_DirectCmd(0x62); // stop all
HAL_Delay(1);
// 2. Reset Rx gain
NFC_DirectCmd(0x66); // reset RX gain
HAL_Delay(1);
// 3. Configure timers
NFC_WriteReg(ROP_REG_MRT, 0x10);
NFC_WriteReg(ROP_REG_NRT1, 0x50);
// Define the length of data to be transmitted (ntx<12:0> and nbtx<2:0>)
// 6. Prepare FIFO for transmission
NFC_WriteReg(ROP_REG_TX_FRAME1, 0x26); // REQA command example
NFC_WriteReg(ROP_REG_TX_FRAME2, 0x00); // unused here
// set ntx = 7 bits, nbtx = 7 in relevant registers (datasheet Sec 5.10.1)
//NFC_WriteReg(0x1C, 0x01);
// 7. Send transmit command
NFC_DirectCmd(0x6A); // Transmit Data
//NFC_DirectCmd(0xE6); // MRT timer start
// Now wait for I_txe IRQ to know TX finished
// sq_en is enabled by default.
// agc_en is enabled by default.
}NFC-Tag:
- ISO 15693
- NfcV, Ndef technology
- 196 Bytes of data
Any help is greatly appreciated!


