#include "ayn_sc8721.h" SC8721::SC8721(unsigned char pin_sda, unsigned char pin_scl, unsigned char pin_ce) { _pin_sda = pin_sda; _pin_scl = pin_scl; _pin_ce = pin_ce; // 配置I2C通信引脚 Wire.begin(_pin_sda, _pin_scl); // 设置芯片使能引脚 pinMode(_pin_ce, OUTPUT); digitalWrite(_pin_ce, LOW); } void SC8721::chipStanby(bool enable) { digitalWrite(_pin_ce, HIGH); Wire.beginTransmission(i2c_address); Wire.write(REG_GLOBAL_CTRL); if (enable) Wire.write(0x04); else Wire.write(0x00); Wire.endTransmission(); } void SC8721::chipShutdown(bool ce_signal) { digitalWrite(_pin_ce, ce_signal); } bool SC8721::setOutputCurrentLimitRegister(float iout_ilim) { int cso_set = 0; // 对输入值进行判断 if (iout_ilim > max_iout_ilim) return 0; else { cso_set = ((iout_ilim * Rs * Rcso) / 8) - 1; Wire.beginTransmission(i2c_address); Wire.write(REG_CSO); Wire.write(cso_set); Wire.endTransmission(); } return cso_set; } void SC8721::setCableDropCompensation(unsigned char level) { Wire.beginTransmission(i2c_address); Wire.write(REG_SLOPE_COMP); Wire.write(level); Wire.endTransmission(); } void SC8721::setOutputVoltageRegister(float voltage) { unsigned int voltage_mv = voltage * 1000; unsigned int offset_div20 = 0; bool fb_dir = 0; // 判断偏移增量方向 datasheet8.3.2 // offset = | VOUT ± VOUT_REF(5v) | // = (REG_VOUT_SET_MSB*4 + REG_VOUT_SET<1:0>) * 20 if (voltage_mv >= 5000) { fb_dir = 0; offset_div20 = (voltage_mv - 5000) / 20; } else { fb_dir = 1; offset_div20 = (5000 - voltage_mv) / 20; } //写入VOUT_SET_MSB Register Wire.beginTransmission(i2c_address); Wire.write(REG_VOUT_SET_MSB); Wire.write(offset_div20 >> 2); Wire.endTransmission(); Wire.beginTransmission(i2c_address); Wire.write(REG_VOUT_SET); //判断增量方向决定写入VOUT_SET Registe内容 if (!fb_dir) { Wire.write((offset_div20 & 0x03) | 0x18); } else { Wire.write((offset_div20 & 0x03) | 0x1C); } Wire.endTransmission(); } void SC8721::loadSettingRegister() { Wire.beginTransmission(i2c_address); Wire.write(REG_GLOBAL_CTRL); Wire.write(0x02); Wire.endTransmission(); } void SC8721::setSwitchFreq(unsigned char level) { Wire.beginTransmission(i2c_address); Wire.write(REG_FREQ_SET); Wire.write(level); Wire.endTransmission(); } void SC8721::outputVoltage(float voltage) { setOutputVoltageRegister(voltage); loadSettingRegister(); } void SC8721::outputCurrentLimit(float iout_ilim) { setOutputCurrentLimitRegister(iout_ilim); loadSettingRegister(); }