Files
AQS-FW/lib/IP5306/IP5306.cpp

51 lines
1.3 KiB
C++

/*
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);
}
}