Hi,
I am trying to read LIS3DH accelerometer with my nRF52832. I am using a custom board. Is there any tutorial or example that can help me? After some changes in the code, I tried "twi_sensor" example.
#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_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" #define LSM6_ADD (0XD6U >> 1) #define G_EARTH 9.80665 #define GAUSS_TO_TESLAS 100 #define TWI_INSTANCE_ID 0 static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID); static volatile bool m_xfer_done = false; typedef union { int16_t data[3]; int8_t buff[6]; } data_int_convert_t; typedef struct { float x; float y; float z; float gain; } axis_data_t; axis_data_t axis_data_lsm6_a; axis_data_t axis_data_lsm6_g; 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) { } m_xfer_done = true; break; default: break; } } void twi_init (void) { ret_code_t err_code; const nrf_drv_twi_config_t twi_vnet_config = { .scl = 14, .sda = 15, .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_vnet_config, twi_handler, NULL); APP_ERROR_CHECK(err_code); nrf_drv_twi_enable(&m_twi); } void twi_reg_write(uint8_t addr, uint8_t *reg, uint16_t length) { m_xfer_done = false; uint32_t err_code; err_code = nrf_drv_twi_tx(&m_twi, addr, reg, 2, false); APP_ERROR_CHECK(err_code); while (m_xfer_done == false){ } } void twi_reg_read_t(uint8_t const addr, uint8_t reg, uint8_t *value, uint16_t length, uint32_t delay) { uint32_t err_code; uint8_t buff[2]; m_xfer_done = false; err_code = nrf_drv_twi_tx(&m_twi, addr, ®, sizeof(reg), false); APP_ERROR_CHECK(err_code); m_xfer_done = false; nrf_delay_us(delay); err_code = nrf_drv_twi_rx(&m_twi, addr, value, length); APP_ERROR_CHECK(err_code); } void LSM6_CFG(void) { uint8_t reg[2] = {0x10, 0x80}; m_xfer_done = false; uint32_t err_code; twi_reg_write(LSM6_ADD, reg, 2); printf("LSM6 CFG"); reg[0] = 0x11; reg[1] = 0x80; twi_reg_write(LSM6_ADD, reg, 2); reg[0] = 0x12; reg[1] = 0x04; twi_reg_write(LSM6_ADD, reg, 2); /* 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); } static void LSM6_Read(void) { uint8_t i = 0; data_int_convert_t data_cnv_lsm6_a; data_int_convert_t data_cnv_lsm6_g; uint8_t reg[2] = {0x28, 0x22}; twi_reg_read_t(LSM6_ADD, reg[0], data_cnv_lsm6_a.buff, 6, 1300); nrf_delay_us(1000); //twi_reg_read_t(LSM6_ADD, reg[1], data_cnv_lsm6_g.buff, 6, 1300); axis_data_lsm6_a.gain = 0.061 / 1000.0; axis_data_lsm6_a.x = (float)data_cnv_lsm6_a.data[0] * axis_data_lsm6_a.gain * G_EARTH; axis_data_lsm6_a.y = (float)data_cnv_lsm6_a.data[1] * axis_data_lsm6_a.gain * G_EARTH; axis_data_lsm6_a.z = (float)data_cnv_lsm6_a.data[2] * axis_data_lsm6_a.gain * G_EARTH; axis_data_lsm6_g.gain = 8.75 / 1000.0; axis_data_lsm6_g.x = (float)data_cnv_lsm6_g.data[0] * axis_data_lsm6_g.gain; axis_data_lsm6_g.y = (float)data_cnv_lsm6_g.data[1] * axis_data_lsm6_g.gain; axis_data_lsm6_g.z = (float)data_cnv_lsm6_g.data[2] * axis_data_lsm6_g.gain; NRF_LOG_INFO("\r\nTWI leitura do sensor feita."); } 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(); LSM6_CFG(); printf("leitura do sensor feita"); while (true) { NRF_LOG_FLUSH(); LSM6_Read(); nrf_delay_ms(1000); } }
But, in line 79, "m_xfer_done" is always false and I can't get any measure.
Thanks in advance,
Gabriel