Analog Devices / ADT7410 16-Bit Digital I2C Temperature Sensor

Dependents:   Frequency_Counter_w_GPS_1PPS MQTToverCC3000 Frequency_Cntr_1PPS_F746ZG

Committer:
kenjiArai
Date:
Tue Jan 06 03:06:16 2015 +0000
Revision:
2:231bddd40e29
Parent:
1:4a1eb0f32025
Child:
3:912cd5ac1cce
Buf fix write_reg_byte(), delete Debug function PRINTF()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:6ec4df1fa459 1 /*
kenjiArai 0:6ec4df1fa459 2 * mbed library program
kenjiArai 0:6ec4df1fa459 3 * Analog Devices / ADT7410 16-Bit Digital I2C Temperature Sensor
kenjiArai 0:6ec4df1fa459 4 * http://www.analog.com/en/mems-sensors/digital-temperature-sensors/adt7410/products/product.html
kenjiArai 0:6ec4df1fa459 5 *
kenjiArai 0:6ec4df1fa459 6 * Copyright (c) 2014 Kenji Arai / JH1PJL
kenjiArai 0:6ec4df1fa459 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:6ec4df1fa459 8 * http://mbed.org/users/kenjiArai/
kenjiArai 0:6ec4df1fa459 9 * Created: November 26th, 2014
kenjiArai 2:231bddd40e29 10 * Revised: January 6th, 2015
kenjiArai 0:6ec4df1fa459 11 *
kenjiArai 0:6ec4df1fa459 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 0:6ec4df1fa459 13 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 0:6ec4df1fa459 14 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 0:6ec4df1fa459 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 0:6ec4df1fa459 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 0:6ec4df1fa459 17 */
kenjiArai 0:6ec4df1fa459 18
kenjiArai 0:6ec4df1fa459 19 #include "mbed.h"
kenjiArai 0:6ec4df1fa459 20 #include "ADT7410.h"
kenjiArai 0:6ec4df1fa459 21
kenjiArai 0:6ec4df1fa459 22 ADT7410::ADT7410 (PinName p_sda, PinName p_scl, uint8_t addr) : _i2c(p_sda, p_scl)
kenjiArai 0:6ec4df1fa459 23 {
kenjiArai 0:6ec4df1fa459 24 ADT7410_addr = (char)addr;
kenjiArai 0:6ec4df1fa459 25 init();
kenjiArai 0:6ec4df1fa459 26 }
kenjiArai 0:6ec4df1fa459 27
kenjiArai 0:6ec4df1fa459 28 ADT7410::ADT7410 (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c)
kenjiArai 0:6ec4df1fa459 29 {
kenjiArai 0:6ec4df1fa459 30 ADT7410_addr = (char)addr;
kenjiArai 0:6ec4df1fa459 31 init();
kenjiArai 0:6ec4df1fa459 32 }
kenjiArai 0:6ec4df1fa459 33
kenjiArai 0:6ec4df1fa459 34 /////////////// Read All data /////////////////////////////
kenjiArai 0:6ec4df1fa459 35 void ADT7410::read_all()
kenjiArai 0:6ec4df1fa459 36 {
kenjiArai 0:6ec4df1fa459 37 dt[0] = ADT7410_A_T_MSB;
kenjiArai 2:231bddd40e29 38 _i2c.write((int)ADT7410_addr, (char *)dt, 1, true);
kenjiArai 2:231bddd40e29 39 _i2c.read((int)ADT7410_addr, (char *)dt, 4, false);
kenjiArai 0:6ec4df1fa459 40 }
kenjiArai 0:6ec4df1fa459 41
kenjiArai 0:6ec4df1fa459 42 /////////////// Read Temperature //////////////////////////
kenjiArai 0:6ec4df1fa459 43 float ADT7410::read_temp()
kenjiArai 0:6ec4df1fa459 44 {
kenjiArai 1:4a1eb0f32025 45 uint16_t data;
kenjiArai 1:4a1eb0f32025 46
kenjiArai 1:4a1eb0f32025 47 read_all();
kenjiArai 1:4a1eb0f32025 48 if (dt[3] & 0x80){ // 16bit
kenjiArai 2:231bddd40e29 49 data = (dt[0] << 8) + dt[1];
kenjiArai 1:4a1eb0f32025 50 } else { // 13bit
kenjiArai 1:4a1eb0f32025 51 data = (dt[0] << 8) + (dt[1] & 0xf8);
kenjiArai 1:4a1eb0f32025 52 }
kenjiArai 1:4a1eb0f32025 53 if (dt[0] & 0x80){ // -
kenjiArai 2:231bddd40e29 54 return (float)(data - 65536) / 128;
kenjiArai 1:4a1eb0f32025 55 } else { // +
kenjiArai 1:4a1eb0f32025 56 return (float)data / 128;
kenjiArai 1:4a1eb0f32025 57 }
kenjiArai 0:6ec4df1fa459 58 }
kenjiArai 0:6ec4df1fa459 59
kenjiArai 0:6ec4df1fa459 60 /////////////// Check Status //////////////////////////////
kenjiArai 0:6ec4df1fa459 61 uint8_t ADT7410::read_status()
kenjiArai 0:6ec4df1fa459 62 {
kenjiArai 1:4a1eb0f32025 63 int8_t dt = read_reg_byte(ADT7410_A_STATUS);
kenjiArai 1:4a1eb0f32025 64 return dt;
kenjiArai 0:6ec4df1fa459 65 }
kenjiArai 0:6ec4df1fa459 66
kenjiArai 0:6ec4df1fa459 67 /////////////// Check Configration //////////////////////////
kenjiArai 0:6ec4df1fa459 68 uint8_t ADT7410::read_config()
kenjiArai 0:6ec4df1fa459 69 {
kenjiArai 1:4a1eb0f32025 70 int8_t dt = read_reg_byte(ADT7410_A_CONFIG);
kenjiArai 1:4a1eb0f32025 71 return dt;
kenjiArai 0:6ec4df1fa459 72 }
kenjiArai 0:6ec4df1fa459 73
kenjiArai 0:6ec4df1fa459 74 /////////////// Set Configration //////////////////////////
kenjiArai 0:6ec4df1fa459 75 uint8_t ADT7410::set_config(uint8_t cfg)
kenjiArai 0:6ec4df1fa459 76 {
kenjiArai 1:4a1eb0f32025 77 return write_reg_byte(ADT7410_A_CONFIG, cfg);
kenjiArai 1:4a1eb0f32025 78 }
kenjiArai 1:4a1eb0f32025 79
kenjiArai 1:4a1eb0f32025 80 /////////////// Read ID & REV //////////////////////////
kenjiArai 1:4a1eb0f32025 81 void ADT7410::read_id_rev()
kenjiArai 1:4a1eb0f32025 82 {
kenjiArai 1:4a1eb0f32025 83 uint8_t dt;
kenjiArai 0:6ec4df1fa459 84
kenjiArai 1:4a1eb0f32025 85 dt = read_reg_byte(ADT7410_A_ID);
kenjiArai 1:4a1eb0f32025 86 id_number = GET_ID(dt);
kenjiArai 1:4a1eb0f32025 87 rev_number = GET_REV(dt);
kenjiArai 1:4a1eb0f32025 88 }
kenjiArai 1:4a1eb0f32025 89
kenjiArai 1:4a1eb0f32025 90 uint8_t ADT7410::read_ID()
kenjiArai 1:4a1eb0f32025 91 {
kenjiArai 1:4a1eb0f32025 92 return id_number;
kenjiArai 1:4a1eb0f32025 93 }
kenjiArai 1:4a1eb0f32025 94
kenjiArai 1:4a1eb0f32025 95 uint8_t ADT7410::read_REV()
kenjiArai 1:4a1eb0f32025 96 {
kenjiArai 1:4a1eb0f32025 97 return rev_number;
kenjiArai 0:6ec4df1fa459 98 }
kenjiArai 0:6ec4df1fa459 99
kenjiArai 1:4a1eb0f32025 100 uint8_t ADT7410::who_am_i()
kenjiArai 0:6ec4df1fa459 101 {
kenjiArai 1:4a1eb0f32025 102 if (id_number == I_AM_ADT7410){
kenjiArai 1:4a1eb0f32025 103 return 1;
kenjiArai 1:4a1eb0f32025 104 } else {
kenjiArai 1:4a1eb0f32025 105 return 0;
kenjiArai 1:4a1eb0f32025 106 }
kenjiArai 0:6ec4df1fa459 107 }
kenjiArai 0:6ec4df1fa459 108
kenjiArai 1:4a1eb0f32025 109 /////////////// Read/Write specific register //////////////
kenjiArai 1:4a1eb0f32025 110 uint8_t ADT7410::read_reg_byte(uint8_t reg)
kenjiArai 0:6ec4df1fa459 111 {
kenjiArai 1:4a1eb0f32025 112 uint8_t dx[2];
kenjiArai 1:4a1eb0f32025 113
kenjiArai 1:4a1eb0f32025 114 dx[0] = reg;
kenjiArai 1:4a1eb0f32025 115 _i2c.write((int)ADT7410_addr, (char *)dx, 1, true);
kenjiArai 2:231bddd40e29 116 _i2c.read((int)ADT7410_addr, (char *)dx, 1, false);
kenjiArai 1:4a1eb0f32025 117 return dx[0];
kenjiArai 1:4a1eb0f32025 118 }
kenjiArai 1:4a1eb0f32025 119
kenjiArai 1:4a1eb0f32025 120 uint8_t ADT7410::write_reg_byte(uint8_t reg, uint8_t dt)
kenjiArai 1:4a1eb0f32025 121 {
kenjiArai 1:4a1eb0f32025 122 uint8_t dx[2];
kenjiArai 1:4a1eb0f32025 123
kenjiArai 1:4a1eb0f32025 124 dx[0] = reg;
kenjiArai 1:4a1eb0f32025 125 dx[1] = read_reg_byte(reg);
kenjiArai 2:231bddd40e29 126 _i2c.write((int)ADT7410_addr, (char *)dx, 2, false);
kenjiArai 1:4a1eb0f32025 127 return dx[1];
kenjiArai 0:6ec4df1fa459 128 }
kenjiArai 0:6ec4df1fa459 129
kenjiArai 0:6ec4df1fa459 130 /////////////// Initialize ////////////////////////////////
kenjiArai 0:6ec4df1fa459 131 void ADT7410::init()
kenjiArai 0:6ec4df1fa459 132 {
kenjiArai 0:6ec4df1fa459 133 uint8_t dx[2];
kenjiArai 0:6ec4df1fa459 134
kenjiArai 0:6ec4df1fa459 135 dx[0] = ADT7410_A_CONFIG;
kenjiArai 2:231bddd40e29 136 dx[1] = RESOLUTION_16BIT + OPERATION_MODE_CONT;
kenjiArai 2:231bddd40e29 137 _i2c.write((int)ADT7410_addr, (char *)dx, 2, false);
kenjiArai 1:4a1eb0f32025 138 read_id_rev();
kenjiArai 0:6ec4df1fa459 139 }