Changed MCP3221 I2C read from two 1-byte reads to one 2-byte read

Dependents:   DISCO-F746NG_LCD_TS_ADC

Fork of MCP3221 by David Styles

MCP3221.cpp

Committer:
pampt
Date:
2017-02-02
Revision:
1:2921687d299e
Parent:
0:db4e3d0374fe

File content as of revision 1:2921687d299e:


#include "MCP3221.h"

//Create instance
MCP3221::MCP3221(PinName sda, PinName scl, float supplyVoltage) : i2c(sda, scl), _supplyVoltage(supplyVoltage)
{
}

//destroy instance
MCP3221::~MCP3221()
{
}

float MCP3221::read()
{

//You cannot write to an MCP3221, it has no writable registers.
//MCP3221 also requires an ACKnowledge between each byte sent, before it will send the next byte. So we need to be a bit manual with how we talk to it.
//It also needs an (NOT) ACKnowledge after the second byte or it will keep sending bytes (continuous sampling)
//
//From the datasheet.
//
//I2C.START
//Send 8 bit device/ part address to open conversation.   (See .h file for part explanation)
//read a byte (with ACK)
//read a byte (with NAK)
//I2C.STOP


  //  char data[2];
/*
    i2c.start();
    int acknowledged = i2c.write(MCP3221_CONVERSE); //send a byte to start the conversation. It should be acknowledged.
    _data[0] = i2c.read(1);  //read a byte. acknowledge when we have it.
    _data[1] = i2c.read(0);  //read the second byte. (n)acknowledge when we have it to stop the flow.
    i2c.stop();
*/
    // PA20170202 in the DISCO-F746NG the above does not return the LS byte, however this works
    i2c.read(MCP3221_CONVERSE, _data, 2);
    //convert to 12 bit.
    short res;
    int _12_bit_var; // 2 bytes
    char _4_bit_MSnibble = _data[0]; // 1 byte, example 0000 1000
    char _8_bit_LSByte = _data[1];   // 1 byte, example 1111 0000

    _12_bit_var = ((0x0F & _4_bit_MSnibble) << 8) | _8_bit_LSByte;   //example 100011110000
    res=_12_bit_var;

    return  (_supplyVoltage/4096) * res;

}