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:
pampt
Date:
Thu Feb 02 06:10:38 2017 +0000
Revision:
1:2921687d299e
Parent:
0:db4e3d0374fe
Changed MCP3221 I2C read to a 2-byte read from two 1-byte reads

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];
pampt 1:2921687d299e 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();
pampt 1:2921687d299e 37 */
pampt 1:2921687d299e 38 // PA20170202 in the DISCO-F746NG the above does not return the LS byte, however this works
pampt 1:2921687d299e 39 i2c.read(MCP3221_CONVERSE, _data, 2);
DaveStyles 0:db4e3d0374fe 40 //convert to 12 bit.
DaveStyles 0:db4e3d0374fe 41 short res;
DaveStyles 0:db4e3d0374fe 42 int _12_bit_var; // 2 bytes
DaveStyles 0:db4e3d0374fe 43 char _4_bit_MSnibble = _data[0]; // 1 byte, example 0000 1000
DaveStyles 0:db4e3d0374fe 44 char _8_bit_LSByte = _data[1]; // 1 byte, example 1111 0000
DaveStyles 0:db4e3d0374fe 45
DaveStyles 0:db4e3d0374fe 46 _12_bit_var = ((0x0F & _4_bit_MSnibble) << 8) | _8_bit_LSByte; //example 100011110000
DaveStyles 0:db4e3d0374fe 47 res=_12_bit_var;
DaveStyles 0:db4e3d0374fe 48
DaveStyles 0:db4e3d0374fe 49 return (_supplyVoltage/4096) * res;
DaveStyles 0:db4e3d0374fe 50
DaveStyles 0:db4e3d0374fe 51 }
DaveStyles 0:db4e3d0374fe 52