Skocz do zawartości

ESP07S - GPIO wejście nie reaguje


atlantis86

Pomocna odpowiedź

Zabrałem się właśnie za pisanie kodu do jednego projektu, który jakiś czas temu odłożyłem na półkę. Urządzenie zbudowane w oparciu o ESP07S, ale kod nie jest pisany w oparciu o Arduino, tylko SDK RTOS od Espressif.

Na wejściach GPIO14 oraz GPIO5 mam przerwania, które mają być wyzwalane opadającym zboczem. To pierwsze będzie po prostu uruchamiało co sekundę przerwanie od układu RTC, a w tym drugim będą zliczane pojawiające się nieregularnie impulsy. Kod testowy jest oparty na przykładach z GitHuba Espressif:

#define GPIO_INPUT_RTC		14
#define GPIO_INPUT_VAL		5
#define GPIO_INPUT_PIN_SEL 	((1ULL<<GPIO_INPUT_RTC) | (1ULL<<GPIO_INPUT_VAL))

uint32_t uptime = 0;
uint16_t val = 0;


void gpio_isr_rtc_handler (void *arg) {
	uptime++;
    // Tak naprawdę jest jeszcze trochę kodu związanego z ustawieniem semafora
    // jednak to nie ma znaczenia, bo to przerwanie działa prawidłowo
}


void gpio_isr_val_handler (void *arg) {
	val++;
} 


void app_main() {

    gpio_config_t io_conf;
    //interrupt of rising edge
    io_conf.intr_type = GPIO_INTR_NEGEDGE;
    //bit mask of the pins
    io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;
    //set as input mode
    io_conf.mode = GPIO_MODE_INPUT;
    //enable pull-up mode
    io_conf.pull_up_en = 1;
    gpio_config(&io_conf);  
    
    //install gpio isr service
    gpio_install_isr_service(0);
    //hook isr handler for specific gpio pin
    gpio_isr_handler_add(GPIO_INPUT_RTC, gpio_isr_rtc_handler, NULL);
    //hook isr handler for specific gpio pin
    gpio_isr_handler_add(GPIO_INPUT_VAL, gpio_isr_val_handler, NULL);   
  
    //Reszta funkcji main, nie mająca zwiazku z przerwaniami
}

Powyższy przykład nie zawiera części kodu, który w tym wypadku nie ma znaczenia i działa w 100% prawidłowo - mam tam np. task, który jest wybudzany semaforem z funkcji obsługującej przerwanie RTC (GPIO14) i to z niego drukowana jest wartość zmiennych.

Na czym polega problem? Przerwanie GPIO14 działa prawidłowo, natomiast zmienna "val" nie jest inkrementowana, nawet pomimo ręcznego zwierania linii GPIO5 do masy. Żeby było ciekawiej, wszystko zaczyna działać jeśli tymczasowo podmienię w kodzie GPIO5 na GPIO0 - wtedy przerwania są już rejestrowane.

Z ciekawości sprawdziłem, czy w ogóle mogę odczytać stan niski na tym wejściu i wychodzi na to, że nie. Funkcja gpio_get_level(GPIO_INPUT_VAL) cały czas zwraca 1, nawet jeśli linia jest zwarta z masą.

Przychodzą mi do głowy następujące możliwości:

  1. Coś jest nie tak z moim kodem.
  2. Istnieją jakieś ograniczenia związane ze stosowaniem GPIO5 w trybie wejścia, jednak nie mogę znaleźć niczego, co by potwierdzało taką hipotezę. Wręcz przeciwnie - wychodzi na to, że GPIO5 jest jednym z "najbezpieczniejszych" pinów, który podczas resetu znajduje się w stanie wysokiej impedancji.
  3. Trafił mi się uszkodzony moduł...

Trzecia opcja wydaje mi się najbardziej prawdopodobna, jednak wolę się upewnić, zanim zamówię kolejny egzemplarz ESP-07S (chwilowo mi się skończyły) i zacznę rozgrzewać hot aira (moduł jest na stałe wlutowany w płytkę własnego projektu).

EDIT: W szufladzie udało mi się znaleźć jeszcze jeden egzemplarz ESP07S. Po podmianie problem występuje, więc o ile nie trafiły mi się dwie sztuki z jakiejś trefnej serii, to hipotezę o uszkodzeniu modułu można chyba wykluczyć.

EDIT2: Ok, gdyby ktoś kiedyś natknął się na podobnym problem, to udało mi się znaleźć przyczynę. Problem był banalny - okazuje się, że trafiły mi się ESP07S z drobnym błędem. Wyjścia GPIO4 i GPIO5 są odwrócone w stosunku do oznaczeń na soldermasce (oraz pinoutu podawanego w Internecie). Z tego powodu po prostu cały czas sprawdzałem nie ten pin co trzeba. Podmienienie w kodzie GPIO5 na GPIO4 rozwiązało problem.

Edytowano przez atlantis86
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.