ESP32 не отвечает на прерывание от датчика — пример кода

В настоящее время я использую ESP32 devkit и датчик MPU-9250.

Я использую библиотеку из GitHub для обоих отсюда:
https://github.com/natanaeljr/esp32-MPU-driver:

Я сейчас запускаю пример mpu_real https://github.com/natanaeljr/esp32-MPU-driver/blob/master/examples/mpu_real/main/mpu_real.cpp

Предполагается, что в этом примере данные считываются из буфера FIFO в MPU-9250, когда в буфере есть данные.

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

uint32_t notificationValue = ulTaskNotifyTake(pdTRUE, portMAX_DELAY);

в цикле чтения в задаче mpuTask ().

Я определил, что он ожидает уведомления от функции mpuISR (); Я поместил лог в mpuISR () и отметил, что это никогда не звонил.

Оглядываясь назад в mpuTask (), мы должны запустить mpuISR ():

    constexpr gpio_config_t kGPIOConfig{
.pin_bit_mask = (uint64_t) 0x1 << kInterruptPin,
.mode         = GPIO_MODE_INPUT,
.pull_up_en   = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_ENABLE,
.intr_type    = GPIO_INTR_POSEDGE  //
};
gpio_config(&kGPIOConfig);
gpio_install_isr_service(ESP_INTR_FLAG_IRAM);
gpio_isr_handler_add((gpio_num_t) kInterruptPin, mpuISR,
xTaskGetCurrentTaskHandle());
ESP_ERROR_CHECK(MPU.setInterruptConfig(kInterruptConfig));
ESP_ERROR_CHECK(MPU.setInterruptEnabled(mpud::INT_EN_RAWDATA_READY));

Таким образом, в основном он конфигурирует вывод (в данном случае GPIO 17) для получения прерывания и создает обработчик для запуска mpuISR () при получении прерывания, а затем настраивает MPU9250 для отправки прерывания, когда данные находятся в регистрах. За исключением того, что он этого не делает.

Некоторые вещи, которые я отметил:

  1. Если я закомментирую оскорбительную строку, тогда данные читаются правильно
    из буфера
    — однако, это не идеально — мое возможное использование
    случай будет собрать все образцы в течение определенного периода времени в
    файл, а не просто прочитать последнее значение из буфера, который либо
    переполняется, когда вы не читаете достаточно быстро или если вы читаете слишком
    быстро ничего полезного не вернет.
  2. Я использовал осциллограф на выводе прерывания и получил прямоугольную волну, которая, я думаю, указывает на то, что прерывание на датчике было настроено правильно?

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

Заранее спасибо!

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector