Skocz do zawartości

Błąd __digitalRead(): IO 19 is not set as GPIO. podczas odczytu z pinu obsługującego SPI


rade

Pomocna odpowiedź

Czy ktoś może wie jak to obejść?

Temat jest taki, że po przejściu na boardy 3.x.x przestała działać bibliotekaSmartRC-CC1101, której używamy w Supli do odczytów liczników obsługujących WMBUS bo zmienili obsługę GPIO i zaczęli sprawdzać funkcję poszczególnych GPIO... Skutkuje to tym, że odczyt przez digitalRead z GPIO SPI przestał działać, a to właśnie wykorzystuje biblioteka. Wpisy na githubie o tym:

https://github.com/LSatan/SmartRC-CC1101-Driver-Lib/issues/163

https://github.com/espressif/arduino-esp32/issues/10370

 

Czego próbowałem to ustawianie pinMode przed digitalRead/Write ale to nic nie zmienia, gpio_reset_pin((gpio_num_t)MISO_PIN), niby nie rzuca już błędu, ale za to nie działa biblioteka. Można pewnie analizować dalej logikę biblioteki i może wtedy używać SPI bez dodatkowych odczytów/zapisów ale jakoś wątpię, że to się uda 😕 Alternatywnie przejść na inną bibliotekę do CC1101 jak RadioLib ale to ta sama droga, że trzeba w pełni zrozumieć co tam się dzieje.

  • Lubię! 1
Link do komentarza
Share on other sites

18 godzin temu, rade napisał:

Skutkuje to tym, że odczyt przez digitalRead z GPIO SPI przestał działać

Co to jest GPIO SPI ?

Albo nóżkę definiujesz jako GPIO, albo podłączasz (konfiguracyjnie oczywiście) do interfejsu SPI. Nie może spełniać dwóch funkcji jednocześnie.

Link do komentarza
Share on other sites

19 minut temu, kostuch napisał:

Co to jest GPIO SPI ?

Albo nóżkę definiujesz jako GPIO, albo podłączasz (konfiguracyjnie oczywiście) do interfejsu SPI. Nie może spełniać dwóch funkcji jednocześnie.

Biblioteka do CC1101 sprawdza stan pinu np. MISO poprzez digitalRead, w nowych boardach wymusili stan o którym piszesz ale w starych boardach to było możliwe, spójrz poniżej:

https://github.com/LSatan/SmartRC-CC1101-Driver-Lib/blob/b8c6af4c7c2214cd77a4e9b2e2cb37b24b393605/ELECHOUSE_CC1101_SRC_DRV.cpp#L191

Link do komentarza
Share on other sites

(edytowany)

Ale po co sprawdzać ten stan?

Chodzi o to, żeby nie było żadnej transmisji z urządzenia, jak chcemy mu coś wysłać? To coś samo z siebie transmituje i esp jest SLAVE?

 

A tak ogólnie to widziałbym dwa "obejścia":

Ustawić inny pin jako wejście GPIO, zewrzeć go z MISO i sprawdzać jego stan zamiast MISO.

albo

Zrobić SPI jako bitbanging, bezpośrednio manipulując pinami.

 

Edytowano przez kostuch
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

1 godzinę temu, kostuch napisał:

Ale po co sprawdzać ten stan?

Chodzi o to, żeby nie było żadnej transmisji z urządzenia, jak chcemy mu coś wysłać? To coś samo z siebie transmituje i esp jest SLAVE?

 

A tak ogólnie to widziałbym dwa "obejścia":

Ustawić inny pin jako wejście GPIO, zewrzeć go z MISO i sprawdzać jego stan zamiast MISO.

albo

Zrobić SPI jako bitbanging, bezpośrednio manipulując pinami.

 

Niestety nie wiem czemu tak , stąd też ciężko coś zmienić jak się nie rozumie biblioteki .

 

Opcja z innym gpio to sprytny pomysł jak się to ma na pająku , bo z gotowymi urządzeniami nie przejdzie 😕

 

Co masz na myśli z tym bitbanging ? Zmianę funkcji danego pinu przed digitalRead i potem zmiana na miso przed komunikacja SPI ?

Link do komentarza
Share on other sites

17 godzin temu, rade napisał:

Opcja z innym gpio to sprytny pomysł jak się to ma na pająku , bo z gotowymi urządzeniami nie przejdzie 😕

W esp32 masz coś takiego jak IO_MUX

Możesz w nim podefiniować co jest podłączone do fizycznej nóżki. Jeżeli się nie mylę, to można logicznie "zlutować" dwa sygnały.

Nie pamiętam, chyba to: gpio_matrix_in()

 

17 godzin temu, rade napisał:

 

Co masz na myśli z tym bitbanging ? Zmianę funkcji danego pinu przed digitalRead i potem zmiana na miso przed komunikacja SPI ?

Chodzi o zrobienie transmisji SPI z pominięciem sprzętowego układu i sterowanie pinami programowo. Działa dużo wolniej, ale działa.

 

Można ewentualnie "w locie" włączać i wyłączać sprzętowe SPI (SPI.begin SPI.end) i wtedy nóżki na przemian stają się zwykłymi GPIO albo interfejsem.

  • Lubię! 1
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.