#include #include #include #include #include #include #define I2C_DEV "/dev/iic1" #define TMP102_ADDR (0x48 << 1) #define TMP102_CONF_EM (1 << 4) uint16_t read_reg(int fd, uint8_t reg) { uint8_t bytes[2]; int error; struct iic_rdwr_data data; struct iic_msg msgs[2] = { {0, IIC_M_WR | IIC_M_NOSTOP, 1, ®}, {0, IIC_M_RD | IIC_M_NOSTART, 2, bytes}, }; msgs[0].slave = TMP102_ADDR; msgs[1].slave = TMP102_ADDR; data.nmsgs = 2; data.msgs = msgs; error = ioctl(fd, I2CRDWR, &data); if (error) { perror("ioctl(I2CRDWR)"); return (0); } return ((bytes[0] << 8) | bytes[1]); } int reg_to_temp(uint16_t val, int extended) { int sign, temp; int bits; if (extended) { bits = 13; val >>= 3; } else val >>= 4; if (val & (1 << (bits - 1))) { sign = -1; val = (1 << bits) - val; } else sign = 1; temp = val * 1000 / 16; return (temp*sign); } int main(int argc, char **argv) { int fd; uint16_t conf, v; int em; fd = open(I2C_DEV, O_RDWR); if (fd < 0) { perror("open"); return (1); } conf = read_reg(fd, 1); em = ((conf & TMP102_CONF_EM) != 0); printf("CFG = %04x\n", conf); v = read_reg(fd, 0); printf("TMP = %d mC (%02x)\n", reg_to_temp(v, em), v); v = read_reg(fd, 2); printf("TMP_LOW = %d mC (%02x)\n", reg_to_temp(v, em), v); v = read_reg(fd, 3); printf("TMP_HIGH = %d mC (%02x)\n", reg_to_temp(v, em), v); close(fd); }