From d1527d19a35e990a62f7f1b3d24989c2d23e8ace Mon Sep 17 00:00:00 2001 From: William Clark Date: Sun, 5 Nov 2023 23:43:43 +0000 Subject: [PATCH] cleanup. i2c now its own unit. will do same for spi. --- i2c.c | 31 ++++++++++++++------- i2c.h | 7 +++-- main.c | 87 +++++++--------------------------------------------------- 3 files changed, 35 insertions(+), 90 deletions(-) diff --git a/i2c.c b/i2c.c index 3ae9af2..de21faa 100644 --- a/i2c.c +++ b/i2c.c @@ -9,26 +9,30 @@ #include "i2c.h" -int i2c_init(const char *dev, uint8_t addr) { - int fd = -1; +#define I2C_DEVICE "/dev/i2c-1" +#define I2C_BME680_ADDRESS 0x77 - fd = open(dev, O_RDWR); +static int fd; + +int i2c_init(void) { + + fd = open(I2C_DEVICE, O_RDWR); if (fd < 0) { - fprintf(stderr, "could not open device: %s\n", dev); - return -1; + fprintf(stderr, "could not open device: %s\n", I2C_DEVICE); + return I2C_ERR; } - if (ioctl(fd, I2C_SLAVE, addr) < 0) { + if (ioctl(fd, I2C_SLAVE, I2C_BME680_ADDRESS) < 0) { fprintf(stderr, "failed to acquire bus/talk to slave\n"); close(fd); - return -1; + return I2C_ERR; } - return fd; + return I2C_OK; } -int i2c_read_reg(int fd, uint8_t reg, uint8_t *dst, uint32_t size) { +int i2c_read(uint8_t reg, uint8_t *dst, uint32_t size) { uint8_t cmd[2] = {reg, 0x00}; write(fd, cmd, 2); @@ -42,7 +46,7 @@ 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) { +int i2c_write(uint8_t reg, uint8_t value) { uint8_t cmd[2] = {reg, value}; @@ -54,3 +58,10 @@ int i2c_write_reg(int fd, uint8_t reg, uint8_t value) { return I2C_OK; } +int i2c_deinit(void) { + if (fd) { + close(fd); + } + + return I2C_OK; +} diff --git a/i2c.h b/i2c.h index b1cb169..2843694 100644 --- a/i2c.h +++ b/i2c.h @@ -6,8 +6,9 @@ #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); +int i2c_init (void); +int i2c_read (uint8_t reg, uint8_t *dst, uint32_t size); +int i2c_write (uint8_t reg, uint8_t value); +int i2c_deinit (void); #endif diff --git a/main.c b/main.c index 7d5454b..f91f6b8 100644 --- a/main.c +++ b/main.c @@ -6,18 +6,8 @@ #include "bme680.h" #include "i2c.h" -#define DEVICE "/dev/i2c-1" -#define ADDRESS 0x77 - -#define AMBIENT_TEMP_GUESS 25.0 -#define HEATER_TARGET 320.0 - -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 value); -int linux_i2c_deinit (void); +#define AMBIENT_TEMP_GUESS 19.0 +#define HEATER_TARGET 300.0 int main(void) { @@ -26,10 +16,10 @@ int main(void) { int i; /* 1. Assign functions for interacting with the device */ - bme680.dev.init = linux_i2c_init; - bme680.dev.read = linux_i2c_read; - bme680.dev.write = linux_i2c_write; - bme680.dev.deinit = linux_i2c_deinit; + bme680.dev.init = i2c_init; + bme680.dev.read = i2c_read; + bme680.dev.write = i2c_write; + bme680.dev.deinit = i2c_deinit; /* 2. set the device mode */ mode = BME680_MODE_FLOAT | BME680_I2C | BME680_ENABLE_GAS; @@ -73,14 +63,15 @@ int main(void) { /* initial heating current for the setpoint. Could be useful in cold places.. */ /* 7-bit word. Each step/lsb is equiv. to 1/8 mA; so max 16 mA */ + /* a value of 20 would be equal to 2.5 mA */ /* this s.p. field is allowed to be left as 0 if no preload is required. */ - bme680.cfg.idac_heat[i] = BME680_IDAC(20); + bme680.cfg.idac_heat[i] = BME680_IDAC(0); /* define the time between the start of heating and start of resistance sensing in this s.p.*/ /* Bosch datasheet suggests ~30 - 40ms is usually all that is required to get up to temp. */ - /* 60 * 16 = 960 ms wait before sampling resistance starts. */ + /* 50 * X4 = 200 ms wait before sampling resistance starts. */ /* the first value is 6-bit (0...64) with 1 ms step size. */ - bme680.cfg.gas_wait[i] = BME680_GAS_WAIT(60, BME680_GAS_WAIT_X16); + bme680.cfg.gas_wait[i] = BME680_GAS_WAIT(50, BME680_GAS_WAIT_X4); } /* The BME680 does not cycle between setpoints. They have to be manually set. */ @@ -143,61 +134,3 @@ int main(void) { return 0; } - -// STUBS - -int linux_i2c_init (void) { - - int ret; - puts("i2c_init"); - - if ((ret = i2c_init(DEVICE, ADDRESS)) > 0) { - i2c_dev_fd = ret; - return 0; - } - - return 1; -} - -int linux_i2c_read (uint8_t reg, uint8_t *dst, uint32_t size) { - - uint32_t i; - - printf("i2c_read: %.2X (%d) [", reg, size); - - if (i2c_read_reg(i2c_dev_fd, reg, dst, size) != I2C_OK) { - return 1; - } - - for(i=0; i