code to access the AT30TSE75x temperature and E-prom device

Dependents:   AT30TSE752TST AT30TSE752TST2

AT30TSE75x.cpp

Committer:
wbeaumont
Date:
2017-01-17
Revision:
1:c0db18a0c56b
Parent:
0:7cb648bc5c2a
Child:
2:91836ad02096

File content as of revision 1:c0db18a0c56b:

#include "mbed.h"
#include "AT30TSE75x.h" 

/*
 *  info see  AT30SE75x.h 
 * (C) Wim Beaumont Universiteit Antwerpen 2017

 *   some parts of the code are copied 
 *   from https://developer.mbed.org/users/akhilpanayam/code/AT30TSE75X/file/0e430cef393b/AT30TSE75X.h
*/


#define VERSION_AT30TSE75x_SRC  "0.86"  

#define AT30TSE75X_ADD_TEMP    0x48 /*Temperature Sensor: 0b1001xxx */
#define AT30TSE75X_ADD_EEPROM  0x50 /*EEPROM: 0b1010xxx */
#define AT30TSE75X_FIX_EEPROM  0x62 /*fix EEPROM  0b01100010  ( last 0 = W) */
#define AT30TSE752                      1
#define AT30TSE754                      2
#define AT30TSE758                      3

#define AT30TSE_CONFIG_RES_9_bit    0
#define AT30TSE_CONFIG_RES_10_bit   1
#define AT30TSE_CONFIG_RES_11_bit   2
#define AT30TSE_CONFIG_RES_12_bit   3


#define AT30TSE_TEMPERATURE_REG_SIZE    2


#define TReg 0x0  // 16 bits 
#define ConfigReg 0x1  // 16 bits 
#define TLowReg 0x2  // 16 bits 
#define THighReg 0x3  // 16 bits 
#define ConfigRegNV 0x11 // 16 bits 
#define TLowRegNV 0x12  // 16 bits 
#define THighRegNV 0x13  // 16 bits 

AT30TSE75x::AT30TSE75x (I2CInterface* i2cinterface,  int device_address_bits,int eepromsize):
    getVersion( VERSION_AT30TSE75x_HDR,VERSION_AT30TSE75x_SRC, __TIME__, __DATE__),_i2c(i2cinterface) {
    Taddr= ((device_address_bits & 0x7) |  AT30TSE75X_ADD_TEMP ) & 0x7F; Taddr=Taddr<<1;    
    Eaddr= ((device_address_bits & 0x7) |  AT30TSE75X_ADD_EEPROM ) & 0x7F;  Eaddr=Eaddr<<1;
    
    Esize=1;
    if( eepromsize ==4 ) Esize=2; if( eepromsize ==8) Esize=3; 
    resolution=AT30TSE_CONFIG_RES_12_bit;
}   




float AT30TSE75x::get_temperature(int *error) {
   
    
    float temperature;
    uint16_t data;
    int locerr=-200;
    buffer[0] = 0;
    buffer[1] = 0;
    
    locerr=_i2c->read(Taddr,(char *)buffer,AT30TSE_TEMPERATURE_REG_SIZE,false);
    if ( error )   *error=locerr;  // pointer !=0 
 
    data = (buffer[0] << 8) | buffer[1];
    int8_t sign = 1;
 
    /* Check if negative and clear sign bit. */
    if (data & (1 << 15)) {
        sign *= -1;
        data &= ~(1 << 15);
    }
 
    /* Convert to temperature. */
    switch (resolution) {
    case AT30TSE_CONFIG_RES_9_bit:
        data = (data >> 7);
        (temperature) = data * sign * 0.5;
        break;
 
    case AT30TSE_CONFIG_RES_10_bit:
        data = (data >> 6);
        (temperature) = data * sign * 0.25;
        break;
 
    case AT30TSE_CONFIG_RES_11_bit:
        data = (data >> 5);
        (temperature) = data * sign * 0.125;
        break;
 
    case AT30TSE_CONFIG_RES_12_bit:
        data = (data >> 4);
        (temperature) = data * sign * 0.0625;
        break;
 
    default:
        break;
    }
    return temperature;
}     


