Porting Guide

This driver needs:

  • Bus read

  • Bus write

  • Delay microseconds

  • Bus handle (optional, depending on your platform)

function and struct pointers. You must define your own functions and pass their pointers to mpu925x_t struct before initialization.

Given slave address is 7 bit, so if your bus interface needs an 8 bit address, shift slave address to 1 bit left (e.g. address << 1).

Bus Read Function

Bus read functions’ prototype is like this:

uint8_t (*bus_read)(struct mpu925x_t *mpu925x, uint8_t slave_address, uint8_t reg, uint8_t *buffer, uint8_t size);

This function wants to read size byte amount of data from bus slave’s reg register which address is slave_address and stores it in buffer array.

Arduino I2C example:

uint8_t arduino_i2c_read(mpu925x_t *mpu925x, uint8_t slave_address, uint8_t reg, uint8_t *buffer, uint8_t size)
{
  Wire.begin();
  Wire.beginTransmission(slave_address);
  Wire.write(reg);
  Wire.endTransmission(false);
  Wire.requestFrom(slave_address, size);
  for (uint16_t i = 0; i < size; i++) {
        if (Wire.available()) {
          buffer[i] = (uint8_t)Wire.read();
        }
        else {
          return 1;
        }
  }
  return 0;
}

STM32 HAL I2C example:

uint8_t mpu925x_stm32_i2c_hal_read(mpu925x_t *mpu925x, uint8_t slave_address, uint8_t reg, uint8_t *buffer, uint8_t size)
{
        return HAL_I2C_Mem_Read(mpu925x->master_specific.bus_handle, slave_address << 1, reg, 1, buffer, size, HAL_MAX_DELAY);
}

mpu925x.master_specific.bus_read = mpu925x_stm32_i2c_hal_read;

Bus Write Function

Bus write function’s prototype is like this:

uint8_t (*bus_write)(struct mpu925x_t *mpu925x, uint8_t slave_address, uint8_t reg, uint8_t *buffer, uint8_t size);

This function wants to write size byte amount of data from buffer array to bus slave’s reg register which address is slave_address.

Arduino I2C example:

uint8_t arduino_i2c_write(mpu925x_t *mpu925x, uint8_t slave_address, uint8_t reg, uint8_t *buffer, uint8_t size)
{
  Wire.beginTransmission(slave_address);
  Wire.write(reg);
  for (uint16_t i = 0; i < size; i++) {
        Wire.write(buffer[i]);
  }
  Wire.endTransmission();
  return 0;
}

STM32 HAL I2C example:

uint8_t mpu925x_stm32_i2c_hal_write(mpu925x_t *mpu925x, uint8_t slave_address, uint8_t reg, uint8_t *buffer, uint8_t size)
{
        return HAL_I2C_Mem_Write(mpu925x->master_specific.bus_handle, slave_address << 1, reg, 1, buffer, size, HAL_MAX_DELAY);
}

mpu925x.master_specific.bus_write = mpu925x_stm32_i2c_hal_write;

Delay Microseconds Function

Delay microseconds functions prototype is like this:

void (*delay_ms)(struct mpu925x_t *mpu925x, uint32_t delay);

This functions wants to wait at least delay microseconds.

Arduino I2C example:

void arduino_delay_ms(mpu925x_t *mpu925x, uint32_t dly)
{
  delay(dly);
}

STM32 HAL example:

void mpu925x_stm32_hal_delay_ms(mpu925x_t *mpu925x, uint32_t delay)
{
        HAL_Delay(delay);
}

mpu925x.master_specific.delay_ms = mpu925x_stm32_hal_delay_ms;

Bus Handle Struct

Bus handle is for platform specific structs or other types of data. If your platform needs some other information for bus or delay functions, you can pass the pointer and use it in bus or delay functions via mpu925x.master_specific.bus_handle.

STM32 HAL example:

I2C_HandleTypeDef hi2c1;

mpu925x.master_specific.bus_handle = &hi2c1;