NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Tu możesz pisać o swoich problemach z pisaniem programów w języku C dla AVR.
StaryAnoda

NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: StaryAnoda » wtorek 11 lip 2017, 18:07

Hej

Mam zagwozdkę i chciałem Was zapytać czy mój to rozumowania jest poprawny. Chciałbym uruchomić transmisję dwóch układów NRF24L01+, bez używania przerwań wiem że jest taka możliwość. I tak może ktoś mi sprawdzić następujące ustawienia zarówno dla odbiornika ?

Odbiornik:
Ustawiam:
CONFIG: PRIM_RX, PWR_UP,
RX_PW_P0 na 32

I to tyle potem sprawdzam wartość rejestru
STATUS a dokładnie RX_DR
Jeżeli jest 1 to odbieram dane z rejestru R_RX_PAYLOAD
Potem kasuję flagę RX_DR

W jakim stanie ma być pin CE ?

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1096
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: Antystatyczny » wtorek 11 lip 2017, 18:17

W odbiorniku trzymasz CE w stanie wysokim tak długo, jak długo chcesz coś odbierać. Gdy CE będzie w stanie niskim, odbiornik przejdzie do stanu "standby". A propos zdarzenia RX_DR. Gdy wychwycisz RX_DR, musisz odebrać dane komendą RX_R_PAYLOAD, a następnie sprawdzić, czy w FIFO są jeszcze jakieś odebrane ramki. Jeśli są, one również muszą zostać odczytane.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

StaryAnoda

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: StaryAnoda » wtorek 11 lip 2017, 18:55

Ok a w przypadku nadajnika :
CONFIG: PWR_UP
FEATURE: EN_DYN_ACK

Czyszczę bufor FLUSH_TX

Wrzucam dane do W_TX_PAYLOAD_NO_ACK

Stan niski na pinie CE przez 10 us

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1096
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: Antystatyczny » wtorek 11 lip 2017, 18:59

Na pinie CE ma być stan WYSOKI na co najmniej 10µs. Gdy paczka wyjdzie z nadajnika, pojawi się TX_DS. Tę flagę należy skasować (i użyć do własnych celów, o ile potrzebujesz)
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

StaryAnoda

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: StaryAnoda » wtorek 11 lip 2017, 19:21

Ok teraz mam pytanie:

Czy to jest poprawne wysyłanie pojedyńczych znaków(wersja testowa)

