Analog Devices / ADT7410 16-Bit Digital I2C Temperature Sensor
Dependents: Frequency_Counter_w_GPS_1PPS MQTToverCC3000 Frequency_Cntr_1PPS_F746ZG
Diff: ADT7410.cpp
- Revision:
- 1:4a1eb0f32025
- Parent:
- 0:6ec4df1fa459
- Child:
- 2:231bddd40e29
--- a/ADT7410.cpp Fri Nov 28 10:32:19 2014 +0000 +++ b/ADT7410.cpp Sun Nov 30 09:05:07 2014 +0000 @@ -7,7 +7,7 @@ * http://www.page.sannet.ne.jp/kenjia/index.html * http://mbed.org/users/kenjiArai/ * Created: November 26th, 2014 - * Revised: November 28th, 2014 + * Revised: November 30th, 2014 * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE @@ -31,20 +31,6 @@ #define PRINTF(...) {;} #endif -////////////// REGISTER DEFINITION ////////////// -#define ADT7410_A_T_MSB 0x00 -#define ADT7410_A_T_LSB 0x01 -#define ADT7410_A_STATUS 0x02 -#define ADT7410_A_CONFIG 0x03 -#define ADT7410_A_T_H_MSB 0x04 -#define ADT7410_A_T_H_LSB 0x05 -#define ADT7410_A_T_L_MSB 0x06 -#define ADT7410_A_T_L_LSB 0x07 -#define ADT7410_A_T_C_MSB 0x08 -#define ADT7410_A_T_C_LSB 0x09 -#define ADT7410_A_T_HYS 0x0a -#define ADT7410_A_ID 0x0b -#define ADT7410_A_SW_RESET 0x2f ADT7410::ADT7410 (PinName p_sda, PinName p_scl, uint8_t addr) : _i2c(p_sda, p_scl) { @@ -62,63 +48,108 @@ void ADT7410::read_all() { dt[0] = ADT7410_A_T_MSB; - _i2c.write((int)ADT7410_addr, (char *)dt, 1, false); - _i2c.read((int)ADT7410_addr, (char *)dt, 12, true); + _i2c.write((int)ADT7410_addr, (char *)dt, 1); + _i2c.read((int)ADT7410_addr, (char *)dt, 4); } /////////////// Read Temperature ////////////////////////// float ADT7410::read_temp() { - dt[0] = ADT7410_A_T_MSB; - _i2c.write((int)ADT7410_addr, (char *)dt, 1, false); - _i2c.read((int)ADT7410_addr, (char *)dt, 2, true); - uint32_t d = (dt[0] << 8) + dt[1]; - PRINTF("d= 0x%04x , dt0= 0x%02x, dt1= 0x%02x\r\n", d, dt[0], dt[1]); - return (float)d; + uint16_t data; + + read_all(); + PRINTF("Th=0x%02x, Tl=0x%02x, S=0x%02x, C=0x%02x // ", dt[0], dt[1], dt[2], dt[3]); + if (dt[3] & 0x80){ // 16bit + data = (dt[0] << 8) + dt[1]; + } else { // 13bit + data = (dt[0] << 8) + (dt[1] & 0xf8); + } +#if 1 + if (dt[0] & 0x80){ // - + return (float)(data - 32768) / 128; + } else { // + + return (float)data / 128; + } +#else + return -12.34f; // check - temp for debug +#endif } - /////////////// Check Status ////////////////////////////// uint8_t ADT7410::read_status() { - read_all(); - PRINTF("status= 0x%02x\r\n", dt[2]); - return dt[2]; + int8_t dt = read_reg_byte(ADT7410_A_STATUS); + PRINTF("status= 0x%02x\r\n", dt); + return dt; } /////////////// Check Configration ////////////////////////// uint8_t ADT7410::read_config() { - read_all(); - PRINTF("config= 0x%02x\r\n", dt[3]); - return dt[3]; + int8_t dt = read_reg_byte(ADT7410_A_CONFIG); + PRINTF("config= 0x%02x\r\n", dt); + return dt; } /////////////// Set Configration ////////////////////////// uint8_t ADT7410::set_config(uint8_t cfg) { - uint8_t dx[2]; + return write_reg_byte(ADT7410_A_CONFIG, cfg); +} + +/////////////// Read ID & REV ////////////////////////// +void ADT7410::read_id_rev() +{ + uint8_t dt; - dx[0] = ADT7410_A_CONFIG; - dx[1] = cfg; - _i2c.write((int)ADT7410_addr, (char *)dx, 2); - return read_config(); + dt = read_reg_byte(ADT7410_A_ID); + PRINTF("ID & Rev: 0x%02x\r\n", dt); + id_number = GET_ID(dt); + rev_number = GET_REV(dt); +} + +uint8_t ADT7410::read_ID() +{ + return id_number; +} + +uint8_t ADT7410::read_REV() +{ + return rev_number; } -/////////////// Read ID /////////////////////////////////// -uint8_t ADT7410::read_id() +uint8_t ADT7410::who_am_i() { - read_all(); - PRINTF("ID reg= 0x%02x\r\n", dt[11]); - return (dt[11 ]>> 3); + if (id_number == I_AM_ADT7410){ + return 1; + } else { + return 0; + } } -/////////////// Read Revision ///////////////////////////// -uint8_t ADT7410::read_revision() +/////////////// Read/Write specific register ////////////// +uint8_t ADT7410::read_reg_byte(uint8_t reg) { - read_all(); - PRINTF("ID reg= 0x%02x\r\n", dt[11]); - return (dt[11] & 0x7); + uint8_t dx[2]; + + dx[0] = reg; + _i2c.write((int)ADT7410_addr, (char *)dx, 1, true); + _i2c.read((int)ADT7410_addr, (char *)dx, 1); + _i2c.stop(); + PRINTF("reg:0x%02x, data=0x%02x\r\n", reg, dx[0]); + return dx[0]; +} + +uint8_t ADT7410::write_reg_byte(uint8_t reg, uint8_t dt) +{ + uint8_t dx[2]; + + dx[0] = reg; + _i2c.write((int)ADT7410_addr, (char *)dx, 2); + _i2c.stop(); + dx[1] = read_reg_byte(reg); + PRINTF("reg:0x%02x, write/data=0x%02x, read/data=0x%02x\r\n", reg, dx[0], dx[1]); + return dx[1]; } /////////////// Initialize //////////////////////////////// @@ -127,6 +158,7 @@ uint8_t dx[2]; dx[0] = ADT7410_A_CONFIG; - dx[1] = RESOLUTION_16BIT + OPERATION_MODE_1SPS; + dx[1] = RESOLUTION_13BIT + OPERATION_MODE_CONT; _i2c.write((int)ADT7410_addr, (char *)dx, 2); + read_id_rev(); }