AKM AK9753 IR Sensor IC with I2C I/F

AK9753.cpp

Committer:
Rhyme
Date:
2017-12-27
Revision:
0:2eb87b5feaab

File content as of revision 0:2eb87b5feaab:

#include "mbed.h"
#include "AK9753.h"

#define REG_WIA1       0x00
#define REG_WIA2       0x01
#define REG_INFO1      0x02
#define REG_INFO2      0x03
#define REG_INTST      0x04
#define REG_ST1        0x05
#define REG_IR1L       0x06
#define REG_IR1H       0x07
#define REG_IR2L       0x08
#define REG_IR2H       0x09
#define REG_IR3L       0x0A
#define REG_IR3H       0x0B
#define REG_IR4L       0x0C
#define REG_IR4H       0x0D
#define REG_TMPL       0x0E
#define REG_TMPH       0x0F
#define REG_ST2        0x10
#define REG_ETH13H_LSB 0x11
#define REG_ETH13H_MSB 0x12
#define REG_ETH13L_LSB 0x13
#define REG_ETH13L_MSB 0x14
#define REG_ETH24H_LSB 0x15
#define REG_ETH24H_MSB 0x16
#define REG_ETH24L_LSB 0x17
#define REG_ETH24L_MSB 0x18
#define REG_EHYS13     0x19
#define REG_EHYS24     0x1A
#define REG_EINTEN     0x1B
#define REG_ECNTL1     0x1C
#define REG_CNTL2      0x1D

/* EEPROM */
#define REG_EKEY          0x50
#define EEPROM_ETH13H_LSB 0x51
#define EEPROM_ETH13H_MSB 0x52
#define EEPROM_ETH13L_LSB 0x53
#define EEPROM_ETH13L_MSB 0x54
#define EEPROM_ETH24H_LSB 0x55
#define EEPROM_ETH24H_MSB 0x56
#define EEPROM_ETH24L_LSB 0x57
#define EEPROM_ETH24L_MSB 0x58
#define EEPROM_EHYS13     0x59
#define EEPROM_EHYS24     0x5A
#define EEPROM_EINTEN     0x5B
#define EEPROM_ECNTL1     0x5C


AK9753::AK9753(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) {
    // activate the peripheral
}

AK9753::~AK9753() { }

int AK9753::readRegs(int addr, uint8_t * data, int len) {
    char t[1] = {addr};
    int result ;
    result = m_i2c.write(m_addr, t, 1, true);
    if (result == 0) {
        result = m_i2c.read(m_addr, (char *)data, len);
    }
    return( result ) ;
}

int AK9753::writeRegs(uint8_t * data, int len) {
    int result ;
    result = m_i2c.write(m_addr, (char *)data, len);
    return( result ) ;
}

/**
 * getCompanyCode
 * the code is expected to be 0x48 
 */
uint8_t AK9753::getCompanyCode(void) 
{
    uint8_t data ;
    readRegs(REG_WIA1, &data, 1) ;
    return(data) ;
}

/**
 * getDeviceID
 * the ID is expected to be 0x13
 */
uint8_t AK9753::getDeviceID(void) 
{
    uint8_t data ;
    readRegs(REG_WIA2, &data, 1) ;
    return(data) ;
}

bool AK9753::dataReady(void) /* returns ST1[0], read ST2 to clear */
{
    uint8_t data ;
    readRegs(REG_ST1, &data, 1) ;
    return((data & 0x01) == 0x01) ;
}

bool AK9753::dataOverRun(void)
{
    uint8_t data ;
    readRegs(REG_ST2, &data, 1) ;
    return((data & 0x02) == 0x02) ;
}

uint8_t AK9753::getINTST(void)  /** return REG_INTST */
{
    uint8_t data ;
    readRegs(REG_INTST, &data, 1) ;
    return( data ) ;
}

uint8_t  AK9753::getST1(void) 
{
    uint8_t data ;
    readRegs(REG_ST1, &data, 1) ;
    return( data ) ;
}

int16_t AK9753::getRawIR1(void) 
{
    uint8_t data[2] ;
    int16_t IR ;
    readRegs(REG_IR1L, data, 2) ;
    IR = (data[1] << 8) | data[0] ;
    return( IR ) ;
}

float AK9753::getIR1(void) 
{
    int16_t iValue ;
    float fValue ;
    iValue = getRawIR1() ;
    fValue = 14286.8 * iValue / 32768.0 ;
    return( fValue ) ;
}

int16_t AK9753::getRawIR2(void) 
{    
    uint8_t data[2] ;
    int16_t IR ;
    readRegs(REG_IR2L, data, 2) ;
    IR = (data[1] << 8) | data[0] ;
    return( IR ) ;
}

float AK9753::getIR2(void) 
{
    int16_t iValue ;
    float fValue ;
    iValue = getRawIR2() ;
    fValue = 14286.8 * iValue / 32768.0 ;
    return( fValue ) ;
}

int16_t AK9753::getRawIR3(void) 
{
    uint8_t data[2] ;
    int16_t IR ;
    readRegs(REG_IR3L, data, 2) ;
    IR = (data[1] << 8) | data[0] ;
    return( IR ) ;
}

