I2C Master Driver (Not Working)

The driver only handles when the device is used as an I2C master, because it’s unlikely the MCU is going to used as an I2C slave on the rocket. Functions for reading 8 and 16 bit registers are provided.

Assumptions in this revision

  • I2C Address(exclude R/W bits) are 7 bits

  • Only one I2C controller could be used

  • Register address are 8 bit wide.

I2C Controller Functions

void i2c_init(uint8_t freq_div)

Initialize I2C module and set up pins

Parameters
  • freq_div (uint8_t) – frequency divider, I2C Frequency = 100 kHz / freq_div

bool i2c_write_data(uint8_t i2c_addr, const uint8_t *data, uint8_t len)

Send data through I2C, this is usually used for sending register address and write data.

Parameters
  • i2c_addr (uint8_t) – I2C peripheral address, where addr[7:1] is the 7-bit address, and addr[0] is the RW bit

  • data (const uint8_t*) – data to be transmitted

  • len (uint8_t) – length of data to be transmitted in bytes, the I2C address byte is not included

Returns

success or not

Return values
  • true – success

  • false – failed

bool i2c_read_data(uint8_t i2c_addr, uint8_t reg_addr, uint8_t *data, uint8_t len)

Receive data through I2C, this is usually used for receiving read data.

Parameters
  • i2c_addr (uint8_t) – I2C peripheral address, where addr[7:1] is the 7-bit address, and addr[0] is the RW bit

  • reg_addr (uint8_t) – device register map address, max 8 bits wide

  • data (uint8_t*) – buffer for received data

  • len (uint8_t) – length of data to be received in bytes

Returns

success or not

Return values
  • true – success

  • false – failed

bool i2c_read_reg8(uint8_t i2c_addr, uint8_t reg_addr, uint8_t *value)

Read a byte-wide device register

Parameters
  • i2c_addr (uint8_t) – I2C peripheral address, where addr[7:1] is the 7-bit address, and addr[0] is the RW bit

  • reg_addr (uint8_t) – device register map address, max 8 bits wide

  • value (uint8_t*) – pointer to register value buffer

Returns

success or not

Return values
  • true – success

  • false – failed

bool i2c_read_reg16(uint8_t i2c_addr, uint8_t reg_addr, uint16_t *value)

Read a 2-byte device register

Parameters
  • i2c_addr (uint8_t) – I2C peripheral address, where addr[7:1] is the 7-bit address, and addr[0] is the RW bit

  • reg_addr (uint8_t) – device register map address, max 8 bits wide

  • value (uint16_t*) – pointer to register value buffer

Returns

success or not

Return values
  • true – success

  • false – failed

bool i2c_write_reg8(uint8_t i2c_addr, uint8_t reg_addr, uint8_t value)

Write a byte-wide device register

Parameters
  • i2c_addr (uint8_t) – I2C peripheral address, where addr[7:1] is the 7-bit address, and addr[0] is the RW bit

  • reg_addr (uint8_t) – device register map address, max 8 bits wide

  • value (uint8_t) – value to be written to the register

Returns

success or not

Return values
  • true – success

  • false – failed

bool i2c_write_reg16(uint8_t i2c_addr, uint8_t reg_addr, uint16_t value)

Write a 2-byte device register

Parameters
  • i2c_addr (uint8_t) – I2C peripheral address, where addr[7:1] is the 7-bit address, and addr[0] is the RW bit

  • reg_addr (uint8_t) – device register map address, max 8 bits wide

  • value (uint16_t) – value to be written to the register

Returns

success or not

Return values
  • true – success

  • false – failed