BHI260AB firmware SHA hash mismatch

I am interfacing with the BHI260AB shuttle board over I2C using a Cortex M0 as the host MCU (Adafruit Feather M0 board). I use the 'load_firmware.c' example code provided with the BHY2 Sensor API to upload firmware to the external flash chip on the shuttle board. The firmware file I included in my code is the 'Bosch_SHUTTLE_BHI260_BMM150-flash.fw.h' file supplied with the BHY2 Sensor API. After uploading the firmware and booting the BHI260AB from flash, the Error Value register reports a 0x12 error ("SHA hash mismatch") and the Boot Status register activates the 'Flash Verify Error' bit.

I have made the following modifications to the example code:

  • Changed to I2C interface
  • Included custom functions for I2C read & write operations and a delay function
  • Removed lines relating to COINES
  • Replaced printf statements with appropriate printing statements for the Arduino framework
  • Included a check on the result of the bhy2_upload_firmware_to_flash_partly function to ensure that the firmware is being received
  • Decreased the size of the increment in the 'upload_firmware' function to 200, because the default 256 increment leads to a timeout error

I have also created an alternative firmware file using the BHI260 SDK, using the default configuration that comes with the SDK. At 1 point this firmware was uploaded correctly and after booting from flash a valid kernel version was reported, but at the next attempt with the exact same code and firmware it reported the SHA hash mismatch again.

I am suspecting that some bytes are getting lost in data transfer to the flash chip, but I have no clue what could cause that. Any possible clues are appreciated!

For reference, these are my I2C read and write functions:

int8_t user_i2c_read(uint8_t reg_addruint8_t *reg_datauint32_t lenvoid *ptr) {
    uint16_t ndone = 0;
    uint8_t nread;
    uint8_t stop = 0;

    Wire.beginTransmission(BHI_I2C_address);
    Wire.write(reg_addr);
    Wire.endTransmission();
    while (ndone < len) {
      nread = min(255,len-ndone);
      ndone += nread;
      if (ndone == len) {
        stop = 1;
      }
      Wire.requestFrom(BHI_I2C_address,nread,stop);
      for (uint8_t i = 0; i < nread; i++) {
        *reg_data = Wire.read();
        reg_data++;
      }
    }
    
    return 0;
}

int8_t user_i2c_write(uint8_t reg_addrconst uint8_t *reg_datauint32_t lenvoid *ptr) {
    Wire.beginTransmission(BHI_I2C_address);
    Wire.write(reg_addr);
    while (len--) {
      Wire.write(*reg_data);
      reg_data++;
    }
    
    Wire.endTransmission();
    
    return 0;
}
Best reply by mra

The problem has been solved. I obviously needed to use the level shifter board that came with the shuttle board, so I could simply power the level shifter board at 3V3. Somehow I assumed that the level shifter board was only needed to interface with the application board.

Uploading to the flash memory now works like a charm. Thanks again for your assistance, your replies have led me to the solution.

View original
5 replies
Resolved