This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

RX/TX returns old or incorrect data from BNO085 with SHTP

void twi_init (void) {
    ret_code_t err_code;

    const nrfx_twim_config_t twi_bno085_config = {
       .scl                = ARDUINO_SCL_PIN,
       .sda                = ARDUINO_SDA_PIN,
       .frequency          = NRF_TWIM_FREQ_100K,
       .interrupt_priority = APP_IRQ_PRIORITY_HIGH,
       .hold_bus_uninit    = false,
    };

    err_code = nrfx_twim_init(&m_twi, &twi_bno085_config, NULL, NULL);
    APP_ERROR_CHECK(err_code);

    nrfx_twim_enable(&m_twi);
}

static struct {
  uint16_t length;
  uint8_t channel;
  uint8_t sequence_number;
  uint8_t data[512];
} bno085_shtp_packet;

bool twi_read_dma(int address, uint8_t *dst, int length) {
  if(length < 4) {
    NRF_LOG_ERROR("tried to read less than 4 bytes in twi_read_dma (%i)", length);
    return false;
  }

  ret_code_t err_code = nrfx_twim_rx(&m_twi, address, dst, length);

  if(err_code != NRFX_SUCCESS) {
    NRF_LOG_ERROR("read error is: %s", nrf_strerror_get(err_code));
  }
  return err_code == NRFX_SUCCESS;
}

bool twi_write_dma(int address, uint8_t *src, int length) {
  if(length < 4) {
    NRF_LOG_ERROR("tried to write less than 4 bytes in twi_write_dma (%i)", length);
    return false;
  }
  
  ret_code_t err_code = nrfx_twim_tx(&m_twi, address, src, length, false);

  if(err_code != NRFX_SUCCESS) {
    NRF_LOG_ERROR("write error is: %s", nrf_strerror_get(err_code));
  }
  return err_code == NRFX_SUCCESS;
}

#define BNO085_READ(X, N) twi_read_dma(BNO085_ADDR, (X), (N))
#define BNO085_WRITE(X, N) twi_write_dma(BNO085_ADDR, (X), (N))

I'm using the same buffer for read and write, eg.

BNO085_READ((void *)&bno085_shtp_packet, 4)
BNO085_WRITE((void *)&bno085_shtp_packet, length + 4)

Sometimes receive buffer length is zero, sometimes receive is the same as write which means that it didn't correctly transmit. Sometimes it receives a packet which exceeds maximum size.

I'm in the process of switching from a SAM4 to an nRF, and the only thing I've changed is the read/write implementation, so there shouldn't be a problem with the rest of the code.

Has anyone ever gotten it to work with a BNO085 or maybe BNO080?

TWI0_ENABLED 1
TWI0_USE_EASY_DMA 1
Related