Skocz do zawartości

nRF24L01+ i IRQ - da się wykryć odebranie komunikatu?


ethanak

Pomocna odpowiedź

Ot taka prosta sprawa. Mam sobie wspomniany moduł (czyli nRF24L01+ jakby ktoś nie zauważył tematu), podpięty pin IRQ do odpowiednio skonfigurowanego pinu GPIO i próbuję zrobić coś w stylu: (pseudokod):

for (;;) {
	waitForInterrupt();
	while (radio.available()) {
  		odbierz_co_trzeba_i_przekaż_dalej();
	}
}

Niestety - wszelkie próby uruchomienia czegoś takiego kończą się niepowodzeniem. To znaczy przerwanie owszem jest czasem wywoływane, ale nie odnotowałem żadnej korelacji z odbieranymi komunikatami niezależnie od tego, co wstawiłem w radio.maskIRQ 🙂

Używam biblioteki maniacbuga na RPi z driverem SPIDEV - ale to chyba nie na znaczenia...

Ktoś coś wie na ten temat? Na Arduino mogłem się obejść bez przerwania, ale tu malinka ma inne rzeczy do roboty niż sprawdzać że nic nie odebrano...

Aha, cała reszta kodu działa prawidłowo, zresztą program jest tak trywialny że trudno błąd popełnić (odbierz sygnał z radia i przekaż na lokalny port UDP).

Link do komentarza
Share on other sites

"Reszta kodu działa prawidłowo" tzn. pakiety są odbierane poprawnie, moduły się widzą i odsyłają sobie ACK, CRC się zgadza a parametry radiowe, adresy, pipe'y itd są wzajemnie odpowiednie, tak?

No to zakładając, że rozumiesz działanie modułu to szukałbym w bibliotece. Nie wiemy jak jej używasz. Czy np. poprawnie ustawia ona bity w rejestrze masek przerwań. Bo sam pin robi się niski z trzech jasno określonych powodów (odsyłam do datasheet). Każdy z nich możesz osobno zablokować, więc ustawienie tylko bitu MASK_RX_DR zrobi zero na pinie Maliny, gdy odebrany pakiet wejdzie do FIFO. Jak rozumiem, biblioteka przerwań nie używa, a rzeczy jakie musi(sz) zrobić w jego obsłudze (by się skasowało i było gotowe na następne zdarzenie tego samego typu) są trochę inne niż normalny odczyt danych z FIFO.

https://www.sparkfun.com/datasheets/Components/SMD/nRF24L01Pluss_Preliminary_Product_Specification_v1_0.pdf

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dzięki za datasheeta - jakoś to coś co znalazłem było "nieco" niekompletne i brakowało najważniejszego kawałka 🙂

Przerzuciłem całą robotę do handlera przerwania, po krótkim teście stwierdziłem, że chyba działa i tak to na razie zostawię. Podejrzewam, że coś jest nie tak z waitForInterrupt w wersji drivera SPIDEV (bo co prawda czekać to czeka, ale nie zawsze przestaje) , ale nie mam zamiaru się z tym użerać.

Dzięki za pomoc!

 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.