/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved. * * The information contained herein is property of Nordic Semiconductor ASA. * Terms and conditions of usage are described in detail in NORDIC * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. * * Licensees are granted free, non-transferable use of the information. NO * WARRANTY of ANY KIND is provided. This heading must NOT be removed from * the file. * */ /** @file * @defgroup tw_sensor_example main.c * @{ * @ingroup nrf_twi_example * @brief TWI Sensor Example main file. * * This file contains the source code for a sample application using TWI. * */ #include #include "boards.h" #include "app_util_platform.h" #include "app_error.h" #include "nrf_drv_twi.h" #include "nrf_delay.h" #define NRF_LOG_MODULE_NAME "APP" #include "nrf_log.h" #include "nrf_log_ctrl.h" struct bme280_calibration_param_t cal_param; /* TWI instance ID. */ #define TWI_INSTANCE_ID 0 /*calibration parameters */ #define BME280_TEMPERATURE_CALIB_DIG_T1_LSB_REG (0x88) #define BME280_TEMPERATURE_CALIB_DIG_T1_MSB_REG (0x89) #define BME280_TEMPERATURE_CALIB_DIG_T2_LSB_REG (0x8A) #define BME280_TEMPERATURE_CALIB_DIG_T2_MSB_REG (0x8B) #define BME280_TEMPERATURE_CALIB_DIG_T3_LSB_REG (0x8C) #define BME280_TEMPERATURE_CALIB_DIG_T3_MSB_REG (0x8D) #define BME280_PRESSURE_CALIB_DIG_P1_LSB_REG (0x8E) #define BME280_PRESSURE_CALIB_DIG_P1_MSB_REG (0x8F) #define BME280_PRESSURE_CALIB_DIG_P2_LSB_REG (0x90) #define BME280_PRESSURE_CALIB_DIG_P2_MSB_REG (0x91) #define BME280_PRESSURE_CALIB_DIG_P3_LSB_REG (0x92) #define BME280_PRESSURE_CALIB_DIG_P3_MSB_REG (0x93) #define BME280_PRESSURE_CALIB_DIG_P4_LSB_REG (0x94) #define BME280_PRESSURE_CALIB_DIG_P4_MSB_REG (0x95) #define BME280_PRESSURE_CALIB_DIG_P5_LSB_REG (0x96) #define BME280_PRESSURE_CALIB_DIG_P5_MSB_REG (0x97) #define BME280_PRESSURE_CALIB_DIG_P6_LSB_REG (0x98) #define BME280_PRESSURE_CALIB_DIG_P6_MSB_REG (0x99) #define BME280_PRESSURE_CALIB_DIG_P7_LSB_REG (0x9A) #define BME280_PRESSURE_CALIB_DIG_P7_MSB_REG (0x9B) #define BME280_PRESSURE_CALIB_DIG_P8_LSB_REG (0x9C) #define BME280_PRESSURE_CALIB_DIG_P8_MSB_REG (0x9D) #define BME280_PRESSURE_CALIB_DIG_P9_LSB_REG (0x9E) #define BME280_PRESSURE_CALIB_DIG_P9_MSB_REG (0x9F) #define BME280_HUMIDITY_CALIB_DIG_H1_REG (0xA1) #define BME280_HUMIDITY_CALIB_DIG_H2_LSB_REG (0xE1) #define BME280_HUMIDITY_CALIB_DIG_H2_MSB_REG (0xE2) #define BME280_HUMIDITY_CALIB_DIG_H3_REG (0xE3) #define BME280_HUMIDITY_CALIB_DIG_H4_MSB_REG (0xE4) #define BME280_HUMIDITY_CALIB_DIG_H4_LSB_REG (0xE5) #define BME280_HUMIDITY_CALIB_DIG_H5_MSB_REG (0xE6) #define BME280_HUMIDITY_CALIB_DIG_H6_REG (0xE7) /* Mode for LM75B. */ #define NORMAL_MODE 0U /* Indicates if operation on TWI has ended. */ static volatile bool m_xfer_done = false; /* TWI instance. */ static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID); /* Buffer for samples read from temperature sensor. */ static uint8_t m_sample; /** * @brief Function for handling data from temperature sensor. * * @param[in] temp Temperature in Celsius degrees read from sensor. */ __STATIC_INLINE void data_handler(uint8_t temp) { NRF_LOG_INFO("Temperature: %d Celsius degrees.\r\n", temp); } struct bme280_calibration_param_t { uint16_t dig_T1;/**type) { case NRF_DRV_TWI_EVT_DONE: if (p_event->xfer_desc.type == NRF_DRV_TWI_XFER_RX) { data_handler(m_sample); } m_xfer_done = true; break; default: break; } } /** * @brief UART initialization. */ void twi_init (void) { ret_code_t err_code; const nrf_drv_twi_config_t twi_lm75b_config = { .scl = ARDUINO_SCL_PIN, .sda = ARDUINO_SDA_PIN, .frequency = NRF_TWI_FREQ_400K, .interrupt_priority = APP_IRQ_PRIORITY_HIGH, .clear_bus_init = false }; err_code = nrf_drv_twi_init(&m_twi, &twi_lm75b_config, twi_handler, NULL); APP_ERROR_CHECK(err_code); nrf_drv_twi_enable(&m_twi); } ret_code_t read_sensor_data(uint8_t slave_addr, uint8_t reg_addr, uint8_t * m_sample, uint32_t bytes) { m_xfer_done = false; ret_code_t err_code = nrf_drv_twi_tx(&m_twi,slave_addr, ®_addr,1,false); if(err_code != NRF_SUCCESS) { return err_code; } nrf_delay_ms(10); /* Read 1 byte from the specified address - skip 3 bits dedicated for fractional part of temperature. */ err_code = nrf_drv_twi_rx(&m_twi,slave_addr, m_sample, bytes); return err_code; APP_ERROR_CHECK(err_code); nrf_delay_ms(10); } /** * @brief Function for writing to registers on the MPU-6050. */ ret_code_t write_sensor_data(uint8_t reg_addr, uint8_t data, uint8_t bytes) { ret_code_t ret_code; uint8_t tx_data[2]; tx_data[0] = reg_addr; tx_data[1] = data; ret_code = nrf_drv_twi_tx(&m_twi,0x76, tx_data, sizeof(tx_data), false); return ret_code; } uint8_t read16(uint16_t reg) { uint8_t tmp; uint8_t value; nrf_delay_ms(10); read_sensor_data(0x76,reg,(uint8_t*)&value, sizeof(value)); nrf_delay_ms(10); return value; } ret_code_t calibratebme280(void) { cal_param.dig_T1 = ((int16_t)((read16(BME280_TEMPERATURE_CALIB_DIG_T1_MSB_REG) << 8) | read16(BME280_TEMPERATURE_CALIB_DIG_T1_LSB_REG))); cal_param.dig_T2 = ((int16_t)((read16(BME280_TEMPERATURE_CALIB_DIG_T2_MSB_REG) << 8) | read16(BME280_TEMPERATURE_CALIB_DIG_T2_LSB_REG))); cal_param.dig_T3 = ((int16_t)((read16(BME280_TEMPERATURE_CALIB_DIG_T3_MSB_REG) << 8) | read16(BME280_TEMPERATURE_CALIB_DIG_T3_LSB_REG))); cal_param.dig_P1 = ((uint16_t)((read16(BME280_PRESSURE_CALIB_DIG_P1_MSB_REG) << 8) | read16(BME280_PRESSURE_CALIB_DIG_P1_LSB_REG))); cal_param.dig_P2 = ((int16_t)((read16(BME280_PRESSURE_CALIB_DIG_P2_MSB_REG) << 8) | read16(BME280_PRESSURE_CALIB_DIG_P2_LSB_REG))); cal_param.dig_P3 = ((int16_t)((read16(BME280_PRESSURE_CALIB_DIG_P3_MSB_REG) << 8) | read16(BME280_PRESSURE_CALIB_DIG_P3_LSB_REG))); cal_param.dig_P4 = ((int16_t)((read16(BME280_PRESSURE_CALIB_DIG_P4_MSB_REG) << 8) | read16(BME280_PRESSURE_CALIB_DIG_P4_LSB_REG))); cal_param.dig_P5 = ((int16_t)((read16(BME280_PRESSURE_CALIB_DIG_P5_MSB_REG) << 8) | read16(BME280_PRESSURE_CALIB_DIG_P5_LSB_REG))); cal_param.dig_P6 = ((int16_t)((read16(BME280_PRESSURE_CALIB_DIG_P6_MSB_REG) << 8) | read16(BME280_PRESSURE_CALIB_DIG_P6_LSB_REG))); cal_param.dig_P7 = ((int16_t)((read16(BME280_PRESSURE_CALIB_DIG_P7_MSB_REG) << 8) | read16(BME280_PRESSURE_CALIB_DIG_P7_LSB_REG))); cal_param.dig_P8 = ((int16_t)((read16(BME280_PRESSURE_CALIB_DIG_P8_MSB_REG) << 8) | read16(BME280_PRESSURE_CALIB_DIG_P8_LSB_REG))); cal_param.dig_P9 = ((int16_t)((read16(BME280_PRESSURE_CALIB_DIG_P9_MSB_REG) << 8) | read16(BME280_PRESSURE_CALIB_DIG_P9_LSB_REG))); cal_param.dig_H1 = ((uint8_t)(read16(BME280_HUMIDITY_CALIB_DIG_H1_REG))); cal_param.dig_H2 = ((int16_t)((read16(BME280_HUMIDITY_CALIB_DIG_H2_MSB_REG) << 8) | read16(BME280_HUMIDITY_CALIB_DIG_H2_LSB_REG))); cal_param.dig_H3 = ((int8_t)(read16(BME280_HUMIDITY_CALIB_DIG_H3_REG))); cal_param.dig_H4 = ((int16_t)((read16(BME280_HUMIDITY_CALIB_DIG_H4_MSB_REG) << 4) | (read16(BME280_HUMIDITY_CALIB_DIG_H4_LSB_REG) &0x0F))); cal_param.dig_H5 = ((int16_t)((read16(BME280_HUMIDITY_CALIB_DIG_H5_MSB_REG) << 4) | ((read16(BME280_HUMIDITY_CALIB_DIG_H4_LSB_REG) >> 4) &0x0F))); cal_param.dig_H6 = ((uint8_t)(read16(BME280_HUMIDITY_CALIB_DIG_H6_REG))); } /**@brief Function for application main entry. */ int main(void) { uint32_t err_code; bool erase_bonds; uint8_t val; int i; uint8_t value[2]; // Initialize. err_code = NRF_LOG_INIT(NULL); APP_ERROR_CHECK(err_code); NRF_LOG_INFO("Running\r\n"); twi_init(); write_sensor_data(0xF4,0x01,2); val = read16(0xF4); calibratebme280(); for(i=0;i<1000;i++) { } nrf_delay_ms(2000); }