Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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

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

(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
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 ?

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

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