int AT30TSE75x::read_config( int Nonvolatille,int *error ) {
    uint16_t data;
    int locerr;
    buffer[0]=  ConfigReg; // set pointer to config reg nv 
     locerr=_i2c->write(Taddr,(char *)buffer,1,false);
     locerr= locerr<<2;
    locerr|=_i2c->read(Taddr,(char *)buffer,AT30TSE_TEMPERATURE_REG_SIZE,false);
     locerr= locerr<<2;
    data = (buffer[0] << 8) | buffer[1];
    buffer[0]=  TReg;
    locerr|=_i2c->write(Taddr,(char *)buffer,1,false);
    if ( error )   *error=locerr;  // pointer !=0 
    return (int)data;
}    


int AT30TSE75x::set_config( int Nonvolatille ) {
    int locerr;
    buffer[0]=  ConfigReg; // set pointer to config reg nv 
   
      
    
    /*  for no all fixed values 
        15 normal : 1      0b1xxx xxxx xxxx xxxx
        14:13  12 bit :11  0b111x xxxx xxxx xxxx
        12:11  1 fault:00  0b1110 0xxx xxxx xxxx
        10     0 act low   0b1110 00xx xxxx xxxx
        9      0 cmp mode  0b1110 000x xxxx xxxx
        8      0 temp act  0b1110 0000 xxxx xxxx
        7:1      dont care 0b1110 0000 0000 000x
        0        read only 0b1110 0000 0000 0000 
        =>  0xE0 
    */
    buffer[1]=0xE0; buffer[2]=0x00;
    locerr=_i2c->write(Taddr,(char *)buffer,3,false);
    buffer[0]=  TReg;
     locerr= locerr<<2;
    locerr|=_i2c->write(Taddr,(char *)buffer,1,false); // make sure temp read reg is active again 
    return locerr;
}
    
   
    

int AT30TSE75x::read_eeprompage(char *data, uint8_t length, uint8_t word_addr, uint8_t page) {  
    char buff[20];
    buff[0]  = (word_addr & 0x0F) | ((0x0F & page) << 4);
        
    _i2c->write(Eaddr,buff,1,false);
    return _i2c->read(Eaddr,data,length,false);  
}
 
int AT30TSE75x::write_eeprompage(char *data, uint8_t length, uint8_t word_addr, uint8_t page)
{   
    char buff[length+1];
    int buffsizep1=length+1;//buffersize+1
    buff[0] = (word_addr & 0x0F) | ((0x0F & page) << 4);
    for(int i = 1; i < buffsizep1; i++)  {
        buff[i] = *(data++);
    }
    return  _i2c->write(Eaddr,buff,(length + 1),false);
}


int AT30TSE75x::read_eeprombyte(char &data, uint8_t word_addr, uint8_t page){
   char rbuf[2];
   int i2cresult=read_eeprompage(rbuf,1,word_addr,page);
   data=rbuf[0];
   return i2cresult;
}   


int AT30TSE75x::write_eeprombyte(char data,  uint8_t word_addr, uint8_t page){
    char wbuf[2];  wbuf[0]=data;
    return write_eeprompage(wbuf,1,word_addr,page);
    }
    
int AT30TSE75x::protect_eeprom(void) {
       char wbuf[2];  wbuf[0]=0;wbuf[1]=0; // don't care 
     return   _i2c->write(AT30TSE75X_FIX_EEPROM ,wbuf,2,false);
}

int AT30TSE75x::unprotect_eeprom(void) {
       char wbuf[2];  wbuf[0]=0;wbuf[1]=0; // don't care 
      return _i2c->write((0x4 | AT30TSE75X_FIX_EEPROM) ,wbuf,2,false);
}

int AT30TSE75x::get_eeprom_protec(void){
    char wbuf[2]; 
    return _i2c->read(AT30TSE75X_FIX_EEPROM ,wbuf,1,false);
}