Skip to main content
LBier.1
Associate II
February 3, 2026
Solved

ST25DV64KC Memory Organization and I2C Read/Write Issue

  • February 3, 2026
  • 2 replies
  • 212 views

Hello,

I have an ST25DV64KC chip and I’m having a problem with I2C read/write. The I2C bus is running at 100 kHz and is functional (communication with another sensor, SHT, on the bus works fine). I am also able to communicate with this NFC chip - I can read registers and read the chip’s UID correctly.

The problem, however, is with reading/writing the user memory over I2C. When I try to write or read, I get NOK and the bus goes to low level and freezes. I have a main question:

Q1. How is the memory actually organized? I know that the user memory has a 7-bit address of 0x53 and the system memory has an address of 0x57. I expected that the UID, which in the datasheet is listed under the System Configuration area, would be available at I2C address 0x57, but in fact it seems to be part of the EEPROM, and the UID is accessible via the user memory at I2C 0x53.

So how does it actually work?? - if via I2C address 0x53 the System Configuration area is accessible at registers addresses 0x0000–0x0023 (datasheet page 18), and at the same time the User Memory (Table – “User memory as seen by RF and by I2C”) is also accessible at 7-bit address 0x53 in the range 0x0000–0x1FFF? That seems like a conflict!

Additionally, if anyone can provide a correct code example for reading/writing, it would be appreciated. The chip is in default configuration, without any initialization. I only verified that write protection is not enabled: the I2CSS register at address 0x000B returns 0x00. I want to write a few bytes to a chosen address (starting from the beginning of the EEPROM - I am using address 0x0000, but I simply want to write to the beginning of the memory that I can see in the ST25 mobile app, where the memory is also displayed starting at address 0x0000.), but as I wrote the communication fails when sending the first data byte (NOK, and the bus goes low)…

Thanks for your help and explanation.

This topic has been closed for replies.
Best answer by JL. Lebon

Hello, 

The ST25DV64KC is seen as two different I2C memories from I2C perspective.

The first one is the system memory. The I2C device select address to access the system memory is 0x57 in 7bits, 0xAE/0xAF in 8bits. If you look at table 89 in the datasheet, you can see that what is defining the system memory device select address are the E2 and E1 bits, that must be set both to 1, which make the value of 0x57 if E0=1.

The second one is the user memory. The I2C device select address to access the user memory is 0x53 in 7bits, 0xA6/0xA7 in 8bits. If you look at table 89 in the datasheet, you can see that what is defining the user memory device select address are the E2 and E1 bits, that must be set to 0 and 1 respectively, which make the value of 0x53 if E0=1.

If you want to read the UID, you must select the system memory and send a device select 0x57 and memory address 0x0018 to 0x001F.
If you select the user memory, with device select 0x53, you cannot read the UID since it is in the other memory.

Hope this is more clear.

Best regards

2 replies

TDK
Super User
February 3, 2026

Here is example code for reading this chip:

Solved: I2C read/write sample C program for ST25DV. - STMicroelectronics Community

 

You don't mention what you're using to talk with it.

"If you feel a post has answered your question, please click ""Accept as Solution""."
Ulysses HERNIOSUS
Technical Moderator
February 3, 2026

Hi,

the mentioned thread is rather old and links to code STSW-ST25DV001 for the ST25DV64K(non-C) - an older chip not fully compatible with your ST25DV64KC.

Better to look at the product page and select one of the various available demos:

https://www.st.com/en/nfc/st25dv64kc.html#tools-software

Likely  could be a fit for you.

Best Regards, Ulysses

JL. Lebon
JL. LebonBest answer
ST Employee
February 3, 2026

Hello, 

The ST25DV64KC is seen as two different I2C memories from I2C perspective.

The first one is the system memory. The I2C device select address to access the system memory is 0x57 in 7bits, 0xAE/0xAF in 8bits. If you look at table 89 in the datasheet, you can see that what is defining the system memory device select address are the E2 and E1 bits, that must be set both to 1, which make the value of 0x57 if E0=1.

The second one is the user memory. The I2C device select address to access the user memory is 0x53 in 7bits, 0xA6/0xA7 in 8bits. If you look at table 89 in the datasheet, you can see that what is defining the user memory device select address are the E2 and E1 bits, that must be set to 0 and 1 respectively, which make the value of 0x53 if E0=1.

If you want to read the UID, you must select the system memory and send a device select 0x57 and memory address 0x0018 to 0x001F.
If you select the user memory, with device select 0x53, you cannot read the UID since it is in the other memory.

Hope this is more clear.

Best regards

LBier.1
LBier.1Author
Associate II
February 3, 2026

Thank you for your help. It was entirely my fault — actually a double mistake. First, I had swapped the addresses 0x57 and 0x53, and then I discovered a bug in the way the I2C bus was handled. Thanks again for your help!