Malexis 90640 sensor

Dependencies:   mbed

MLX90640_I2C_Driver.cpp

Committer:
withboobs
Date:
2018-04-20
Revision:
4:b9ae79d80127
Parent:
3:d2e64ef64905

File content as of revision 4:b9ae79d80127:

#include "mbed.h"
#include "MLX90640_I2C_Driver.h"


//int * I2CReadMLX90640(int,int,int);
I2C i2c(PB_7, PB_6);

void MLX90640_I2CInit()
{   
    i2c.stop();
}

int MLX90640_I2CRead_working(uint8_t slaveAddr, uint16_t startAddress, uint16_t nWordsRead, uint16_t *data)
{
    uint8_t sa;                           
    int cnt = 0;
    int i = 0;
    char cmd[2] = {0,0};
    char i2cData[1664] = {0};
    uint16_t *p;
    
    p = data;
    sa = (slaveAddr << 1);
    cmd[0] = startAddress >> 8;
    cmd[1] = startAddress & 0x00FF;
    
    wait_us(5);    
    if (i2c.write(sa, cmd, 2, 1))
    {
        return -1;
    }
             
    sa = sa | 0x01;
    if (i2c.read(sa, i2cData, 2*nWordsRead, 0))
    {
        return -1; 
    }          
    //i2c.stop();   
    
    for(cnt=0; cnt < nWordsRead; cnt++)
    {
        i = cnt << 1;
        *p++ = (uint16_t)i2cData[i]*256 + (uint16_t)i2cData[i+1];
    }
    
    return 0;   
} 

int MLX90640_I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nWordsRead, uint16_t *data)
{
    uint8_t sa;                           
    uint16_t cnt = 0;
    char *i2cData = (char *) data;
    
    sa = (slaveAddr << 1);
    startAddress = __REV16(startAddress);
    
    wait_us(5);    
    if (i2c.write(sa, (char *) &startAddress, 2, 1))
    {
        return -1;
    }
             
    sa = sa | 0x01;
    if (i2c.read(sa, i2cData, nWordsRead<<1, 0))
    {
        return -1; 
    }          
    
    for(cnt=0; cnt < nWordsRead; cnt++)
    {
        data[cnt] = __REV16(data[cnt]);
    }
    
    return 0;   
} 

void MLX90640_I2CFreqSet(int freq)
{
    i2c.frequency(1000*freq);
}

int MLX90640_I2CWrite(uint8_t slaveAddr, unsigned int writeAddress, uint16_t data)
{
    uint8_t sa;
    int ack = 0;
    char cmd[4] = {0,0,0,0};
    static uint16_t dataCheck;
    

    sa = (slaveAddr << 1);
    cmd[0] = writeAddress >> 8;
    cmd[1] = writeAddress & 0x00FF;
    cmd[2] = data >> 8;
    cmd[3] = data & 0x00FF;

    //i2c.stop();
    wait_us(5);    
    ack = i2c.write(sa, cmd, 4, 0);
    
    if (ack != 0x00)
    {
        return -1;
    }         
    //i2c.stop();   
    
    MLX90640_I2CRead(slaveAddr,writeAddress,1, &dataCheck);
    
    if ( dataCheck != data)
    {
        return -2;
    }    
    
    return 0;
}