/****************************************************************************** * 2016 ideasX (Tyler Berezowsky) * * FileName: MAX17043.h * * Description: i2c driver for MAX17042 gas gauge IC * Needs to implement code to resent/re-request data based on * ack. or nack. * * Modification history: * 2016/3/15, v1.0 created this file *******************************************************************************/ #include "ets_sys.h" #include "hal/max17043.h" #include "osapi.h" #include "driver/i2c_master.h" /****************************************************************************** * FunctionName : max17042_get_voltage() * Description : get 12-bit ADC voltage value from gas gauge IC VCELL FORMAT (MSB first) [d|d|d|d|d|d|d|d] [d|d|d|d|0|0|0|0] d = vaild data 0 = nothing resolution = 1.25mV NOTE: 500ms after POR or sleep for vaild value * Parameters : NONE * Returns : uint16_t, 0 if failed *******************************************************************************/ uint16_t ICACHE_FLASH_ATTR max17043_getVoltage(void) { max17043_i2c_init(); uint16_t voltage; //i2c_master_init(); i2c_master_start(); i2c_master_writeByte(WRITE_ADDRESS); if (!i2c_master_checkAck()) { i2c_master_stop(); return 0; } i2c_master_writeByte(VCELL_H); if (!i2c_master_checkAck()) { i2c_master_stop(); return 0; } i2c_master_start(); i2c_master_writeByte(READ_ADDRESS); if (!i2c_master_checkAck()) { i2c_master_stop(); return 0; } voltage = (i2c_master_readByte() << 4); i2c_master_send_ack(); voltage |= (i2c_master_readByte() >> 4); i2c_master_send_nack(); i2c_master_stop(); #if MAX17043_DEBUG os_printf("Voltage: %d\r\n", voltage); #endif return voltage; } /****************************************************************************** * FunctionName : max17042_getSOC * Description : get 16-bit SOC value from gas gauge IC SOC FORMAT [2^7|2^6|2^5|2^4|...|2^0][2^-1|2^-2|...|2^-8] Resolution 1.0% * Parameters : NONE * Returns : uint16_t, 0 if failed *******************************************************************************/ uint16_t ICACHE_FLASH_ATTR max17043_getSOC(void) { max17043_i2c_init(); uint16_t soc; i2c_master_start(); // sent srt. cond. i2c_master_writeByte(WRITE_ADDRESS); // send w. addr. if (!i2c_master_checkAck()) { i2c_master_stop(); return 0; } i2c_master_writeByte(SOC_H); // sent reg. addr. to be read if (!i2c_master_checkAck()) { i2c_master_stop(); return 0; } i2c_master_start(); i2c_master_writeByte(READ_ADDRESS); // send r. addr. if (!i2c_master_checkAck()) { i2c_master_stop(); return 0; } soc = (i2c_master_readByte()<<8); // read VCELL_H into voltage i2c_master_send_ack(); // sent ack. soc |= i2c_master_readByte(); // read VCELL_L into voltage i2c_master_send_nack(); // send nack. i2c_master_stop(); // send stop cond. #if MAX17043_DEBUG os_printf("SOC: %d\r\n", soc); #endif return soc; } /****************************************************************************** * FunctionName : max17042_sleep * Description : sets gas gauge IC to sleep * Parameters : uint8_t enable, true: set to sleep, false: wake from sleep * Returns : Success 1, Fail 0 *******************************************************************************/ bool ICACHE_FLASH_ATTR max17043_sleep(uint8_t enable) { max17043_i2c_init(); i2c_master_start(); i2c_master_writeByte(WRITE_ADDRESS); if (!i2c_master_checkAck()) { i2c_master_stop(); return 0; } i2c_master_writeByte(CONFIG_L); if (!i2c_master_checkAck()) { i2c_master_stop(); return 0; } if (enable) { i2c_master_writeByte(0x80); } else { i2c_master_writeByte(0x00); } if (!i2c_master_checkAck()) { i2c_master_stop(); return 0; } i2c_master_stop(); return 1; } /****************************************************************************** * FunctionName : max17042_quick_start * Description : soft reset gas guage IC to fix battery calculation * Parameters : NONE * Returns : Success 1, Failed o *******************************************************************************/ bool ICACHE_FLASH_ATTR max17043_quickStart(void) { i2c_master_start(); i2c_master_writeByte(WRITE_ADDRESS); if (!i2c_master_checkAck()) { i2c_master_stop(); return 0; } i2c_master_writeByte(MODE_H); if (!i2c_master_checkAck()) { i2c_master_stop(); return 0; } i2c_master_writeByte(0x40); if (!i2c_master_checkAck()){ i2c_master_stop(); } i2c_master_writeByte(0x00); if (!i2c_master_checkAck()) { i2c_master_stop(); return 0; } i2c_master_stop(); return 1; }