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

Committer:
DaveStyles
Date:
Wed Oct 31 21:43:28 2012 +0000
Revision:
0:db4e3d0374fe
Child:
1:2921687d299e
MCP3221 12Bit I2C ADC Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DaveStyles 0:db4e3d0374fe 1
DaveStyles 0:db4e3d0374fe 2 #include "MCP3221.h"
DaveStyles 0:db4e3d0374fe 3
DaveStyles 0:db4e3d0374fe 4 //Create instance
DaveStyles 0:db4e3d0374fe 5 MCP3221::MCP3221(PinName sda, PinName scl, float supplyVoltage) : i2c(sda, scl), _supplyVoltage(supplyVoltage)
DaveStyles 0:db4e3d0374fe 6 {
DaveStyles 0:db4e3d0374fe 7 }
DaveStyles 0:db4e3d0374fe 8
DaveStyles 0:db4e3d0374fe 9 //destroy instance
DaveStyles 0:db4e3d0374fe 10 MCP3221::~MCP3221()
DaveStyles 0:db4e3d0374fe 11 {
DaveStyles 0:db4e3d0374fe 12 }
DaveStyles 0:db4e3d0374fe 13
DaveStyles 0:db4e3d0374fe 14 float MCP3221::read()
DaveStyles 0:db4e3d0374fe 15 {
DaveStyles 0:db4e3d0374fe 16
DaveStyles 0:db4e3d0374fe 17 //You cannot write to an MCP3221, it has no writable registers.
DaveStyles 0:db4e3d0374fe 18 //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.
DaveStyles 0:db4e3d0374fe 19 //It also needs an (NOT) ACKnowledge after the second byte or it will keep sending bytes (continuous sampling)
DaveStyles 0:db4e3d0374fe 20 //
DaveStyles 0:db4e3d0374fe 21 //From the datasheet.
DaveStyles 0:db4e3d0374fe 22 //
DaveStyles 0:db4e3d0374fe 23 //I2C.START
DaveStyles 0:db4e3d0374fe 24 //Send 8 bit device/ part address to open conversation. (See .h file for part explanation)
DaveStyles 0:db4e3d0374fe 25 //read a byte (with ACK)
DaveStyles 0:db4e3d0374fe 26 //read a byte (with NAK)
DaveStyles 0:db4e3d0374fe 27 //I2C.STOP
DaveStyles 0:db4e3d0374fe 28
DaveStyles 0:db4e3d0374fe 29
DaveStyles 0:db4e3d0374fe 30 // char data[2];
DaveStyles 0:db4e3d0374fe 31
DaveStyles 0:db4e3d0374fe 32 i2c.start();
DaveStyles 0:db4e3d0374fe 33 int acknowledged = i2c.write(MCP3221_CONVERSE); //send a byte to start the conversation. It should be acknowledged.
DaveStyles 0:db4e3d0374fe 34 _data[0] = i2c.read(1); //read a byte. acknowledge when we have it.
DaveStyles 0:db4e3d0374fe 35 _data[1] = i2c.read(0); //read the second byte. (n)acknowledge when we have it to stop the flow.
DaveStyles 0:db4e3d0374fe 36 i2c.stop();
DaveStyles 0:db4e3d0374fe 37
DaveStyles 0:db4e3d0374fe 38 //convert to 12 bit.
DaveStyles 0:db4e3d0374fe 39 short res;
DaveStyles 0:db4e3d0374fe 40 int _12_bit_var; // 2 bytes
DaveStyles 0:db4e3d0374fe 41 char _4_bit_MSnibble = _data[0]; // 1 byte, example 0000 1000
DaveStyles 0:db4e3d0374fe 42 char _8_bit_LSByte = _data[1]; // 1 byte, example 1111 0000
DaveStyles 0:db4e3d0374fe 43
DaveStyles 0:db4e3d0374fe 44 _12_bit_var = ((0x0F & _4_bit_MSnibble) << 8) | _8_bit_LSByte; //example 100011110000
DaveStyles 0:db4e3d0374fe 45 res=_12_bit_var;
DaveStyles 0:db4e3d0374fe 46
DaveStyles 0:db4e3d0374fe 47 return (_supplyVoltage/4096) * res;
DaveStyles 0:db4e3d0374fe 48
DaveStyles 0:db4e3d0374fe 49 }
DaveStyles 0:db4e3d0374fe 50