Skip to main content
Visitor II
June 13, 2017
Question

Bootloader read memory command fails

  • June 13, 2017
  • 3 replies
  • 2067 views
Posted on June 13, 2017 at 09:14

I'm using an STM32F103 and flashing a code into it using the bootloader. I'm successful in writing the code into the MCU, but when I try reading it using the Read Memory command (pg13) [

http://www.st.com/content/ccc/resource/technical/document/application_note/51/5f/03/1e/bd/9b/45/be/CD00264342.pdf/files/CD00264342.pdf/jcr:content/translations/en.CD00264342.pdf

] it fails at step 6 (Send the number of bytes to be read (1 byte) & a checksum (1 byte).)  I receive a NACK. It's confusing here, so I tried sending both XOR of 8th byte with 0 and in the next try tried sending complement of 8th byte, both failed.

Here's what I'm doing:

1. Read 128 byte of the file to be written from SD card 

2. Write this 128 bytes into the STM32 flash (code space) through the boot loader //works perfectly fine

3. Read back the recently written 128 bytes to verify if the write was successful.

4. If data written == read, move on. Write the next set of data. 

5. Loop till the whole file has been written.

6. Send GO command and reset the STM.

P.S. I know the write command is working because previously I only had the write command, and it was working in the field. But some devices were flashed with the wrong/ corrupted code. So I'm reading back and checking if the data were written is the right one.

#stm32 #boot-loader
    This topic has been closed for replies.

    3 replies

    Visitor II
    January 24, 2024

    @Clament John wrote:
    Posted on June 13, 2017 at 09:14

    ... but when I try reading it using the Read Memory command it fails at step 6 (Send the number of bytes to be read (1 byte) & a checksum (1 byte).)  I receive a NACK. It's confusing here, so I tried sending both XOR of 8th byte with 0 and in the next try tried sending complement of 8th byte, both failed ...

     

    #stm32 #boot-loader

    Hi, 

    it is an old issue but I had the same problem. I think there is specification failure. Try to add +1 to calculate the check sum for the amount of data you want to receive. This solves the problem for me.

    example you want to get 128 bytes:  0x7F (data), 0x7F (checksum) => NACK 
    correct: 0x7F (data), 0x80 (checksum) => OK 

    Graduate II
    January 24, 2024

    I'm not convinced.

    Show an actual transactional example. I don't recall having issues with the AN3155 protocol docs and F1 parts, but the docs have likely been reworked a few times in the last 15+ years 

    Visitor II
    January 25, 2024

    What should I say. The current specification AN3155 doesn't work with a STMF103C8 for the Read Memory Command. It takes me one day to find a solution for this error.

    AN3155AN3155

    If you take Byte 8 (127) and make a XOR of Byte 8 (127) for Byte 9, you will get a NACK.
    If you take Byte 8 (127) and make a XOR of Byte 8 +1 (128) for Byte 9, you will get an OK.

    I found this solution by sniffing the communication of the old program "Flash Loader Demo".
    But this is only for the Read Memory Command and there only for Byte 9!

    Explorer II
    February 27, 2024

    I think I have figured this out as I was having the same issue.  The key is the wording in AN3155:

    "Checksum: XOR byte 8 (complement of byte 8)"

     

    It actually means that the second byte is the complement of the first byte.  In C, this would be the ~ operator.  This is the same as the command byte.

     

    Example 1:

    Byte 0 = 0x01 (Read 2 bytes)

    Byte 1 = 0xFE

     

    Example 2:

    Byte 0 = 0x7F (Read 128 byte)

    Byte 1 = 0x80