diff --git a/bme680.c b/bme680.c index 742d54a..78fe4a5 100644 --- a/bme680.c +++ b/bme680.c @@ -13,7 +13,8 @@ static void calc_press_comp(bme680_t *bme680); static void calc_hum_comp(bme680_t *bme680); -static int write_dev(bme680_t *bme680, uint8_t reg, uint8_t *src, uint32_t size) { +static int write_dev(bme680_t *bme680, uint8_t reg, uint8_t value) { + uint8_t tmp; if (BME680_IS_SPI(bme680->mode)) { @@ -23,15 +24,15 @@ static int write_dev(bme680_t *bme680, uint8_t reg, uint8_t *src, uint32_t size) } } - return bme680->dev.write(reg, src, size); + return bme680->dev.write(reg, value); } static int write_spi_page(bme680_t *bme680, uint8_t page_value) { uint8_t status_byte = (!!page_value) << 4; - - return bme680->dev.write(REG_STATUS, &status_byte, 1); + return bme680->dev.write(REG_STATUS, status_byte); } + static int read_dev(bme680_t *bme680, uint8_t reg, uint8_t *dst, uint32_t size) { uint8_t tmp; @@ -87,7 +88,7 @@ int bme680_reset(bme680_t *bme680) { uint8_t magic = 0xB6; int ret; - ret = write_dev(bme680, reg, &magic, 1); + ret = write_dev(bme680, reg, magic); usleep(5000); /* sleep for 5 ms */ return ret; } @@ -102,19 +103,19 @@ int bme680_start(bme680_t *bme680) { /* ctrl_meas. the last 0 is ticked on to enable forced mode, * but the config has to be written fist. strange behaviour. */ - meas = (bme680->cfg.osrs_t) << 5 | (bme680->cfg.osrs_p) << 2; - hum = bme680->cfg.osrs_h; - filter = (bme680->cfg.filter) << 2; + meas = bme680->cfg.osrs_t << 5 | bme680->cfg.osrs_p << 2; + hum = bme680->cfg.osrs_h; + filter = bme680->cfg.filter << 2; - err |= write_dev(bme680, REG_CTRL_MEAS, &meas, 1); - err |= write_dev(bme680, REG_CTRL_HUM, &hum, 1); - err |= write_dev(bme680, REG_CONFIG, &filter, 1); + err |= write_dev(bme680, REG_CTRL_MEAS, meas); + err |= write_dev(bme680, REG_CTRL_HUM, hum); + err |= write_dev(bme680, REG_CONFIG, filter); // TODO: gas stuff /* Now, re-send `meas' but LSb set to 1 to enable a forced conversion */ meas |= 1; - err |= write_dev(bme680, REG_CTRL_MEAS, &meas, 1); + err |= write_dev(bme680, REG_CTRL_MEAS, meas); return err; } @@ -137,7 +138,7 @@ int bme680_poll(bme680_t *bme680) { } while (((meas_status >> 5) & 1) && attempts++ < BME680_MAX_POLL_ATTEMPTS && !err); if (attempts == BME680_MAX_POLL_ATTEMPTS) { - err = 1; + err = 2; } return err; diff --git a/bme680.h b/bme680.h index 50ff679..8e93a09 100644 --- a/bme680.h +++ b/bme680.h @@ -14,14 +14,12 @@ #define BME680_MODE_INT 2 #define BME680_MODE_FLOAT 0 -#define BME680_MAX_XFER_SIZE 128 - /* config values */ -#define BME680_OVERSAMPLE_1X 0b001 -#define BME680_OVERSAMPLE_2X 0b010 -#define BME680_OVERSAMPLE_4X 0b011 -#define BME680_OVERSAMPLE_8X 0b100 -#define BME680_OVERSAMPLE_16X 0b101 +#define BME680_OVERSAMPLE_X1 0b001 +#define BME680_OVERSAMPLE_X2 0b010 +#define BME680_OVERSAMPLE_X4 0b011 +#define BME680_OVERSAMPLE_X8 0b100 +#define BME680_OVERSAMPLE_X16 0b101 /* IIR filter */ #define BME680_IIR_COEFF_0 0b000 @@ -38,8 +36,7 @@ struct bme680_dev { int (*init) (void); int (*read) (uint8_t reg, uint8_t *dst, uint32_t size); - int (*write) (uint8_t reg, uint8_t *src, uint32_t size); - int (*xfer) (uint8_t reg, uint8_t *src, uint8_t *dst, uint32_t size); + int (*write) (uint8_t reg, uint8_t value); int (*deinit) (void); }; diff --git a/i2c.c b/i2c.c index 0fb19a2..3ae9af2 100644 --- a/i2c.c +++ b/i2c.c @@ -7,6 +7,8 @@ #include #include +#include "i2c.h" + int i2c_init(const char *dev, uint8_t addr) { int fd = -1; @@ -26,30 +28,29 @@ int i2c_init(const char *dev, uint8_t addr) { } -int i2c_read_reg(int fd, uint8_t reg, uint8_t length, uint8_t *buf) { +int i2c_read_reg(int fd, uint8_t reg, uint8_t *dst, uint32_t size) { uint8_t cmd[2] = {reg, 0x00}; write(fd, cmd, 2); - if (read(fd, buf, length) != length) { + + if (read(fd, dst, size) != (ssize_t)size) { fprintf(stderr, "error read()\n"); - return 1; + return I2C_ERR; + } - return 0; + return I2C_OK; } -uint8_t i2c_read_reg2(int fd, uint8_t reg) { - uint8_t buf; - i2c_read_reg(fd, reg, 1, &buf); - return buf; -} int i2c_write_reg(int fd, uint8_t reg, uint8_t value) { uint8_t cmd[2] = {reg, value}; + if (write(fd, cmd, 2) != 2) { fprintf(stderr, "error write()\n"); - return 1; + return I2C_ERR; } - return 0; + + return I2C_OK; } diff --git a/i2c.h b/i2c.h index 753c63a..b1cb169 100644 --- a/i2c.h +++ b/i2c.h @@ -1,9 +1,13 @@ -#pragma once +#ifndef I2C_H +#define I2C_H #include -int i2c_init(const char *, uint8_t); -int i2c_read_reg(int, uint8_t, uint8_t, uint8_t *); -uint8_t i2c_read_reg2(uint8_t, uint8_t); -int i2c_write_reg(int, uint8_t, uint8_t); +#define I2C_OK 0 +#define I2C_ERR 1 +int i2c_init (const char *dev, uint8_t addr); +int i2c_read_reg (int fd, uint8_t reg, uint8_t *dst, uint32_t size); +int i2c_write_reg (int fd, uint8_t reg, uint8_t value); + +#endif diff --git a/main.c b/main.c index 6776354..b008f97 100644 --- a/main.c +++ b/main.c @@ -13,7 +13,7 @@ int i2c_dev_fd; int linux_i2c_init (void); int linux_i2c_read (uint8_t reg, uint8_t *dst, uint32_t size); -int linux_i2c_write (uint8_t reg, uint8_t *src, uint32_t size); +int linux_i2c_write (uint8_t reg, uint8_t value); int linux_i2c_deinit (void); int main() { @@ -26,7 +26,6 @@ int main() { bme680.dev.read = linux_i2c_read; bme680.dev.write = linux_i2c_write; bme680.dev.deinit = linux_i2c_deinit; - bme680.dev.xfer = NULL; /* 2. set the device mode */ mode = BME680_MODE_FLOAT | BME680_I2C; @@ -53,10 +52,10 @@ int main() { bme680_print_calibration(&bme680); /* 6. set up device config */ - bme680.cfg.osrs_t = BME680_OVERSAMPLE_16X; - bme680.cfg.osrs_p = BME680_OVERSAMPLE_16X; - bme680.cfg.osrs_h = BME680_OVERSAMPLE_8X; - bme680.cfg.filter = BME680_IIR_COEFF_63; + bme680.cfg.osrs_t = BME680_OVERSAMPLE_X16; + bme680.cfg.osrs_p = BME680_OVERSAMPLE_X16; + bme680.cfg.osrs_h = BME680_OVERSAMPLE_X8; + bme680.cfg.filter = BME680_IIR_COEFF_127; /* 7. write config to device and set off conversion */ if (bme680_start(&bme680) != 0) { @@ -100,12 +99,15 @@ int main() { return 0; } + // STUBS int linux_i2c_init (void) { - puts("linux_i2c_init"); - int ret = i2c_init(DEVICE, ADDRESS); - if (ret > 0) { + + int ret; + puts("i2c_init"); + + if ((ret = i2c_init(DEVICE, ADDRESS)) > 0) { i2c_dev_fd = ret; return 0; } @@ -115,20 +117,20 @@ int linux_i2c_init (void) { int linux_i2c_read (uint8_t reg, uint8_t *dst, uint32_t size) { - int i; - int ret; + uint32_t i; - printf("linux_i2c_read: %X (%d) [", reg, size); + printf("i2c_read: %.2X (%d) [", reg, size); - ret = i2c_read_reg(i2c_dev_fd, reg, (uint8_t)size, dst); - if (ret != 0) { - return -1; + if (i2c_read_reg(i2c_dev_fd, reg, dst, size) != I2C_OK) { + return 1; } for(i=0; i