Kod: Zaznacz cały

   Send_String("NRF24L01+ TX");

   NRF24L01P_PowerCmd(NRF24L01P_State_Enabled);
   SET_EN_DYN_ACK();
   DIGITAL_IO_SetOutputHigh(&ChSe);
   int32_t I;
   while(1U)
   {
      DIGITAL_IO_SetOutputLow(&ChSe);
      DIGITAL_IO_SetOutputLow(&CSN);
      SPI_WriteReadByte( FLUSH_TX);
      DIGITAL_IO_SetOutputHigh(&CSN);

      DIGITAL_IO_SetOutputLow(&CSN);
      SPI_WriteReadByte(W_TX_PAYLOAD_NO_ACK);
      SPI_WriteReadByte('B');
      SPI_WriteReadByte('A');
      SPI_WriteReadByte('R');
      SPI_WriteReadByte('T');
      DIGITAL_IO_SetOutputHigh(&CSN);
      DIGITAL_IO_SetOutputHigh(&ChSe);
      for(I = 10000; I; I--)
      {
      }

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1096
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: Antystatyczny » wtorek 11 lip 2017, 19:29

Moim zdaniem coś tu masz źle. Przede wszystkim pin CSN służy do uruchamiania komunikacji przez SPI. Gdy już prześlesz komendy przez SPI, może jakieś dane, czy coś, pin CSN idzie w górę, co ma zakończyć komunikację przez SPI. Kolejnym krokiem (pod warunkiem, że wszystko już masz poustawiane), jest wystawienie na co najmniej 10µs stanu wysokiego na pin CE. Nie myl go, proszę, z pinem CSN. Niepokoi mnie ta sekwencja czynności w pętli głównej. Machasz w niej pinem CSN, a pin CE ustawiasz w stan niski, co powoduje, że nadajnik pozostaje w trybie standby. Aha, w jakim celu non stop czyścisz TX FIFO?
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1096
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: Antystatyczny » wtorek 11 lip 2017, 20:23

Wspomniałeś na czacie, bym Ci ogarnął ten kawałek softu, ale nie widząc reszty trudno jest coś modyfikować. Mam jednak inną propozycję. Wrzucę Ci baaaardzo wczesne wersje softów do nadajnika i odbiornika, a Ty to sobie pooglądasz, ok? W razie czego podpytasz o jakieś niezrozumiałe drobiazgi.

Spakowane projekty:

NRF24L01P_ATmega32_TX_RX_NO_ACK.zip
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

StaryAnoda

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: StaryAnoda » piątek 14 lip 2017, 21:32

Ok

Jak zwykle kolego Antystatyczny dzięki za pomoc. Twój soft był bardzo pomocny.
Błędów było kilka:
Niepotrzebne czyszczenie flagi TX FIFO,
Złe sterowanie pinem CE,
Niepoprawny sposób odczytu i zapisu danych z rejestru FIFO,

To by było tyle odnośnie takich poważniejszych błędów.

Podziękowania składam również koledze mokrowskiemu, za pomoc z formatowaniem tekstu (porzuceniem funkcji strcat na rzecz snprintf)

Odbiornik:
ATmega 32
20170714_205330.jpg


Nadajnik:
XMC1100-Q024F0064
HTS221
Sterownik ładowania akumulatorów
Akumulatorki
Przetwornica Step-UP
20170714_210240.jpg
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1096
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: Antystatyczny » sobota 15 lip 2017, 00:48

A NRF puściłeś z przerwaniami, czy ręcznie monitorujesz status?
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

StaryAnoda

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: StaryAnoda » sobota 15 lip 2017, 10:21

Ręcznie monitoruję rejestr STATUS-u. Co wiążę się z tym, że transmisja jest blokująca.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1096
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: Antystatyczny » sobota 15 lip 2017, 11:55

Ok, rozumiem. Jeśli nie masz zbyt wysoko ustawionego parametru MAX_RT, to nie powinno być problemów. Gdybyś jednak chciał wykorzystać przerwania, to możemy nad tym popracować :)
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

StaryAnoda

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: StaryAnoda » sobota 15 lip 2017, 18:46

To miło, że oferujesz pomoc :)
Mam jeszcze jedną zagwozdkę i nie wiem czy Ty kolego też tak masz mianowicie, gdy wysyłam cały czas stringa BARTEK a następnie wgram od nowa program z taką uwagą, że chcę wysyłać string BARTOSZ to po wgraniu, kilka pierwszych odebranych stringów to BARTEK dopiero potem zaczynam odbieram nowy string w tym wypadku BARTOSZ. Dodam, że fizycznie po wgraniu nowego programu nie resetuję modułów czy to normalne ? Czy Ty Anty też tak masz w swoich modułach ?

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1096
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: Antystatyczny » sobota 15 lip 2017, 18:49

Najprawdopodobniej wysyłają Ci się jeszcze pakiety zgromadzone w 3 poziomach FIFO, choć pewności nie mam. Po wgraniu nowego softu NRF wymaga pełnej inicjalizacji, a to znaczy, że musiałbyś zrobić Flush TX, pokasować flagi przerwań itd... Masz go przywrócić do stanu "tuż po włączeniu zasilania". U mnie było tak, że po wgraniu softu moduł głupiał, blokował się. Przyczyną były niepokasowane flagi.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

StaryAnoda

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: StaryAnoda » sobota 15 lip 2017, 19:00

Ok kasowanie bufora zniwelowało ten problem, najrozsądniej i tak będzie moim zdanie sterować zasilaniem tego modułu z procesora.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1096
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: NRF24L01+ Transmisja jeden do jednego bez przerwań jak zrealizować ?

Postautor: Antystatyczny » sobota 15 lip 2017, 19:02

Przy zasilaniu bateryjnym raczej nie będzie takiej potrzeby, bo każda wymiana baterii spowoduje zresetowanie NRF'a.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.


Wróć do „Programowanie AVR w C”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości