I need to use a burst write i2c function to write the dmp library for the MPU6050 gyroscope.
The current function that I've been using does not work for this case:
uint32_t nrf_drv_mpu_write_registers(uint8_t reg, uint8_t * p_data, uint32_t length)
{
// This burst write function is not optimal and needs improvement.
// The new SDK 11 TWI driver is not able to do two transmits without repeating the ADDRESS + Write bit byte
uint32_t err_code;
uint32_t timeout = MPU_TWI_TIMEOUT;
// Merging MPU register address and p_data into one buffer.
merge_register_and_data(twi_tx_buffer, reg, p_data, length);
// Setting up transfer
nrf_drv_twi_xfer_desc_t xfer_desc;
xfer_desc.address = MPU_ADDRESS;
xfer_desc.type = NRF_DRV_TWI_XFER_TX;
xfer_desc.primary_length = length + 1;
xfer_desc.p_primary_buf = twi_tx_buffer;
// Transferring
err_code = nrf_drv_twi_xfer(&m_twi_instance, &xfer_desc, 0);
while((!twi_tx_done) && --timeout);
if(!timeout) return NRF_ERROR_TIMEOUT;
twi_tx_done = false;
return err_code;
}
And, I've been researching on another solution:
/** Write multiple bytes to an 8-bit device register.
* @param devAddr I2C slave device address
* @param regAddr First register address to write to
* @param length Number of bytes to write
* @param data Buffer to copy new data from
* @return Status of operation (true = success)
*/
bool i2cdev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t* data) {
/*
if (NRF_SUCCESS!=nrf_drv_twi_tx(&m_twi,devAddr,®Addr,1,true))
return false;
return NRF_SUCCESS==nrf_drv_twi_tx(&m_twi,devAddr,data,length,false);
*/
//TODO: This could be improved...
uint8_t buffer[32];
buffer[0] = regAddr;
uint8_t i = 1;
while(i < (length + 1))
buffer[i++] = *data++;
return NRF_SUCCESS==nrf_drv_twi_tx(&m_twi,devAddr,buffer,length+1,false);
}
From this code, it writes to consecutive register addresses.
I'm curious if I can change the no_stop parameter to true to allow burst write to multiple bytes of data but single address.