{"id":1571,"date":"2020-06-24T20:00:13","date_gmt":"2020-06-24T18:00:13","guid":{"rendered":"http:\/\/msalamon.pl\/?p=1571"},"modified":"2020-07-11T16:04:59","modified_gmt":"2020-07-11T14:04:59","slug":"komunikacja-radiowa-z-uzyciem-modulow-nrf24l01-cz-3","status":"publish","type":"post","link":"https:\/\/msalamon.pl\/komunikacja-radiowa-z-uzyciem-modulow-nrf24l01-cz-3\/","title":{"rendered":"Komunikacja radiowa z u\u017cyciem modu\u0142\u00f3w nRF24L01+ cz.3"},"content":{"rendered":"
Pokaza\u0142em Ci do tej pory jak korzysta\u0107 z nRF24L01<\/a> przy pomocy pollingu oraz zacz\u0105\u0142em ju\u017c co\u015b dzia\u0142a\u0107 z przerwaniami. Tak dok\u0142adniej to u\u017cy\u0142em przerwania od odbioru danych, aby przychodz\u0105ce dane odczyta\u0107 z uk\u0142adu zamiast ci\u0105g\u0142ego odpytywania uk\u0142adu, czy ju\u017c co\u015b przysz\u0142o. Niby niewiele, ale zawsze by\u0142 to jaki\u015b stracony czas na komunikacj\u0119 z uk\u0142adem. Co, gdyby wykorzysta\u0107 w pe\u0142ni potencja\u0142 przerwa\u0144?<\/p>\n Przypominam Ci r\u00f3wnie\u017c, \u017ce modu\u0142y nRF24 mo\u017cesz kupi\u0107 bezpo\u015brednio u mnie<\/a> jednocze\u015bnie mnie wspieraj\u0105c.<\/strong><\/p>\n <\/a>Ca\u0142a seria o nRF24L01+<\/a>:<\/p>\n W naszym uk\u0142adzie mamy dost\u0119pne 3 \u017ar\u00f3d\u0142a przerwa\u0144:<\/p>\n Ilo\u015bci\u0105 retransmisji si\u0119 nie b\u0119d\u0119 zajmowa\u0142. Ka\u017cdy mo\u017ce mie\u0107 sw\u00f3j pomys\u0142 na jego realizacj\u0119. Czy to wyrzucenie b\u0142\u0119du, czy dalsze pr\u00f3by retransmisji. W bibliotece pozostawiam miejsce (callback) na implementacj\u0119 obs\u0142ugi tego przerwania.<\/p>\n Pozostaj\u0105 wi\u0119c dwa. Jedno od odebrania danych, kt\u00f3re mam ju\u017c cz\u0119\u015bciowo zaimplementowa\u0142em. Cz\u0119\u015bciowo, bo troch\u0119 zmieni\u0119 koncepcj\u0119 obs\u0142ugi ca\u0142o\u015bci.<\/p>\n Drugie to od zako\u0144czenia nadawania. To przerwanie przyda nam si\u0119 do tego, aby nie czeka\u0107 niepotrzebnie na koniec transferu przez nRF24<\/a>. Dzi\u0119ki temu odblokuj\u0119 MCU do innych zada\u0144. Przyda si\u0119 to bardzo w momencie, gdy chcia\u0142bym wys\u0142a\u0107 wi\u0119cej ni\u017c 32 bajty “na raz” i trzeba podzieli\u0107 wiadomo\u015b\u0107 na paczki, kt\u00f3re zmieszcz\u0105 si\u0119 w Payload nRFa.<\/p>\n Przede wszystkim musia\u0142em lepiej zorganizowa\u0107 obs\u0142ug\u0119 przerwania. S\u0142usznie zwr\u00f3ci\u0142 mi uwag\u0119 Przemys\u0142aw (dambo), \u017ce mog\u0119 mie\u0107 konflikt interes\u00f3w, je\u015bli chodzi o dost\u0119p do SPI.<\/strong> Ogromne Ci za to dzi\u0119kuj\u0119, bo kompletnie o tym zapomnia\u0142em!<\/p>\n Konflikt polega\u0142by na tym, \u017ce przysz\u0142oby przerwanie maj\u0105c “zaj\u0119te” SPI w p\u0119tli g\u0142\u00f3wnej programu. W przerwaniu tym r\u00f3wnie\u017c wymaga\u0142em dost\u0119pu do SPI, wi\u0119c robi si\u0119 zgrzyt, bo dwa miejsca w kodzie chc\u0105 jednego SPI “na raz”. S\u0105 co najmniej dwa rozwi\u0105zania:<\/p>\n Wybra\u0142em bramk\u0119 numer dwa. W jaki spos\u00f3b? Ot\u00f3\u017c w obs\u0142udze przerwania EXTI ustawiam jedynie flag\u0119, \u017ce takie przerwanie wyst\u0105pi\u0142o.<\/p>\n I tyle. Dzi\u0119ki tej fladze dopiero w evencie od nRF24<\/a> czytam z rejestr\u00f3w uk\u0142adu, kt\u00f3re przerwanie wyst\u0105pi\u0142o i ustawiam kolejn\u0105 flag\u0119 – ju\u017c konkretn\u0105 od rodzaju przerwania.<\/p>\n Tym sposobem mam pewno\u015b\u0107, \u017ce SPI b\u0119dzie zwolnione.<\/strong> No prawie, bo jeszcze mo\u017ce by\u0107 zaj\u0119te przez inny uk\u0142ad na DMA… Jednak przy u\u017cywaniu DMA wed\u0142ug mnie warto bra\u0107 ca\u0142y interfejs na wy\u0142\u0105czno\u015b\u0107 dla jednego uk\u0142adu, wi\u0119c inne mog\u0105 si\u0119 wtedy nie wcisn\u0105\u0107 \ud83d\ude42<\/p>\n Teraz w funkcji nRF24_Event mog\u0119 si\u0119 tymi flagami zaj\u0105\u0107. Na tym etapie wygl\u0105da ona tak.<\/p>\n Mamy odczytanie przerwa\u0144 oraz reakcje na nie przez callbacki.<\/p>\n Mo\u017cna teraz ca\u0142\u0105 obs\u0142ug\u0119 zrobi\u0107 w callbackach, jednak ja je pozostawi\u0119 jako dodatkowe. W poprzednim wpisie na blogu przybli\u017cy\u0142em Ci ide\u0119 bufora cyklicznego.<\/a> Napisa\u0142em, \u017ce chc\u0119 go wykorzysta\u0107 przy transmisji nRF24<\/a>. Tak te\u017c zrobi\u0142em.<\/p>\n Stworzy\u0142em dwa bufory – odbiorczy i nadawczy<\/strong>. Po nazwach mo\u017cna ju\u017c si\u0119 domy\u015bli\u0107 do czego b\u0119d\u0105 one s\u0142u\u017cy\u0107.<\/p>\n W odbiorczym pojawi\u0105 si\u0119 dane zaraz po odebraniu, czyli po wyst\u0105pieniu przerwania RX_DR.<\/p>\n Do nadawczego z kolei to my b\u0119dziemy wpisywa\u0107 to, co chcemy wys\u0142a\u0107. Biblioteka, a w\u0142a\u015bciwie funkcja eventowa b\u0119dzie sprawdza\u0142a, czy jest co\u015b do wys\u0142ania i je\u015bli radio b\u0119dzie wolne to wy\u015ble to, co jest w buforze.<\/p>\n Dzi\u0119ki takiemu rozwi\u0105zaniu nie przejmujemy si\u0119 co w danej chwili robi nRF24L01<\/a>. Pchamy do i wyci\u0105gamy z bufor\u00f3w dane, kiedy jest nam wygodniej. Ma\u0142o tego! Poka\u017c\u0119 Ci, \u017ce nie musi Ci\u0119 martwi\u0107 limit 32 bajt\u00f3w w Payload! Mo\u017cna to obs\u0142u\u017cy\u0107 z automatu.<\/p>\n Zmodyfikowa\u0142em lekko bufor, kt\u00f3ry opisa\u0142em poprzednio. Implementacja na potrzeby edukacyjne by\u0142a bardzo prosta. Ja potrzebuj\u0119 tutaj czego\u015b bardziej zaawansowanego, ale niekoniecznie pe\u0142nego zb\u0119dnych funkcji.<\/p>\n Po pierwsze zaj\u0105\u0142em si\u0119 rozmiarem bufora. Zamiast sta\u0142ego rozmiaru ka\u017cdego z bufor\u00f3w pozwoli\u0142em sobie zastosowa\u0107 co\u015b, co w standardzie C99 nazywa si\u0119 Flexible array member<\/em><\/strong>. M\u00f3wi\u0105c w skr\u00f3cie, ostatni element w strukturze danych mo\u017ce by\u0107 tablic\u0105 dynamiczn\u0105. To w\u0142a\u015bnie b\u0119dzie m\u00f3j bufor na dane. Dzi\u0119ki temu mog\u0119 mie\u0107 ma\u0142y bufor nadawczy, a du\u017cy odbiorczy, je\u015bli jest taka potrzeba.<\/p>\n U\u017cycie FAM sprawia, \u017ce obiekty musz\u0105 by\u0107 tworzone dynamicznie z u\u017cyciem malloc. Definicja struktury wygl\u0105da w ten spos\u00f3b.<\/p>\n Jak widzisz ostatni element to wska\u017anik na tablic\u0119. Co ciekawe, gdy zrobisz sizeof(RingBuffer), to zwr\u00f3ci on warto\u015b\u0107 4 jakby tej tablicy w og\u00f3le nie by\u0142o<\/strong> \ud83d\ude42<\/p>\n Jak stworzy\u0107 teraz taki bufor?<\/p>\n W mallocu podajesz rozmiar struktury plus liczb\u0119 element\u00f3w w tablicy. To tyle.<\/p>\n Jak widzisz w strukturze stworzy\u0142em pole Size<\/em>. Trzeba teraz pami\u0119ta\u0107 jakiego rozmiaru jest bufor, bo ka\u017cdy mo\u017ce by\u0107 inny. Pole Elements<\/em> b\u0119dzie nas informowa\u0142o ile danych jest aktualnie przechowywane.<\/p>\n Do dzia\u0142ania z nRF24<\/a> stworzy\u0142em jeszcze funkcj\u0119 zwracaj\u0105c\u0105 w\u0142a\u015bnie ile element\u00f3w przechowuje bufor.<\/p>\n Bufory tworzone s\u0105 podczas inicjalizacji nRF24<\/a> i s\u0105 widoczne tylko w obr\u0119bie jego biblioteki.<\/p>\n Odbi\u00f3r danych nast\u0119puje wtedy, gdy pojawi si\u0119 zapalona flaga nrf24_rx_flag.<\/em> Realizowany jest podobnie jak w poprzednim wpisie<\/a> z t\u0105 r\u00f3\u017cnic\u0105, \u017ce dane wpisuj\u0119 do wewn\u0119trznego rejestru ko\u0142owego.<\/p>\n Teraz, aby u\u017cy\u0107 tych danych wystarczy je “odczyta\u0107” z nRF24<\/a>. Je\u015bli zwr\u00f3cona ilo\u015b\u0107 danych r\u00f3wna si\u0119 zero, to znaczy, \u017ce nic nie przysz\u0142o. <\/p>\n Funkcja zwraca tyle, ile jest dost\u0119pnych danych w buforze – nie ma ograniczenia zwi\u0105zanego z Payload.<\/p>\n Natomiast sprawdzenie, czy co\u015b jest do odczytania w wersji z buforami ko\u0142owymi to sprawdzenie, czy co\u015b jest w buforze.<\/p>\n Teraz dzia\u0142amy odwrotnie. My piszemy do bufora, a biblioteka sprawdza, czy jest co\u015b do wys\u0142ania i to wysy\u0142a.<\/p>\n Wpisanie do bufora nRFa odbywa si\u0119 – mo\u017cna by powiedzie\u0107 – “normalnie”.<\/p>\n Wrzucone to zostaje do bufora nadawczego.<\/p>\n Nast\u0119pnie, gdy przychodzi event nRF24<\/a>, biblioteka sprawdza, czy jest co\u015b do nadania. Musi by\u0107 te\u017c zwolnione radio, wi\u0119c powo\u0142a\u0142em kolejn\u0105 flag\u0119 – Nrf24TXFreeFlag<\/em>.<\/p>\n Flaga ta jest kasowana zgodnie z jej nazw\u0105, wi\u0119c wyzerowana oznacza, \u017ce radio nie jest aktualnie wolne.<\/em> Nast\u0119pnie pobieram liczb\u0119 bajt\u00f3w do wys\u0142ania. Je\u015bli jest wi\u0119ksza ni\u017c maksymalnie mo\u017cliwy Payload, ucinam pob\u00f3r do 32 bajt\u00f3w.<\/strong> Odczytuj\u0119 potrzebn\u0105 ilo\u015b\u0107 danych i wysy\u0142am do uk\u0142adu.<\/p>\n Mo\u017cesz zauwa\u017cy\u0107, \u017ce jest tu jeden Delay. Tak naprawd\u0119 powinien on trwa\u0107 ok. 130 \u00b5s, bo tyle trwa przeskok mi\u0119dzy stanami nRF24<\/a>, ale rozdzielczo\u015b\u0107 delaya w HALu to 1 ms. Jest on dosy\u0107 drobny, ale mo\u017cna si\u0119 uprze\u0107, aby go usun\u0105\u0107. Pomys\u0142 na jego usuni\u0119cie przyszed\u0142 mi dopiero podczas pisania tego tekstu.<\/p>\n Ok pos\u0142ali\u015bmy dane do uk\u0142adu i co dalej? Przecie\u017c mamy wyzerowan\u0105 flag\u0119 Nrf24TXFreeFlag, <\/em>a do wys\u0142ania kolejnych danych potrzebujemy j\u0105 ustawi\u0107.<\/p>\n Tutaj na bia\u0142ym koniu wje\u017cd\u017ca przerwanie TX_DS, kt\u00f3re m\u00f3wi nam o tym, \u017ce transmisja po radiu zosta\u0142a zako\u0144czona. <\/strong>W evencie, gdy pojawi si\u0119 flaga od TX_DS, ustawiam Nrf24TXFreeFlag<\/em> co powoduje, \u017ce mo\u017cna wys\u0142a\u0107 kolejne dane. Mo\u017ce to by\u0107 kolejna cz\u0119\u015b\u0107 wiadomo\u015bci, je\u015bli mia\u0142a wi\u0119cej ni\u017c 32 bajty.<\/strong><\/p>\n <\/a><\/p>\n Aktualny kszta\u0142t libki jest dosy\u0107 skomplikowany i niestety ma\u0142o czytelny… Wszystko przez to, \u017ce upar\u0142em si\u0119, aby jeden zestaw plik\u00f3w obs\u0142ugiwa\u0142 trzy wypadki:<\/p>\n Do konfiguracji ca\u0142ej biblioteki s\u0142u\u017cy kilka define’\u00f3w<\/p>\n My\u015bl\u0119, \u017ce \u0142atwo jest si\u0119 domy\u015bli\u0107 co one prze\u0142\u0105czaj\u0105. W artykule pomin\u0105\u0142em w funkcjach te r\u00f3\u017cne opcje dla r\u00f3\u017cnych funkcji dla lepszej czytelno\u015bci samej cz\u0119\u015bci z buforami.<\/p>\n Ca\u0142o\u015b\u0107 napisa\u0142em tak, \u017ce we wszystkich trybach u\u017cywa si\u0119 dok\u0142adnie tych samych funkcji do odbioru i nadawania, wi\u0119c ko\u0144cowe u\u017cycie biblioteki jest dosy\u0107 proste. Ca\u0142o\u015b\u0107 sprowadza si\u0119 zawsze do inicjalizacji oraz trzech funkcji podstawowych.<\/p>\n Biblioteka na ten moment jest wed\u0142ug mnie sko\u0144czona. Jest jeszcze kilka drobnych element\u00f3w do poprawy jak ten ma\u0142y delay przy nadawaniu, ale nie jest to a\u017c tak konieczne. Nadawanie i odbi\u00f3r testowa\u0142em dosy\u0107 “stresowo” pr\u00f3buj\u0105c wysy\u0142a\u0107 wielokrotno\u015b\u0107 Payload na raz. Zar\u00f3wno po stronie nadajnika, jak i odbiornika wszystko sz\u0142o idealnie, wi\u0119c uwa\u017cam moj\u0105 bibliotek\u0119 za sukces.<\/p>\n Ch\u0119tnie poznam Twoj\u0105 opini\u0119 na temat mojego kodu i propozycje ewentualnych poprawek czy usprawnie\u0144. Jestem otwarty na dyskusj\u0119 \ud83d\ude42<\/p>\n Na ten moment to wszystko na temat nRF24L01+<\/a>. W przysz\u0142o\u015bci wr\u00f3c\u0119 jeszcze z badaniem zasi\u0119gu, ale musz\u0119 zbudowa\u0107 uk\u0142ad pomiarowy. Mo\u017ce zrobimy to wsp\u00f3lnie na LIVE? \ud83d\ude42<\/p>\n Ca\u0142a seria:<\/p>\n Je\u015bli artyku\u0142 Ci si\u0119 spodoba\u0142, mo\u017cesz mnie wesprze\u0107 kupuj\u0105c co\u015b u mnie \ud83d\ude42 https:\/\/sklep.msalamon.pl\/<\/a><\/p>\n Pe\u0142ny projekt wraz z bibliotek\u0105 znajdziesz jak zwykle na moim GitHubie: NADAJNIK<\/a>, ODBIORNIK<\/a><\/p>\n Je\u015bli zauwa\u017cy\u0142e\u015b jaki\u015b b\u0142\u0105d, nie zgadzasz si\u0119 z czym\u015b, chcia\u0142by\u015b co\u015b doda\u0107 istotnego lub po prostu uwa\u017casz, \u017ce chcia\u0142by\u015b podyskutowa\u0107 na ten temat, napisz komentarz. Pami\u0119taj, \u017ce dyskusja ma by\u0107 kulturalna i zgodna z zasadami j\u0119zyka polskiego.<\/span><\/p>\n\n\n\n
Przerwania w nRF24<\/h1>\n
\n
Jak lepiej ogarn\u0105\u0107 przerwania?<\/h2>\n
\n
void nRF24_IRQ_Handler(void)\r\n{\r\n\tNrf24InterruptFlag = 1;\r\n}<\/pre>\n
void nRF24_IRQ_Read(void)\r\n{\r\n\tif(Nrf24InterruptFlag == 1)\r\n\t{\r\n\t\tNrf24InterruptFlag = 0;\r\n\r\n\t\tuint8_t status = nRF24_ReadStatus();\r\n\t\tuint8_t ClearIrq = 0;\r\n\t\t\/\/ RX FIFO Interrupt\r\n\t\tif ((status & (1 << NRF24_RX_DR)))\r\n\t\t{\r\n\t\t\tnrf24_rx_flag = 1;\r\n\t\t\tClearIrq |= (1<<NRF24_RX_DR); \/\/ Interrupt flag clear\r\n\t\t}\r\n\t\t\/\/ TX Data Sent interrupt\r\n\t\tif ((status & (1 << NRF24_TX_DS)))\r\n\t\t{\r\n\t\t\tnrf24_tx_flag = 1;\r\n\t\t\tClearIrq |= (1<<NRF24_TX_DS); \/\/ Interrupt flag clear\r\n\t\t}\r\n\t\t\/\/ Max Retransmits interrupt\r\n\t\tif ((status & (1 << NRF24_MAX_RT)))\r\n\t\t{\r\n\t\t\tnrf24_mr_flag = 1;\r\n\t\t\tClearIrq |= (1<<NRF24_MAX_RT); \/\/ Interrupt flag clear\r\n\t\t}\r\n\r\n\t\tnRF24_WriteStatus(ClearIrq);\r\n\t}\r\n}<\/pre>\n
void nRF24_Event(void)\r\n{\r\n\tnRF24_IRQ_Read(); \/\/ Check if there was any interrupt\r\n\r\n\tif(nrf24_rx_flag)\r\n\t{\r\n\t\tnRF24_EventRxCallback();\r\n\t\tnrf24_rx_flag = 0;\r\n\t}\r\n\r\n\tif(nrf24_tx_flag)\r\n\t{\r\n\t\tnRF24_EventTxCallback();\r\n\t\tnrf24_tx_flag = 0;\r\n\t}\r\n\r\n\tif(nrf24_mr_flag)\r\n\t{\r\n\t\tnRF24_EventMrCallback();\r\n\t\tnrf24_mr_flag = 0;\r\n\t}\r\n}<\/pre>\n
Zarz\u0105dzanie danymi<\/h2>\n
Bufory ko\u0142owe<\/h2>\n
typedef struct\r\n{\r\n\tuint8_t Size;\r\n\tuint8_t Head;\r\n\tuint8_t Tail;\r\n\tuint8_t Elements;\r\n\tuint8_t Buffer[];\t\/\/ Flexible Array Member\r\n} RingBuffer;<\/pre>\n
RB_Status RB_CreateBuffer(RingBuffer **Buffer, uint8_t Size)\r\n{\r\n\t*Buffer = malloc(sizeof(RingBuffer) + (sizeof(uint8_t) * Size));\r\n\r\n\tif(Buffer == NULL)\r\n\t{\r\n\t\treturn RB_NOTCREATED;\r\n\t}\r\n\r\n\t(*Buffer)->Size = Size;\r\n\t(*Buffer)->Head = 0;\r\n\t(*Buffer)->Tail = 0;\r\n\t(*Buffer)->Elements = 0;\r\n\r\n\treturn RB_OK;\r\n}<\/pre>\n
uint8_t RB_ElementsAvailable(RingBuffer *Buffer)\r\n{\r\n\treturn Buffer->Elements;\r\n}<\/pre>\n
Odbi\u00f3r danych<\/h2>\n
void nRF24_ReceiveData(void)\r\n{\r\n\tuint8_t i, DataCounter;\r\n\tuint8_t RXPacket[32];\r\n\tdo\r\n\t{\r\n\t\tnRF24_ReceivePacket(RXPacket, &DataCounter);\r\n\r\n\t\tfor(i = 0; i < DataCounter; i++)\r\n\t\t{\r\n\t\t\tRB_WriteToBuffer(RXBuffer, RXPacket[i]);\r\n\t\t}\r\n\r\n\t}while(!nRF24_IsRxEmpty());\r\n}<\/pre>\n
nRF24_ReadData(Message, &MessageLength);\r\nif(MessageLength > 0)\r\n{\r\n\tHAL_UART_Transmit(&huart2, Message, MessageLength, 1000);\r\n}<\/pre>\n
nRF24_RX_Status nRF24_ReadData(uint8_t *Data, uint8_t *Size)\r\n{\r\n\tuint8_t i = 0;\r\n\t*Size = 0;\r\n\r\n\t if(nRF24_RXAvailable())\r\n\t {\r\n\t\twhile(RB_OK == RB_ReadFromBuffer(RXBuffer, &Data[i]))\r\n\t\t{\r\n\t\t\ti++;\r\n\t\t}\r\n\t\t*Size = i;\r\n\t }\r\n\tif(*Size == 0)\r\n\t{\r\n\t\treturn NRF24_NO_RECEIVED_PACKET;\r\n\t}\r\n\r\n\treturn NRF24_RECEIVED_PACKET;\r\n}<\/pre>\n
uint8_t nRF24_RXAvailable(void)\r\n{\r\n\treturn nRF24_IsSomtehingToRead();\r\n}<\/pre>\n
Nadawanie danych<\/h2>\n
MessageLength = sprintf(Message, \"abcdefghijklmnopqrstuwxyz1234567890\\n\\r\" );\r\nnRF24_SendData(Message, MessageLength);<\/pre>\n
nRF24_TX_Status nRF24_SendData(uint8_t* Data, uint8_t Size)\r\n{\r\n\tuint8_t i = 0;\r\n\r\n\twhile(Size > 0)\r\n\t{\r\n\t\tif(RB_OK == RB_WriteToBuffer(TXBuffer, Data[i++]))\r\n\t\t{\r\n\t\t\tSize--;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn NRF24_NO_TRANSMITTED_PACKET;\r\n\t\t}\r\n\t}\r\n\treturn NRF24_TRANSMITTED_PACKET;\r\n}<\/pre>\n
void nRF24_CheckTXAndSend(void)\r\n{\r\n\tuint8_t i, DataCounter;\r\n\tuint8_t TXPacket[32];\r\n\r\n\tif(nRF24_IsSomtehingToSend() && Nrf24TXFreeFlag)\r\n\t{\r\n\t\tnRF24_TX_Mode();\r\n\r\n\t\tNrf24TXFreeFlag = 0;\r\n\t\tDataCounter = RB_ElementsAvailable(TXBuffer);\r\n\t\tif(DataCounter > 32)\r\n\t\t{\r\n\t\t\tDataCounter = 32; \/\/ Max Payload\r\n\t\t}\r\n\r\n\t\tfor(i = 0; i < DataCounter; i++)\r\n\t\t{\r\n\t\t\tRB_ReadFromBuffer(TXBuffer, &TXPacket[i]);\r\n\t\t}\r\n\r\n\t\tnRF24_SendPacket(TXPacket, DataCounter);\r\n\t\tNRF24_CE_HIGH;\r\n\t\tnRF24_Delay_ms(1);\r\n\t\tNRF24_CE_LOW;\r\n\t}\r\n}<\/pre>\n
Dzia\u0142anie i wygl\u0105d biblioteki<\/h2>\n
\n
\/\/\r\n\/\/\tConfiguration\r\n\/\/\r\n#define NRF24_USE_INTERRUPT\t\t1\r\n#if (NRF24_USE_INTERRUPT == 1)\r\n#define NRF24_USE_RINGBUFFER\t1\r\n#endif\r\n\r\n\r\n#define NRF24_DYNAMIC_PAYLOAD\t1\r\n\r\n#if (NRF24_USE_RINGBUFFER == 1)\r\n#define NRF24_RX_BUFFER_SIZE 32\r\n#define NRF24_TX_BUFFER_SIZE 32\r\n#endif<\/pre>\n
#if (NRF24_USE_INTERRUPT == 1)\r\n\/\/\r\n\/\/\tMain event for whole communication\r\n\/\/\tPut it in main while(1) loop\r\n\/\/\r\nvoid nRF24_Event(void);\r\n#endif\r\n\r\n\/\/\r\n\/\/ TRANSMITTING DATA\r\n\/\/\r\nnRF24_TX_Status nRF24_SendData(uint8_t *Data, uint8_t Size);\r\nnRF24_RX_Status nRF24_ReadData(uint8_t *Data, uint8_t *Size);<\/pre>\n
Podsumowanie<\/h2>\n
\n