From b540def4b1c9f3b0a246bb8861fe00a9401e80a3 Mon Sep 17 00:00:00 2001 From: Johann Fischer Date: Mon, 26 Jan 2015 15:56:24 +0100 Subject: [PATCH] drivers/hdc1000: Acquire exclusive access to I2C bus and minor bug fixes fix doxygen warnings change default address --- drivers/hdc1000/hdc1000.c | 23 +++++++++++++++++++++++ drivers/include/hdc1000.h | 11 ++++++++--- tests/driver_hdc1000/main.c | 2 ++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/drivers/hdc1000/hdc1000.c b/drivers/hdc1000/hdc1000.c index 1ab96924f2..8c26ff9372 100644 --- a/drivers/hdc1000/hdc1000.c +++ b/drivers/hdc1000/hdc1000.c @@ -67,9 +67,13 @@ int hdc1000_test(hdc1000_t *dev) char reg[2]; uint16_t tmp; + i2c_acquire(dev->i2c); if (i2c_read_regs(dev->i2c, dev->addr, HDC1000_MANUFACTURER_ID, reg, 2) != 2) { + i2c_release(dev->i2c); return -1; } + i2c_release(dev->i2c); + tmp = ((uint16_t)reg[0] << 8) | reg[1]; if (tmp != HDC1000_MID_VALUE) { return -1; @@ -87,10 +91,13 @@ int hdc1000_init(hdc1000_t *dev, i2c_t i2c, uint8_t address) dev->addr = address; dev->initialized = false; + i2c_acquire(dev->i2c); /* initialize the I2C bus */ if (i2c_init_master(i2c, I2C_SPEED) < 0) { + i2c_release(dev->i2c); return -1; } + i2c_release(dev->i2c); if (hdc1000_test(dev)) { return -2; @@ -101,11 +108,14 @@ int hdc1000_init(hdc1000_t *dev, i2c_t i2c, uint8_t address) reg[0] = (uint8_t)(tmp >> 8); reg[1] = (uint8_t)tmp; + i2c_acquire(dev->i2c); if (i2c_write_regs(dev->i2c, dev->addr, HDC1000_CONFG, reg, 2) != 2) { + i2c_release(dev->i2c); return -3; } dev->initialized = true; + i2c_release(dev->i2c); return 0; } @@ -117,9 +127,13 @@ int hdc1000_reset(hdc1000_t *dev) reg[1] = (uint8_t)tmp; dev->initialized = false; + i2c_acquire(dev->i2c); if (i2c_write_regs(dev->i2c, dev->addr, HDC1000_CONFG, reg, 2) != 2) { + i2c_release(dev->i2c); return -1; } + + i2c_release(dev->i2c); return 0; } @@ -128,13 +142,18 @@ int hdc1000_startmeasure(hdc1000_t *dev) if (dev->initialized == false) { return -1; } + + i2c_acquire(dev->i2c); /* Trigger the measurements by executing a write access * to the address 0x00 (HDC1000_TEMPERATURE). * Conversion Time is 6.50ms by 14 bit resolution. */ if (i2c_write_bytes(dev->i2c, dev->addr, HDC1000_TEMPERATURE, 1) != 1) { + i2c_release(dev->i2c); return -1; } + + i2c_release(dev->i2c); return 0; } @@ -145,13 +164,17 @@ int hdc1000_read(hdc1000_t *dev, uint16_t *rawtemp, uint16_t *rawhum) if (dev->initialized == false) { return -1; } + + i2c_acquire(dev->i2c); if (i2c_read_bytes(dev->i2c, dev->addr, buf, 4) != 4) { + i2c_release(dev->i2c); return -1; } /* Register bytes are sent MSB first. */ *rawtemp = ((uint16_t)buf[0] << 8) | buf[1]; *rawhum = ((uint16_t)buf[2] << 8) | buf[3]; + i2c_release(dev->i2c); return 0; } diff --git a/drivers/include/hdc1000.h b/drivers/include/hdc1000.h index d971a1a1b1..005ec41f69 100644 --- a/drivers/include/hdc1000.h +++ b/drivers/include/hdc1000.h @@ -18,7 +18,10 @@ * be started by a write access to the address 0x00 * (HDC1000_TEMPERATURE). After completing the measurement * the sensor will return to sleep mode. Typical - * Conversion Time by 14 bit resolution is 6.50ms. + * Conversion Time by 14 bit resolution is 6.50ms + * for humidity and 6.35ms for temperature. + * HDC1000_CONVERSION_TIME is twice as large to prevent + * the problems with timer resolution. * * @{ * @@ -41,11 +44,11 @@ extern "C" #endif #ifndef HDC1000_I2C_ADDRESS -#define HDC1000_I2C_ADDRESS 0x41 +#define HDC1000_I2C_ADDRESS 0x43 /**< Default Device Address */ #endif #ifndef HDC1000_CONVERSION_TIME -#define HDC1000_CONVERSION_TIME 6500 +#define HDC1000_CONVERSION_TIME 26000 /**< Default Conversion Time */ #endif /** @@ -109,6 +112,8 @@ int hdc1000_startmeasure(hdc1000_t *dev); * @brief Read sensor's data. * * @param[in] dev device descriptor of sensor + * @param[out] rawtemp raw temperature value + * @param[out] rawhum raw humidity value * * @return 0 on success * @return -1 on error diff --git a/tests/driver_hdc1000/main.c b/tests/driver_hdc1000/main.c index d00d0c9265..d07722cf89 100644 --- a/tests/driver_hdc1000/main.c +++ b/tests/driver_hdc1000/main.c @@ -56,6 +56,7 @@ int main(void) return -1; } vtimer_usleep(HDC1000_CONVERSION_TIME); + hdc1000_read(&dev, &rawtemp, &rawhum); printf("Raw data T: %5i RH: %5i\n", rawtemp, rawhum); @@ -63,6 +64,7 @@ int main(void) printf("Data T: %d RH: %d\n", temp, hum); vtimer_usleep(SLEEP); + } return 0;