51 lines
1.3 KiB
C++
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);
|
|
}
|
|
}
|