/* IP5306.cpp - Library for IP5306_I2C Power controller. Created by Sebastian Haap, December 3, 2019. Based on https://gist.github.com/me-no-dev/7702f08dd578de5efa47caf322250b57 */ #include "Wire.h" #include "IP5306.h" int ip5306_get_reg(uint8_t reg){ Wire.beginTransmission(0x75); Wire.write(reg); if(Wire.endTransmission(false) == 0 && Wire.requestFrom(0x75, 1)){ return Wire.read(); } return -1; } int ip5306_set_reg(uint8_t reg, uint8_t value){ Wire.beginTransmission(0x75); Wire.write(reg); Wire.write(value); if(Wire.endTransmission(true) == 0){ return 0; } return -1; } uint8_t ip5306_get_bits(uint8_t reg, uint8_t index, uint8_t bits){ int value = ip5306_get_reg(reg); if(value < 0){ //Serial.printf("ip5306_get_bits fail: 0x%02x\n", reg); return 0; } return (value >> index) & ((1 << bits)-1); } void ip5306_set_bits(uint8_t reg, uint8_t index, uint8_t bits, uint8_t value){ uint8_t mask = (1 << bits) - 1; int v = ip5306_get_reg(reg); if(v < 0){ //Serial.printf("ip5306_get_reg fail: 0x%02x\n", reg); return; } v &= ~(mask << index); v |= ((value & mask) << index); if(ip5306_set_reg(reg, v)){ //Serial.printf("ip5306_set_bits fail: 0x%02x\n", reg); } }