// // Created by MightyPork on 2018/01/02. // // I2C master unit // #ifndef GEX_F072_UNIT_I2C_H #define GEX_F072_UNIT_I2C_H #include "unit.h" extern const UnitDriver UNIT_I2C; // Unit-to-Unit API /** * Raw write to I2C * * @param unit - I2C unit * @param addr - device address (set highest bit if address is 10-bit) * @param bytes - bytes to write * @param bcount - byte count * @return success */ error_t UU_I2C_Write(Unit *unit, uint16_t addr, const uint8_t *bytes, uint32_t bcount); /** * Raw read from I2C * * @param unit - I2C unit * @param addr - device address (set highest bit if address is 10-bit) * @param dest - buffer for read bytes * @param bcount - byte count * @return success */ error_t UU_I2C_Read(Unit *unit, uint16_t addr, uint8_t *dest, uint32_t bcount); /** * Read one or more registers from a I2C register-based device with auto-increment. * * @param unit - I2C unit * @param addr - device address (set highest bit if address is 10-bit) * @param regnum - first register number * @param dest - destination buffer * @param width - register width (or multiple consecutive registers total size) * @return success */ error_t UU_I2C_ReadReg(Unit *unit, uint16_t addr, uint8_t regnum, uint8_t *dest, uint32_t width); /** * Write a register value * * @param unit - I2C unit * @param addr - device address (set highest bit if address is 10-bit) * @param regnum - register number * @param bytes - register bytes (use &byte) if just one * @param width - register width (number of bytes) * @return success */ error_t UU_I2C_WriteReg(Unit *unit, uint16_t addr, uint8_t regnum, const uint8_t *bytes, uint32_t width); /** * Write a 8-bit register value * * @param unit - I2C unit * @param addr - device address (set highest bit if address is 10-bit) * @param regnum - register number * @param value - byte to write to the register * @return success */ static inline error_t UU_I2C_WriteReg8(Unit *unit, uint16_t addr, uint8_t regnum, uint8_t value) { return UU_I2C_WriteReg(unit, addr, regnum, &value, 1); } #endif //GEX_F072_UNIT_I2C_H