14#include <zephyr/drivers/i2c.h>
23#define BME68X_SHUTTLE_ID 0x93
36BME68X_INTF_RET_TYPE
bme68x_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len,
void *intf_ptr)
38 uint8_t device_addr = *(uint8_t*)intf_ptr;
42 return coines_read_i2c(COINES_I2C_BUS_0, device_addr, reg_addr, reg_data, (uint16_t)len);
48BME68X_INTF_RET_TYPE
bme68x_i2c_write(uint8_t reg_addr,
const uint8_t *reg_data, uint32_t len,
void *intf_ptr)
50 uint8_t device_addr = *(uint8_t*)intf_ptr;
54 return coines_write_i2c(COINES_I2C_BUS_0, device_addr, reg_addr, (uint8_t *)reg_data, (uint16_t)len);
60BME68X_INTF_RET_TYPE
bme68x_spi_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len,
void *intf_ptr)
62 uint8_t device_addr = *(uint8_t*)intf_ptr;
66 return coines_read_spi(COINES_SPI_BUS_0, device_addr, reg_addr, reg_data, (uint16_t)len);
72BME68X_INTF_RET_TYPE
bme68x_spi_write(uint8_t reg_addr,
const uint8_t *reg_data, uint32_t len,
void *intf_ptr)
74 uint8_t device_addr = *(uint8_t*)intf_ptr;
78 return coines_write_spi(COINES_SPI_BUS_0, device_addr, reg_addr, (uint8_t *)reg_data, (uint16_t)len);
87 coines_delay_usec(period);
98 case BME68X_E_NULL_PTR:
99 printf(
"API name [%s] Error [%d] : Null pointer\r\n", api_name, rslt);
101 case BME68X_E_COM_FAIL:
102 printf(
"API name [%s] Error [%d] : Communication failure\r\n", api_name, rslt);
104 case BME68X_E_INVALID_LENGTH:
105 printf(
"API name [%s] Error [%d] : Incorrect length parameter\r\n", api_name, rslt);
107 case BME68X_E_DEV_NOT_FOUND:
108 printf(
"API name [%s] Error [%d] : Device not found\r\n", api_name, rslt);
110 case BME68X_E_SELF_TEST:
111 printf(
"API name [%s] Error [%d] : Self test error\r\n", api_name, rslt);
113 case BME68X_W_NO_NEW_DATA:
114 printf(
"API name [%s] Warning [%d] : No new data found\r\n", api_name, rslt);
117 printf(
"API name [%s] Error [%d] : Unknown error code\r\n", api_name, rslt);
124 int8_t rslt = BME68X_OK;
125 struct coines_board_info board_info;
129 int16_t result = coines_open_comm_intf(COINES_COMM_INTF_USB, NULL);
130 if (result < COINES_SUCCESS)
133 "\n Unable to connect with Application Board ! \n" " 1. Check if the board is connected and powered on. \n" " 2. Check if Application Board USB driver is installed. \n"
134 " 3. Check if board is in use by another application. (Insufficient permissions to access USB) \n");
138 result = coines_get_board_info(&board_info);
141 setbuf(stdout, NULL);
144 if (result == COINES_SUCCESS)
149 "! Warning invalid sensor shuttle : 0x%x (Expected : 0x%x) \n ," "This application will not support this sensor \n",
150 board_info.shuttle_id,
155 (void)coines_set_shuttleboard_vdd_vddio_config(0, 0);
156 coines_delay_msec(100);
159 if (intf == BME68X_I2C_INTF)
161 printf(
"I2C Interface\n");
165 bme->intf = BME68X_I2C_INTF;
168 (void)coines_set_pin_config(COINES_SHUTTLE_PIN_SDO, COINES_PIN_DIRECTION_OUT, COINES_PIN_VALUE_LOW);
170 (void)coines_config_i2c_bus(COINES_I2C_BUS_0, COINES_I2C_STANDARD_MODE);
173 else if (intf == BME68X_SPI_INTF)
175 printf(
"SPI Interface\n");
179 bme->intf = BME68X_SPI_INTF;
180 (void)coines_config_spi_bus(COINES_SPI_BUS_0, COINES_SPI_SPEED_7_5_MHZ, COINES_SPI_MODE0);
183 coines_delay_msec(100);
185 (void)coines_set_shuttleboard_vdd_vddio_config(3300, 3300);
187 coines_delay_msec(100);
195 rslt = BME68X_E_NULL_PTR;
203 (void)fflush(stdout);
205 (void)coines_set_shuttleboard_vdd_vddio_config(0, 0);
206 coines_delay_msec(1000);
210 coines_delay_msec(1000);
211 (void)coines_close_comm_intf(COINES_COMM_INTF_USB, NULL);
228BME68X_INTF_RET_TYPE
bme68x_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len,
void *intf_ptr) {
229 uint8_t device_addr = *(uint8_t *)intf_ptr;
232 return i2c_read(
i2c_dev, reg_data, len, device_addr);
250BME68X_INTF_RET_TYPE
bme68x_i2c_write(uint8_t reg_addr,
const uint8_t *reg_data, uint32_t len,
void *intf_ptr) {
251 uint8_t device_addr = *(uint8_t *)intf_ptr;
254 return i2c_write(
i2c_dev, reg_data, len, device_addr);
271BME68X_INTF_RET_TYPE
bme68x_spi_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len,
void *intf_ptr) {
277 for (i = 0; i < len; i++)
287 for (i = 0; i < len; i++) {
301 return coines_read_spi(COINES_SPI_BUS_0, device_addr, reg_addr, reg_data, (uint16_t)len);
318BME68X_INTF_RET_TYPE
bme68x_spi_write(uint8_t reg_addr,
const uint8_t *reg_data, uint32_t len,
void *intf_ptr) {
324 buffer_tx[0] = reg_addr & BME68X_SPI_WR_MSK;
325 for (i = 0; i < len; i++) {
335 return coines_write_spi(COINES_SPI_BUS_0, device_addr, reg_addr, (uint8_t *)reg_data, (uint16_t)len);
351 k_sleep(K_USEC(period));
364 myPrintkS(
"BME688 API name [%s] OK\r\n", api_name, rslt);
367 case BME68X_E_NULL_PTR:
368 myPrintkS(
"BME688 API name [%s] Error [%d] : Null pointer\r\n", api_name, rslt);
370 case BME68X_E_COM_FAIL:
371 myPrintkS(
"BME688 API name [%s] Error [%d] : Communication failure\r\n", api_name, rslt);
373 case BME68X_E_INVALID_LENGTH:
374 myPrintkS(
"BME688 API name [%s] Error [%d] : Incorrect length parameter\r\n", api_name, rslt);
376 case BME68X_E_DEV_NOT_FOUND:
377 myPrintkS(
"BME688 API name [%s] Error [%d] : Device not found\r\n", api_name, rslt);
379 case BME68X_E_SELF_TEST:
380 myPrintkS(
"BME688 API name [%s] Error [%d] : Self test error\r\n", api_name, rslt);
382 case BME68X_W_NO_NEW_DATA:
383 myPrintkS(
"BME688 API name [%s] Warning [%d] : No new data found\r\n", api_name, rslt);
386 myPrintkS(
"BME688 API name [%s] Error [%d] : Unknown error code\r\n", api_name, rslt);
402 int8_t rslt = BME68X_OK;
439 if (intf == BME68X_I2C_INTF) {
444 bme->intf = BME68X_I2C_INTF;
452 else if (intf == BME68X_SPI_INTF) {
458 bme->intf = BME68X_SPI_INTF;
463 k_sleep(K_MSEC(100));
473 rslt = BME68X_E_NULL_PTR;
BME68X Sensor API header file.
#define BME68X_SHUTTLE_ID
BME68X shuttle board ID.
int8_t bme68x_interface_init(struct bme68x_dev *bme, uint8_t intf)
Function to select the interface between SPI and I2C.
BME68X_INTF_RET_TYPE bme68x_i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t len, void *intf_ptr)
Function for writing the sensor's registers through I2C bus.
void bme68x_check_rslt(const char api_name[], int8_t rslt)
Log BME68X API result and error details.
BME68X_INTF_RET_TYPE bme68x_spi_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, void *intf_ptr)
Function for reading the sensor's registers through SPI bus.
void bme68x_delay_us(uint32_t period, void *intf_ptr)
This function provides the delay for required time (Microsecond) as per the input provided in some of...
BME68X_INTF_RET_TYPE bme68x_spi_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t len, void *intf_ptr)
Function for writing the sensor's registers through SPI bus.
BME68X_INTF_RET_TYPE bme68x_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t len, void *intf_ptr)
Function for reading the sensor's registers through I2C bus.
void bme68x_coines_deinit(void)
Deinitializes coines platform.
struct spi_buf tx_bufs[]
SPI TX buffer structure.
const struct spi_buf_set rx
SPI RX buffer structure.
uint8_t buffer_rx[SPI_BUF_SIZE+8]
SPI receive buffer0.
const struct device *const spi_dev
const struct gpio_dt_spec spics2n
struct spi_config spi_cfg2
SPI configuration.
uint8_t buffer_tx[SPI_BUF_SIZE+8]
SPI transmit buffer.
struct spi_buf rx_bufs[]
SPI RX buffer structure.
const struct spi_buf_set tx
SPI TX buffer structure.
common struct, enum, externs, prototypes
int myPrintkS(char *restrict fmt,...)
prints a status message to the UART
const struct device *const i2c_dev
get the device structure for the I2C device defined by I2C_DEV_NODE