I have established a connection with max30205, but I get only the first byte of temperature, how to read the second one? to get the tenths of a degree.
Now it works like:
start / address / reading / stop
ret_code_t err_code1 = nrf_drv_twi_rx(&m_twi, max30205_address , &m_sample, sizeof(m_sample));
APP_ERROR_CHECK(err_code1);
while (m_xfer_done == false)
I necessary need :
start / address / reading / reading / stop
What function should be used for this?
#include <stdio.h> #include "boards.h" #include "app_util_platform.h" #include "app_error.h" #include "nrf_drv_twi.h" #include "nrf_delay.h" //#include "nrf_twi_mngr.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" /* TWI instance ID. */ #define TWI_INSTANCE_ID 0 /* Common addresses definition for temperature sensor. */ #define LM75B_ADDR (0x90U >> 1) #define LM75B_REG_TEMP 0x00U #define LM75B_REG_CONF 0x01U #define LM75B_REG_THYST 0x02U #define LM75B_REG_TOS 0x03U /* 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 setting active mode on MMA7660 accelerometer. */ void LM75B_set_mode(void) { ret_code_t err_code; /* Writing to LM75B_REG_CONF "0" set temperature sensor in NORMAL mode. */ uint8_t reg[2] = {LM75B_REG_CONF, NORMAL_MODE}; err_code = nrf_drv_twi_tx(&m_twi, LM75B_ADDR, reg, sizeof(reg), false); APP_ERROR_CHECK(err_code); while (m_xfer_done == false); /* Writing to pointer byte. */ reg[0] = LM75B_REG_TEMP; m_xfer_done = false; err_code = nrf_drv_twi_tx(&m_twi, LM75B_ADDR, reg, 1, false); APP_ERROR_CHECK(err_code); while (m_xfer_done == false); } /** * @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.", temp); } /** * @brief TWI events handler. */ void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context) { switch (p_event->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_DRV_TWI_FREQ_100K, .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); } /** * @brief Function for reading data from temperature sensor. */ static void read_sensor_data() { m_xfer_done = false; /* Read 1 byte from the specified address - skip 3 bits dedicated for fractional part of temperature. */ ret_code_t err_code = nrf_drv_twi_rx(&m_twi, LM75B_ADDR, &m_sample, sizeof(m_sample)); APP_ERROR_CHECK(err_code); } /** * @brief Function for main application entry. */ int main(void) { APP_ERROR_CHECK(NRF_LOG_INIT(NULL)); NRF_LOG_DEFAULT_BACKENDS_INIT(); NRF_LOG_INFO("\r\nTWI sensor example started."); NRF_LOG_FLUSH(); twi_init(); LM75B_set_mode(); ret_code_t err_code; while (true) { nrf_delay_ms(500); do { __WFE(); }while (m_xfer_done == false); m_xfer_done = false; uint8_t reg[2] = {0x00U}; err_code = nrf_drv_twi_tx(&m_twi, 0x48U, reg, sizeof(reg), true); APP_ERROR_CHECK(err_code); while (m_xfer_done == false); nrf_delay_ms(5); m_xfer_done = false; ret_code_t err_code1 = nrf_drv_twi_rx(&m_twi, 0x48U, &m_sample, sizeof(m_sample)); APP_ERROR_CHECK(err_code1); while (m_xfer_done == false) NRF_LOG_FLUSH(); } } /** @} */