Changed MCP3221 I2C read from two 1-byte reads to one 2-byte read
Dependents: DISCO-F746NG_LCD_TS_ADC
Fork of MCP3221 by
MCP3221.cpp@1:2921687d299e, 2017-02-02 (annotated)
- 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?
User | Revision | Line number | New 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 |