float AK9753::getIR3(void) 
{
    int16_t iValue ;
    float fValue ;
    iValue = getRawIR3() ;
    fValue = 14286.8 * iValue / 32768.0 ;
    return( fValue ) ;
}

int16_t AK9753::getRawIR4(void) 
{
    uint8_t data[2] ;
    int16_t IR ;
    readRegs(REG_IR4L, data, 2) ;
    IR = (data[1] << 8) | data[0] ;
    return( IR ) ;
}

float AK9753::getIR4(void) 
{
    int16_t iValue ;
    float fValue ;
    iValue = getRawIR4() ;
    fValue = 14286.8 * iValue / 32768.0 ;
    return( fValue ) ;
}

int16_t AK9753::getRawTMP(void) 
{
    uint8_t data[2] ;
    int16_t temp ;
    readRegs(REG_TMPL, data, 2) ;
    temp = (data[1] << 8) | data[0] ;
    return( temp ) ;
}

float AK9753::getTMP(void) 
{
    int16_t iValue ;
    float fValue ;
    iValue = getRawTMP() ;
    fValue = 26.75 +  (60.0 - 26.75) * iValue / 17792.0 ;
    return( fValue ) ;
}

uint8_t  AK9753::getST2(void) 
{
    uint8_t data ;
    readRegs(REG_ST2, &data, 1) ;
    return( data ) ;
}

int16_t AK9753::getETH13H(void)
{
    int16_t value ;
    uint8_t data[2] ;
    readRegs(REG_ETH13H_LSB, data, 2) ;
    value = (data[1] << 8) | data[0] ;
    return( value ) ;
}

int16_t AK9753::getETH13L(void)
{
    int16_t value ;
    uint8_t data[2] ;
    readRegs(REG_ETH13L_LSB, data, 2) ;
    value = (data[1] << 8) | data[0] ;
    return( value ) ;
}

int16_t AK9753::getETH24H(void)
{
    int16_t value ;
    uint8_t data[2] ;
    readRegs(REG_ETH24H_LSB, data, 2) ;
    value = (data[1] << 8) | data[0] ;
    return( value ) ;
}

int16_t AK9753::getETH24L(void)
{
    int16_t value ;
    uint8_t data[2] ;
    readRegs(REG_ETH24L_LSB, data, 2) ;
    value = (data[1] << 8) | data[0] ;
    return( value ) ;
}

uint8_t AK9753::getEHYS13(void)
{
    uint8_t data ;
    readRegs(REG_EHYS13, &data, 1) ;
    return( data ) ;
}

uint8_t AK9753::getEHYS24(void)
{
    uint8_t data ;
    readRegs(REG_EHYS24, &data, 1) ;
    return( data ) ;
}

uint8_t AK9753::getEINTEN(void)
{
    uint8_t data ;
    readRegs(REG_EINTEN, &data, 1) ;
    return( data ) ;   
}

uint8_t AK9753::getECNTL1(void)
{
    uint8_t data ;
    readRegs(REG_ECNTL1, &data, 1) ;
    return( data ) ;      
}

uint8_t AK9753::getCNTL2(void)
{
    uint8_t data ;
    readRegs(REG_CNTL2, &data, 1) ;
    return( data ) ;      
}

void AK9753::setETH13H(int16_t value) 
{
    uint8_t data[3] ;
    data[0] = REG_ETH13H_LSB ;
    data[1] = value & 0xFF ;
    data[2] = (value >> 8) & 0xFF ;
    writeRegs(data, 3) ;
}

void AK9753::setETH13L(int16_t value) 
{
    uint8_t data[3] ;
    data[0] = REG_ETH13L_LSB ;
    data[1] = value & 0xFF ;
    data[2] = (value >> 8) & 0xFF ;
    writeRegs(data, 3) ;
}

void AK9753::setETH24H(int16_t value) 
{
    uint8_t data[3] ;
    data[0] = REG_ETH24H_LSB ;
    data[1] = value & 0xFF ;
    data[2] = (value >> 8) & 0xFF ;
    writeRegs(data, 3) ;
}

void AK9753::setETH24L(int16_t value) 
{
    uint8_t data[3] ;
    data[0] = REG_ETH24L_LSB ;
    data[1] = value & 0xFF ;
    data[2] = (value >> 8) & 0xFF ;
    writeRegs(data, 3) ;
}

void AK9753::setEHYS13(uint8_t value) 
{
    uint8_t data[2] ;
    data[0] = REG_EHYS13 ;
    data[1] = value ;
    writeRegs(data, 2) ;
}

void AK9753::setEHYS24(uint8_t value) 
{
    uint8_t data[2] ;
    data[0] = REG_EHYS24 ;
    data[1] = value ;
    writeRegs(data, 2) ;    
}

void AK9753::setEINTEN(uint8_t value) 
{
    uint8_t data[2] ;
    data[0] = REG_EINTEN ;
    data[1] = value ;
    writeRegs(data, 2) ; 
}

void AK9753::setECNTL1(uint8_t value) 
{
    uint8_t data[2] ;
    data[0] = REG_ECNTL1 ;
    data[1] = value ;
    writeRegs(data, 2) ; 
}

void AK9753::software_reset(void) 
{
    uint8_t data[2] = { REG_CNTL2, 0xFF } ;
    writeRegs(data, 2) ;
}