Чтение значений x, y, z из LIS3DH по прерыванию с использованием nrf52, sdk 15 - PullRequest
0 голосов
/ 20 октября 2018

Я подключил Lis3dh на моей плате nrf52, используя интерфейс i2c.Я могу связаться с акселерометром и получить некоторые x, y, z показания. Эти данные позже отправляются в приложение через BLE.Я пробовал раздел 6.3.2 из примечаний по применению AN3308 датчика LIS3DH.Я пытался изменить чувствительность и порог, но все еще без изменений.Я использую фиксированный режим прерывания и читаю регистр состояния, как только установлен флаг прерывания.

Я постоянно получаю прерывания даже без встряхивания устройства.Также я заметил, что данные не имеют смысла, они продолжают колебаться даже в состоянии покоя.

Я заметил, что, если я не использую фиксированное прерывание, прерывание не происходит.

Ниже приведеноосновной файл кода моего проекта.Я делаю все инициализации и настройку акселерометра, затем захожу в бесконечный цикл, чтобы произошло прерывание.Я установил флаг interruptFlag в ISR вывода INT1.Этот флаг опрашивается в главном цикле.

int main(void)
{
    uint32_t err_code;
     int j=0;
     bool state =false;
     nrf_gpio_cfg_input(13, NRF_GPIO_PIN_PULLDOWN); //Pin 13 for interrupt pin

     uint8_t uiStatus=0;
    // Initialize.
    log_init();

    power_management_init();
    ble_stack_init();
    advertising_init();

     gpio_init(); //interrupt pin INT1 initialisation for change in state event

     twi_init(); //i2c initialisation
     data_Configuration(); //configure the LIS3dh
     nrf_delay_ms(500);
     read_Status_Reg();
     NRF_LOG_INFO("Waiting for interrupt");

    // Enter main loop.
   for (;;)
    {

      nrf_delay_ms(50);
     write_interrupt_cfg();
     nrf_delay_ms(50);

     if (interruptFlag) 
     {

        interruptFlag=false;
//        read_Ref_Reg(); //read reference register
//        nrf_delay_ms(500);
       read_Status_Reg(); //read status register
       nrf_delay_ms(500);
       read_sensor_data(); //read sensor data registers-all 6

       for (int i = 8; i < 14; i++) 
       {
         ble_data[i]=dataArray[j];       
         j++;
       }

        sd_ble_gap_adv_stop(m_adv_handle);

       //manuf_specific_data.company_identifier = APP_COMPANY_IDENTIFIER;
       manuf_specific_data.data.p_data = (uint8_t *)ble_data;
       manuf_specific_data.data.size = 14;
       advdata.name_type = BLE_ADVDATA_NO_NAME;

       advdata.p_manuf_specific_data = &manuf_specific_data;

       ble_advdata_encode(&advdata, m_adv_data.adv_data.p_data, &m_adv_data.adv_data.len);

       sd_ble_gap_adv_set_configure(&m_adv_handle, &m_adv_data, &m_adv_params);


       advertising_start();
          for (int i = 8; i < 14; i++) 
           {

          NRF_LOG_INFO("Data %d %d", i, ble_data[i]);
          NRF_LOG_PROCESS();
          }     
     }
    idle_state_handle();
   }

}

Ниже приведена функция конфигурации данных для Lis3dh

void data_Configuration(void)
{
  ret_code_t err_code;

    nrf_delay_ms(500);
   /* Writing to CTRL_REG1 to use all 3 axis----1Hz Normal Mode. */
    uint8_t reg1[2] = {CTRL_REG1, 0x57};
    err_code = nrf_drv_twi_tx(&m_twi, LIS3DH_ADDR, reg1, sizeof(reg1), false);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);

   nrf_delay_ms(500);

   uint8_t reg2[2] = {CTRL_REG2, 0x00}; //no high pass filter
  err_code = nrf_drv_twi_tx(&m_twi, LIS3DH_ADDR, reg2, sizeof(reg2), false);
  APP_ERROR_CHECK(err_code);
  while (m_xfer_done == false);

  nrf_delay_ms(500);

  uint8_t reg3[2] = {CTRL_REG3, 0x40}; //interrupt on int1
  err_code = nrf_drv_twi_tx(&m_twi, LIS3DH_ADDR, reg3, sizeof(reg3), false);
  APP_ERROR_CHECK(err_code);
  while (m_xfer_done == false);

  nrf_delay_ms(500);

   uint8_t reg4[2] = {CTRL_REG4, 0x00}; // +/- 2g, LSB first,
  err_code = nrf_drv_twi_tx(&m_twi, LIS3DH_ADDR, reg4, sizeof(reg4), false);
  APP_ERROR_CHECK(err_code);
  while (m_xfer_done == false);

  nrf_delay_ms(500);


  uint8_t reg_Ref[2] = {REFERENCE, 0x00}; //reference reg
  err_code = nrf_drv_twi_tx(&m_twi, LIS3DH_ADDR, reg_Ref, sizeof(reg_Ref), false);
  APP_ERROR_CHECK(err_code);
  while (m_xfer_done == false);

  nrf_delay_ms(500);

  uint8_t reg5[2] = {CTRL_REG5, 0x08}; // interrupt request latched
  err_code = nrf_drv_twi_tx(&m_twi, LIS3DH_ADDR, reg5, sizeof(reg5), false);
  APP_ERROR_CHECK(err_code);
  while (m_xfer_done == false);

  nrf_delay_ms(500);

  uint8_t reg6[2] = {CTRL_REG6, 0x00}; 
  err_code = nrf_drv_twi_tx(&m_twi, LIS3DH_ADDR, reg6, sizeof(reg6), false);
  APP_ERROR_CHECK(err_code);
  while (m_xfer_done == false);

  nrf_delay_ms(1000);

  uint8_t reg_ths[2] = {INT1_THS,0x10}; // threshold 250mg
  err_code = nrf_drv_twi_tx(&m_twi, LIS3DH_ADDR, reg_ths, sizeof(reg_ths), false);
  APP_ERROR_CHECK(err_code);
  while (m_xfer_done == false);

  nrf_delay_ms(1000);

  uint8_t reg_int[2] = {INT1_DURATION, 0x00}; // duration =0
  err_code = nrf_drv_twi_tx(&m_twi, LIS3DH_ADDR, reg_int, sizeof(reg_int), false);
  APP_ERROR_CHECK(err_code);
  while (m_xfer_done == false);

  nrf_delay_ms(1000);

  uint8_t reg_int_cfg[2] = {INT1_CFG, 0x3F}; // AOI=0 and x,y,z events
  err_code = nrf_drv_twi_tx(&m_twi, LIS3DH_ADDR, reg_int_cfg, sizeof(reg_int_cfg), false);
  APP_ERROR_CHECK(err_code);
  while (m_xfer_done == false);

}

Пожалуйста, дайте мне знать, если я сделал какие-либо неправильные настройки.Кроме того, задержка между конфигурацией данных не упоминается в DS, а также в примечаниях по применению.

...