Beware that this post is related to an SDK in maintenance mode
More Info: Consider nRF Connect SDK for new designs
This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

LIS2DH12 driver issue in nRF SDK v15.0

Hi,

There are several new drivers under "nRF5_SDK_15.0.0_a53641a\components\drivers_ext\", but no example now.

I have setup the HTS221 driver and it works. I turn to LIS2DH12 driver, but it not work.

For send and receive more i2c data then HTS221, I change some Marco like this:

#define MAX_PENDING_TRANSACTIONS    33

#define LIS2DH12_MIN_QUEUE_SIZE       32

And read who_am_i successfully.

when try to read accelerate data, it stuck in somewhere, where I cannot traced.

Could you kindly share with me a example, which is using the new LIS2DH12 driver?

  • More information here:

    Define and configuration:

    #define TWI_INSTANCE_ID             0
    
    #define MAX_PENDING_TRANSACTIONS    33
    
    #define LIS2DH12_MIN_QUEUE_SIZE       32
    
    NRF_TWI_MNGR_DEF(m_nrf_twi_mngr, MAX_PENDING_TRANSACTIONS, TWI_INSTANCE_ID);
    
    NRF_TWI_SENSOR_DEF(m_nrf_twi_sensor, &m_nrf_twi_mngr, LIS2DH12_MIN_QUEUE_SIZE);
    
    LIS2DH12_INSTANCE_DEF(m_lis2dh12, &m_nrf_twi_sensor, LIS2DH12_BASE_ADDRESS_LOW);
    
    
    ...
    
        LIS2DH12_DATA_CFG(m_lis2dh12, LIS2DH12_ODR_100HZ, false, 1, 1, 1, LIS2DH12_SCALE_2G, 1);
        LIS2DH12_FIFO_CFG(m_lis2dh12, false, LIS2DH12_BYPASS, false, 0x00);
    
        err_code = lis2dh12_init(&m_lis2dh12);
        APP_ERROR_CHECK(err_code);
    
    ...
    
    
    

    after that,

    lis2dh12_data_read(&m_lis2dh12, lis2dh12_data_read_cb, &accel_data, sizeof(accel_data));

  • New commit:

    I found the reason of this Hard fault is that, I use 

    lis2dh12_data_read(&m_lis2dh12, lis2dh12_data_read_cb, &accel_data, sizeof(accel_data));

    but the last parameter was multi by 6 inside lis2dh12 driver, so it's bigger than LIS2DH12_MIN_QUEUE_SIZE.

    So I change is to 1 and it work.

    But I still have question, How big can I set the "LIS2DH12_MIN_QUEUE_SIZE". And do I need to set MAX_PENDING_TRANSACTIONS bigger than LIS2DH12_MIN_QUEUE_SIZE?

  • Hello,

    I am sorry for the late reply.

    I don't have a LIS2DH sensor to test any of this on, but the parameters: LIS2DH12_MIN_QUEUE_SIZE and MAX_PENDING_TRANSACTIONS means the following in the application:

    NRF_TWI_MNGR_DEF(..., MAX_PENDING_TRANSACTIONS, ...)

    The second parameter of NRF_TWI_MNGR_DEF(...) is the size of the transaction queue. See NRF_TWI_MNGR_DEF() on infocenter.

     

    NRF_TWI_SENSOR_DEF(..., ..., LIS2DH12_MIN_QUEUE_SIZE)

    The third parameter of NRF_TWI_SENSOR_DEF(...) is the buffer size of the TWI communication for that sensor. See NRF_TWI_SENSOR_DEF() on infocenter.

     

    Again, I haven't got any LIS2DH sensor to test this on, so I haven't tested this driver before. But I suppose that the sensor def is the queue of a single transaction in bytes, while the TWI_MNGR_DEF is the max number of pending transactions.

     

    Best regards,

    Edvin

  • Hi ,

    I'm too trying to setup the LIS2DH12 driver to read out the WHO_AM_I register. I've adapted the twi_sensor example code according to my needs and your code snippets. Due to some previous issues when compiling I used the sdk_config.h from the twi_master_using_nrf_twi_mngr example.

    When I run the attached code the application starts, runs to the "Here." debug print, crashes and resets to continue in an endless cycle.

    Would you mind sharing a minimal example on how to read out the WHO_AM_I register using the drivers or point me in a general direction to keep searching?

    /* TWI instance ID. */
    #define TWI_INSTANCE_ID             0
    #define MAX_PENDING_TRANSACTIONS    33
    #define LIS2DH12_MIN_QUEUE_SIZE     32
    
    NRF_TWI_MNGR_DEF(m_nrf_twi_mngr, MAX_PENDING_TRANSACTIONS, TWI_INSTANCE_ID);
    NRF_TWI_SENSOR_DEF(m_nrf_twi_sensor, &m_nrf_twi_mngr, LIS2DH12_MIN_QUEUE_SIZE);
    LIS2DH12_INSTANCE_DEF(m_lis2dh12, &m_nrf_twi_sensor, LIS2DH12_BASE_ADDRESS_HIGH);
    
    static uint8_t m_sample = 0;
    
    void print_identity(ret_code_t r, void *p_register_data)
    {
        NRF_LOG_INFO("Identity: %d", *((uint8_t *)p_register_data));
    }
    
    /**
     * @brief Function for main application entry.
     */
    int main(void)
    {
        APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
        NRF_LOG_DEFAULT_BACKENDS_INIT();
    
        NRF_LOG_INFO("TWI sensor example started.");
        NRF_LOG_FLUSH();
    
        ret_code_t err = lis2dh12_init(&m_lis2dh12);
        NRF_LOG_INFO("Here.");
        NRF_LOG_FLUSH();
        APP_ERROR_CHECK(err);
        while (true)
        {
            nrf_delay_ms(500);
            err = lis2dh12_who_am_i_read(&m_lis2dh12, print_identity, &m_sample);
            APP_ERROR_CHECK(err);
            NRF_LOG_FLUSH();
        }
    }
    

  • Maybe you could check the err from :

    ret_code_t err = lis2dh12_init(&m_lis2dh12);

    What is it?

     

    BR,

    Edvin

Related