This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Problems with Nordic 52832 and i2c lsm303dlhc

I am trying to read through the nordic 52832 i2c an accelerometer datum lsm303dlhc using the example "twi sensor".

The code used is written below.

Unfortunately, the code starts working but cannot read any data.

I use this electrical connections:

SDA: 26

SCL:27

#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"

/* TWI instance ID. */
#define TWI_INSTANCE_ID 0

/* Common addresses definition for lsm303 */
#define LSM303_ADDR (0x19U >> 1)

#define CTRL_REG1_A 0x20U
#define STATUS_REG_A 0x27U
#define OUT_X_L_A 0x28U
#define OUT_X_H_A 0x29U
#define OUT_Y_L_A 0x2AU
#define OUT_Y_H_A 0x2BU
#define OUT_Z_L_A 0x2CU
#define OUT_Z_H_A 0x2DU


/* 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] = {CTRL_REG1_A, STATUS_REG_A};
err_code = nrf_drv_twi_tx(&m_twi, LSM303_ADDR, reg, sizeof(reg), false);
APP_ERROR_CHECK(err_code);
while (m_xfer_done == false);

/* Writing to pointer byte. */
reg[0] = OUT_X_L_A;
m_xfer_done = false;
err_code = nrf_drv_twi_tx(&m_twi, LSM303_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, LSM303_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();

while (true)
{
nrf_delay_ms(500);

do
{
__WFE();
}while (m_xfer_done == false);

read_sensor_data();
NRF_LOG_FLUSH();
}
}

Reading the serial through "Putty" I read:

Can you help me? Thanks so much!!!

Parents Reply Children
No Data
Related