Analog Devices / ADT7410 16-Bit Digital I2C Temperature Sensor

Dependents:   Frequency_Counter_w_GPS_1PPS MQTToverCC3000 Frequency_Cntr_1PPS_F746ZG

Committer:
kenjiArai
Date:
Sun Nov 30 09:05:07 2014 +0000
Revision:
1:4a1eb0f32025
Parent:
0:6ec4df1fa459
Child:
2:231bddd40e29
fixed bug and added functions

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 1:4a1eb0f32025 10 * Revised: November 30th, 2014
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 //#define DEBUG
kenjiArai 0:6ec4df1fa459 23
kenjiArai 0:6ec4df1fa459 24 #ifdef DEBUG
kenjiArai 0:6ec4df1fa459 25 Serial pcm(USBTX, USBRX);
kenjiArai 0:6ec4df1fa459 26 #endif
kenjiArai 0:6ec4df1fa459 27
kenjiArai 0:6ec4df1fa459 28 #ifdef DEBUG
kenjiArai 0:6ec4df1fa459 29 #define PRINTF(...) pcm.printf(__VA_ARGS__)
kenjiArai 0:6ec4df1fa459 30 #else
kenjiArai 0:6ec4df1fa459 31 #define PRINTF(...) {;}
kenjiArai 0:6ec4df1fa459 32 #endif
kenjiArai 0:6ec4df1fa459 33
kenjiArai 0:6ec4df1fa459 34
kenjiArai 0:6ec4df1fa459 35 ADT7410::ADT7410 (PinName p_sda, PinName p_scl, uint8_t addr) : _i2c(p_sda, p_scl)
kenjiArai 0:6ec4df1fa459 36 {
kenjiArai 0:6ec4df1fa459 37 ADT7410_addr = (char)addr;
kenjiArai 0:6ec4df1fa459 38 init();
kenjiArai 0:6ec4df1fa459 39 }
kenjiArai 0:6ec4df1fa459 40
kenjiArai 0:6ec4df1fa459 41 ADT7410::ADT7410 (I2C& p_i2c, uint8_t addr) : _i2c(p_i2c)
kenjiArai 0:6ec4df1fa459 42 {
kenjiArai 0:6ec4df1fa459 43 ADT7410_addr = (char)addr;
kenjiArai 0:6ec4df1fa459 44 init();
kenjiArai 0:6ec4df1fa459 45 }
kenjiArai 0:6ec4df1fa459 46
kenjiArai 0:6ec4df1fa459 47 /////////////// Read All data /////////////////////////////
kenjiArai 0:6ec4df1fa459 48 void ADT7410::read_all()
kenjiArai 0:6ec4df1fa459 49 {
kenjiArai 0:6ec4df1fa459 50 dt[0] = ADT7410_A_T_MSB;
kenjiArai 1:4a1eb0f32025 51 _i2c.write((int)ADT7410_addr, (char *)dt, 1);
kenjiArai 1:4a1eb0f32025 52 _i2c.read((int)ADT7410_addr, (char *)dt, 4);
kenjiArai 0:6ec4df1fa459 53 }
kenjiArai 0:6ec4df1fa459 54
kenjiArai 0:6ec4df1fa459 55 /////////////// Read Temperature //////////////////////////
kenjiArai 0:6ec4df1fa459 56 float ADT7410::read_temp()
kenjiArai 0:6ec4df1fa459 57 {
kenjiArai 1:4a1eb0f32025 58 uint16_t data;
kenjiArai 1:4a1eb0f32025 59
kenjiArai 1:4a1eb0f32025 60 read_all();
kenjiArai 1:4a1eb0f32025 61 PRINTF("Th=0x%02x, Tl=0x%02x, S=0x%02x, C=0x%02x // ", dt[0], dt[1], dt[2], dt[3]);
kenjiArai 1:4a1eb0f32025 62 if (dt[3] & 0x80){ // 16bit
kenjiArai 1:4a1eb0f32025 63 data = (dt[0] << 8) + dt[1];
kenjiArai 1:4a1eb0f32025 64 } else { // 13bit
kenjiArai 1:4a1eb0f32025 65 data = (dt[0] << 8) + (dt[1] & 0xf8);
kenjiArai 1:4a1eb0f32025 66 }
kenjiArai 1:4a1eb0f32025 67 #if 1
kenjiArai 1:4a1eb0f32025 68 if (dt[0] & 0x80){ // -
kenjiArai 1:4a1eb0f32025 69 return (float)(data - 32768) / 128;
kenjiArai 1:4a1eb0f32025 70 } else { // +
kenjiArai 1:4a1eb0f32025 71 return (float)data / 128;
kenjiArai 1:4a1eb0f32025 72 }
kenjiArai 1:4a1eb0f32025 73 #else
kenjiArai 1:4a1eb0f32025 74 return -12.34f; // check - temp for debug
kenjiArai 1:4a1eb0f32025 75 #endif
kenjiArai 0:6ec4df1fa459 76 }
kenjiArai 0:6ec4df1fa459 77
kenjiArai 0:6ec4df1fa459 78 /////////////// Check Status //////////////////////////////
kenjiArai 0:6ec4df1fa459 79 uint8_t ADT7410::read_status()
kenjiArai 0:6ec4df1fa459 80 {
kenjiArai 1:4a1eb0f32025 81 int8_t dt = read_reg_byte(ADT7410_A_STATUS);
kenjiArai 1:4a1eb0f32025 82 PRINTF("status= 0x%02x\r\n", dt);
kenjiArai 1:4a1eb0f32025 83 return dt;
kenjiArai 0:6ec4df1fa459 84 }
kenjiArai 0:6ec4df1fa459 85
kenjiArai 0:6ec4df1fa459 86 /////////////// Check Configration //////////////////////////
kenjiArai 0:6ec4df1fa459 87 uint8_t ADT7410::read_config()
kenjiArai 0:6ec4df1fa459 88 {
kenjiArai 1:4a1eb0f32025 89 int8_t dt = read_reg_byte(ADT7410_A_CONFIG);
kenjiArai 1:4a1eb0f32025 90 PRINTF("config= 0x%02x\r\n", dt);
kenjiArai 1:4a1eb0f32025 91 return dt;
kenjiArai 0:6ec4df1fa459 92 }
kenjiArai 0:6ec4df1fa459 93
kenjiArai 0:6ec4df1fa459 94 /////////////// Set Configration //////////////////////////
kenjiArai 0:6ec4df1fa459 95 uint8_t ADT7410::set_config(uint8_t cfg)
kenjiArai 0:6ec4df1fa459 96 {
kenjiArai 1:4a1eb0f32025 97 return write_reg_byte(ADT7410_A_CONFIG, cfg);
kenjiArai 1:4a1eb0f32025 98 }
kenjiArai 1:4a1eb0f32025 99
kenjiArai 1:4a1eb0f32025 100 /////////////// Read ID & REV //////////////////////////
kenjiArai 1:4a1eb0f32025 101 void ADT7410::read_id_rev()
kenjiArai 1:4a1eb0f32025 102 {
kenjiArai 1:4a1eb0f32025 103 uint8_t dt;
kenjiArai 0:6ec4df1fa459 104
kenjiArai 1:4a1eb0f32025 105 dt = read_reg_byte(ADT7410_A_ID);
kenjiArai 1:4a1eb0f32025 106 PRINTF("ID & Rev: 0x%02x\r\n", dt);
kenjiArai 1:4a1eb0f32025 107 id_number = GET_ID(dt);
kenjiArai 1:4a1eb0f32025 108 rev_number = GET_REV(dt);
kenjiArai 1:4a1eb0f32025 109 }
kenjiArai 1:4a1eb0f32025 110
kenjiArai 1:4a1eb0f32025 111 uint8_t ADT7410::read_ID()
kenjiArai 1:4a1eb0f32025 112 {
kenjiArai 1:4a1eb0f32025 113 return id_number;
kenjiArai 1:4a1eb0f32025 114 }
kenjiArai 1:4a1eb0f32025 115
kenjiArai 1:4a1eb0f32025 116 uint8_t ADT7410::read_REV()
kenjiArai 1:4a1eb0f32025 117 {
kenjiArai 1:4a1eb0f32025 118 return rev_number;
kenjiArai 0:6ec4df1fa459 119 }
kenjiArai 0:6ec4df1fa459 120
kenjiArai 1:4a1eb0f32025 121 uint8_t ADT7410::who_am_i()
kenjiArai 0:6ec4df1fa459 122 {
kenjiArai 1:4a1eb0f32025 123 if (id_number == I_AM_ADT7410){
kenjiArai 1:4a1eb0f32025 124 return 1;
kenjiArai 1:4a1eb0f32025 125 } else {
kenjiArai 1:4a1eb0f32025 126 return 0;
kenjiArai 1:4a1eb0f32025 127 }
kenjiArai 0:6ec4df1fa459 128 }
kenjiArai 0:6ec4df1fa459 129
kenjiArai 1:4a1eb0f32025 130 /////////////// Read/Write specific register //////////////
kenjiArai 1:4a1eb0f32025 131 uint8_t ADT7410::read_reg_byte(uint8_t reg)
kenjiArai 0:6ec4df1fa459 132 {
kenjiArai 1:4a1eb0f32025 133 uint8_t dx[2];
kenjiArai 1:4a1eb0f32025 134
kenjiArai 1:4a1eb0f32025 135 dx[0] = reg;
kenjiArai 1:4a1eb0f32025 136 _i2c.write((int)ADT7410_addr, (char *)dx, 1, true);
kenjiArai 1:4a1eb0f32025 137 _i2c.read((int)ADT7410_addr, (char *)dx, 1);
kenjiArai 1:4a1eb0f32025 138 _i2c.stop();
kenjiArai 1:4a1eb0f32025 139 PRINTF("reg:0x%02x, data=0x%02x\r\n", reg, dx[0]);
kenjiArai 1:4a1eb0f32025 140 return dx[0];
kenjiArai 1:4a1eb0f32025 141 }
kenjiArai 1:4a1eb0f32025 142
kenjiArai 1:4a1eb0f32025 143 uint8_t ADT7410::write_reg_byte(uint8_t reg, uint8_t dt)
kenjiArai 1:4a1eb0f32025 144 {
kenjiArai 1:4a1eb0f32025 145 uint8_t dx[2];
kenjiArai 1:4a1eb0f32025 146
kenjiArai 1:4a1eb0f32025 147 dx[0] = reg;
kenjiArai 1:4a1eb0f32025 148 _i2c.write((int)ADT7410_addr, (char *)dx, 2);
kenjiArai 1:4a1eb0f32025 149 _i2c.stop();
kenjiArai 1:4a1eb0f32025 150 dx[1] = read_reg_byte(reg);
kenjiArai 1:4a1eb0f32025 151 PRINTF("reg:0x%02x, write/data=0x%02x, read/data=0x%02x\r\n", reg, dx[0], dx[1]);
kenjiArai 1:4a1eb0f32025 152 return dx[1];
kenjiArai 0:6ec4df1fa459 153 }
kenjiArai 0:6ec4df1fa459 154
kenjiArai 0:6ec4df1fa459 155 /////////////// Initialize ////////////////////////////////
kenjiArai 0:6ec4df1fa459 156 void ADT7410::init()
kenjiArai 0:6ec4df1fa459 157 {
kenjiArai 0:6ec4df1fa459 158 uint8_t dx[2];
kenjiArai 0:6ec4df1fa459 159
kenjiArai 0:6ec4df1fa459 160 dx[0] = ADT7410_A_CONFIG;
kenjiArai 1:4a1eb0f32025 161 dx[1] = RESOLUTION_13BIT + OPERATION_MODE_CONT;
kenjiArai 0:6ec4df1fa459 162 _i2c.write((int)ADT7410_addr, (char *)dx, 2);
kenjiArai 1:4a1eb0f32025 163 read_id_rev();
kenjiArai 0:6ec4df1fa459 164 }