Skip to main content
TDufo.1
Associate
July 15, 2020
Solved

Write in NFC01A1 memory by i2c protocol in Python

  • July 15, 2020
  • 3 replies
  • 1195 views

Hi, I work on the NFC01A1 and want to write in the M24SR with i2c protocol in python. My goal is to put a URI in, "abc.com" in this example. Here, I will put only the 3 important parts of the code, Erase Message Length, Write Message, Write Message Length :

# erase NDEF messgae length
 wait("erase NDEF message length")
 data = [0x03,0x00,0xD6,0x00,0x00,0x02,0x00,0x00]
 tag.write(data, crc=True)
 
 # write NDEF message 
 wait ("write NDEF message")
 data = [0x02,0x00,0xD6,0x00,0x02,0x0C,0xD1,0x01,0x07,0x55,0x03,0x61,0x62,0x63,0x2E,0x63,0x6F,0x6D]
 tag.write(data, crc=True)
 
 # write NDEF message length
 wait("write NDEF message length")
 data = [0x03,0x00,0xD6,0x00,0x00,0x02,0x00,0x08]
 tag.write(data, crc= True)

I can read it with the applcation ST25 NFC tap, I got this :

0693W000001sv5KQAQ.jpg

I think I can't open the page because of the two bytes "00 08" and I don't really now why they are here..

Do you have any solution for this problem ?

Thank you all !

    This topic has been closed for replies.
    Best answer by Olivier L

    Hi,

     # erase NDEF messgae length
     wait("erase NDEF message length")
     data = [0x03,0x00,0xD6,0x00,0x00,0x02,0x00,0x00]

    Did you send this command to write an Empty NDEF?

    The recommended empty NDEF is 0x00 0x03 0xD0 0x00 0x00.

    In your dump, I see the bytes 0x03 0x00 for the length and I’m wondering if you may have done an error with the endianess: NFC Forum specification uses the Big Endian standard so the first byte is the MSB. If the length is “3 bytes�? you should write 0x00 0x03.

    That’s a good thing that you do the NDEF programming in 3 steps. This is indeed what should be done. I’m sharing with you the Android log showing what is written in the tag when saving the URI “abc.com�?:

    - First we have a command to select the NDEF File (File Id = 0x0001):

    2020-07-15 14:06:26.262 10839-10883/com.st.st25nfc.dbg D/Type4Command: ==> Send SelectFile 0x0001 command: 00 a4 00 0c 02 00 01

    2020-07-15 14:06:26.268 10839-10883/com.st.st25nfc.dbg D/Type4Command: Response: 90 00

    - Then we write 0x00 0x00 in the NDEF Length:

    2020-07-15 14:06:26.268 10839-10883/com.st.st25nfc.dbg D/Type4Command: ==> Send updateBinary command: 00 d6 00 00 02 00 00

    2020-07-15 14:06:26.277 10839-10883/com.st.st25nfc.dbg D/Type4Command: Response: 90 00

    - Then we write the NDEF message:

    2020-07-15 14:06:26.278 10839-10883/com.st.st25nfc.dbg D/Type4Command: ==> Send updateBinary command: 00 d6 00 02 0c d1 01 08 55 01 61 62 63 2e 63 6f 6d

    2020-07-15 14:06:26.289 10839-10883/com.st.st25nfc.dbg D/Type4Command: Response: 90 00

    NB: We write from the offset 0x02 so, at this stage the length is still 0x00 0x00

    - Then we write the correct NDEF length:

    2020-07-15 14:06:26.290 10839-10883/com.st.st25nfc.dbg D/Type4Command: ==> Send updateBinary command: 00 d6 00 00 02 00 0c

    2020-07-15 14:06:26.299 10839-10883/com.st.st25nfc.dbg D/Type4Command: Response: 90 00

    Here is what we get in the memory at the end: 00 0c d1 01 08 55 01 61 62 63 2e 63 6f 6d

    I think that you can do the same from I2C.

    Concerning the dump shown on the last picture (the one starting with 0xD1), I have noticed that you miss the 2 bytes indicating the NDEF length.

    Best regards

    3 replies

    Olivier L
    Olivier LBest answer
    ST Employee
    July 15, 2020

    Hi,

     # erase NDEF messgae length
     wait("erase NDEF message length")
     data = [0x03,0x00,0xD6,0x00,0x00,0x02,0x00,0x00]

    Did you send this command to write an Empty NDEF?

    The recommended empty NDEF is 0x00 0x03 0xD0 0x00 0x00.

    In your dump, I see the bytes 0x03 0x00 for the length and I’m wondering if you may have done an error with the endianess: NFC Forum specification uses the Big Endian standard so the first byte is the MSB. If the length is “3 bytes�? you should write 0x00 0x03.

    That’s a good thing that you do the NDEF programming in 3 steps. This is indeed what should be done. I’m sharing with you the Android log showing what is written in the tag when saving the URI “abc.com�?:

    - First we have a command to select the NDEF File (File Id = 0x0001):

    2020-07-15 14:06:26.262 10839-10883/com.st.st25nfc.dbg D/Type4Command: ==> Send SelectFile 0x0001 command: 00 a4 00 0c 02 00 01

    2020-07-15 14:06:26.268 10839-10883/com.st.st25nfc.dbg D/Type4Command: Response: 90 00

    - Then we write 0x00 0x00 in the NDEF Length:

    2020-07-15 14:06:26.268 10839-10883/com.st.st25nfc.dbg D/Type4Command: ==> Send updateBinary command: 00 d6 00 00 02 00 00

    2020-07-15 14:06:26.277 10839-10883/com.st.st25nfc.dbg D/Type4Command: Response: 90 00

    - Then we write the NDEF message:

    2020-07-15 14:06:26.278 10839-10883/com.st.st25nfc.dbg D/Type4Command: ==> Send updateBinary command: 00 d6 00 02 0c d1 01 08 55 01 61 62 63 2e 63 6f 6d

    2020-07-15 14:06:26.289 10839-10883/com.st.st25nfc.dbg D/Type4Command: Response: 90 00

    NB: We write from the offset 0x02 so, at this stage the length is still 0x00 0x00

    - Then we write the correct NDEF length:

    2020-07-15 14:06:26.290 10839-10883/com.st.st25nfc.dbg D/Type4Command: ==> Send updateBinary command: 00 d6 00 00 02 00 0c

    2020-07-15 14:06:26.299 10839-10883/com.st.st25nfc.dbg D/Type4Command: Response: 90 00

    Here is what we get in the memory at the end: 00 0c d1 01 08 55 01 61 62 63 2e 63 6f 6d

    I think that you can do the same from I2C.

    Concerning the dump shown on the last picture (the one starting with 0xD1), I have noticed that you miss the 2 bytes indicating the NDEF length.

    Best regards

    TDufo.1
    TDufo.1Author
    Associate
    July 15, 2020

    Thank you for your quick reply,

    So, yes I use this code to write an empty NDEF to start. I will try with your recommendations and let you know what it changes.

    By reading your text, I got a fault on one byte of the code, the last byteof "Write the correct NDEF length. I wrote "0x08" instead of "0x0C" and now, all is functionning perfectly. The first two bytes are 00 0C.

    Best regards

    Olivier L
    ST Employee
    July 15, 2020

    Good! Your going into the right direction.

    Best regards