Я подключил 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, а также в примечаниях по применению.