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