12-22-2020 06:26 PM - edited 12-22-2020 06:30 PM
Hi,
I am implementing the BME680 on a project. I am trying it with the STM32F407 dev board using SPI1.
I can not read any data, could you help me? I really don't know what am i missing.
- Drivers: https://github.com/BoschSensortec/BME680_driver
Code Snippet:
void main(){
bme680_start(&gas_sensor);
uint16_t meas_period = 180;
bme680_get_profile_dur(&meas_period, &gas_sensor);
HAL_Delay(meas_period);
while(1){
bme680_get_sensor_data(&data, &gas_sensor);
t680 = (uint32_t) data.temperature / 100.0;
h680 = (uint32_t) data.humidity / 1000.0;
p680 = (uint32_t) data.pressure / 1000.0;
// Trigger the next measurement if you would like to read data out continuously
if(gas_sensor.power_mode == BME680_FORCED_MODE) bme680_set_sensor_mode(&gas_sensor);
HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_14);//toggle led
HAL_Delay(meas_period);
}
/* ----- USER FUNCTIONS ------ */
void bme680_start(struct bme680_dev * gas_sensor){
/* You may assign a chip select identifier to be handled later */
gas_sensor->dev_id = 0;
gas_sensor->intf = BME680_SPI_INTF;
gas_sensor->read = user_spi_read;
gas_sensor->write = user_spi_write;
gas_sensor->delay_ms = user_delay_ms;
gas_sensor->amb_temp = 20;
int8_t rslt = BME680_OK;
rslt = bme680_init(gas_sensor);
/* Set the temperature, pressure and humidity settings */
gas_sensor->tph_sett.os_hum = BME680_OS_2X;
gas_sensor->tph_sett.os_pres = BME680_OS_4X;
gas_sensor->tph_sett.os_temp = BME680_OS_8X;
gas_sensor->tph_sett.filter = BME680_FILTER_SIZE_3;
/* Set the remaining gas sensor settings and link the heating profile */
gas_sensor->gas_sett.run_gas = BME680_ENABLE_GAS_MEAS;
/* Create a ramp heat waveform in 3 steps */
gas_sensor->gas_sett.heatr_temp = 320; /* degree Celsius */
gas_sensor->gas_sett.heatr_dur = 150; /* milliseconds */
/* Select the power mode */
/* Must be set before writing the sensor configuration */
gas_sensor->power_mode = BME680_FORCED_MODE;
/* Set the required sensor settings needed */
uint8_t set_required_settings;
set_required_settings = BME680_OST_SEL | BME680_OSP_SEL | BME680_OSH_SEL | BME680_GAS_SENSOR_SEL | BME680_FILTER_SEL;
/* Set the desired sensor configuration */
rslt = bme680_set_sensor_settings(set_required_settings,gas_sensor);
/* Set the power mode */
rslt = bme680_set_sensor_mode(gas_sensor);
}
void user_delay_ms(uint32_t period)
{
HAL_Delay(period);
}
int8_t user_spi_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
{
int8_t rslt = 0;
dev_id = 0;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET); //CS low
HAL_SPI_Transmit(&hspi1, ®_addr, 1, 100);
HAL_SPI_Receive(&hspi1, reg_data, len, 100);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET); //cs high
return rslt;
}
int8_t user_spi_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
{
int8_t rslt = 0;
dev_id = 0;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET); //cs low
HAL_SPI_Transmit(&hspi1, ®_addr, 1, 150);
HAL_SPI_Transmit(&hspi1, reg_data, len, 150);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET); //cs high
return rslt;
}
This image show the results:
meas_period = 183ms, t680 = 42949672, p680 = 22
03-30-2021 11:13 AM
Hello Pranay_Mohod,
This is my SPI code for your reference.
uint8_t GTXBuffer[512], GRXBuffer[2048];
int8_t SensorAPI_SPIx_Read(uint8_t slave_address7, uint8_t subaddress, uint8_t *pBuffer, uint16_t ReadNumbr)
{
slave_address7 = slave_address7;
GTXBuffer[0] = subaddress | 0x80;
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET); // NSS low
HAL_SPI_TransmitReceive(&SPI_HANDLE, GTXBuffer, GRXBuffer, ReadNumbr+1, BUS_TIMEOUT); // timeout 1000msec;
while(SPI_HANDLE.State == HAL_SPI_STATE_BUSY); // wait for xmission complete
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET); // NSS high
memcpy(pBuffer, GRXBuffer+1, ReadNumbr);
return 0;
}
int8_t SensorAPI_SPIx_Write(uint8_t slave_address7, uint8_t subaddress, uint8_t *pBuffer, uint16_t WriteNumbr)
{
slave_address7 = slave_address7;
GTXBuffer[0] = subaddress & 0x7F;
memcpy(>XBuffer[1], pBuffer, WriteNumbr);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET); // NSS low
HAL_SPI_Transmit(&SPI_HANDLE, GTXBuffer, WriteNumbr+1, BUS_TIMEOUT); // send register address + write data
while(SPI_HANDLE.State == HAL_SPI_STATE_BUSY); // wait for xmission complete
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET); // NSS high
return 0;
}