Skip to content

Commit ac28dd8

Browse files
committed
initial
1 parent 44b1ae0 commit ac28dd8

File tree

4 files changed

+542
-0
lines changed

4 files changed

+542
-0
lines changed

NRF24.c

Lines changed: 336 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,336 @@
1+
#include <stdio.h>
2+
#include "stm32f1xx_hal.h"
3+
#include "NRF24_conf.h"
4+
#include "NRF24_reg_addresses.h"
5+
#include "NRF24.h"
6+
7+
extern SPI_HandleTypeDef hspiX;
8+
9+
10+
void csn_high(void){
11+
HAL_GPIO_WritePin(csn_gpio_port, csn_gpio_pin, 1);
12+
}
13+
14+
void csn_low(void){
15+
HAL_GPIO_WritePin(csn_gpio_port, csn_gpio_pin, 0);
16+
}
17+
18+
void ce_high(void){
19+
HAL_GPIO_WritePin(ce_gpio_port, ce_gpio_pin, 1);
20+
}
21+
22+
void ce_low(void){
23+
HAL_GPIO_WritePin(ce_gpio_port, ce_gpio_pin, 0);
24+
}
25+
26+
void nrf24_w_reg(uint8_t reg, uint8_t *data, uint8_t size){
27+
28+
uint8_t cmd = W_REGISTER | reg;
29+
30+
csn_low();
31+
32+
HAL_SPI_Transmit(&hspiX, &cmd, 1, spi_w_timeout);
33+
HAL_SPI_Transmit(&hspiX, data, size, spi_w_timeout);
34+
35+
csn_high();
36+
}
37+
38+
uint8_t nrf24_r_reg(uint8_t reg, uint8_t size){
39+
uint8_t cmd = R_REGISTER | reg;
40+
uint8_t data = 0;
41+
42+
csn_low();
43+
44+
HAL_SPI_Transmit(&hspiX, &cmd, 1, spi_w_timeout);
45+
HAL_SPI_Receive(&hspiX, &data, size, spi_r_timeout);
46+
47+
csn_high();
48+
49+
return data;
50+
}
51+
52+
void nrf24_w_spec_cmd(uint8_t cmd){
53+
HAL_SPI_Transmit(&hspiX, &cmd, 1, spi_w_timeout);
54+
}
55+
56+
void nrf24_w_spec_reg(uint8_t *data, uint8_t size){
57+
HAL_SPI_Transmit(&hspiX, data, size, spi_w_timeout);
58+
}
59+
60+
void nrf24_r_spec_reg(uint8_t *data, uint8_t size){
61+
HAL_SPI_Receive(&hspiX, data, size, spi_r_timeout);
62+
}
63+
64+
void nrf24_pwr_up(void){
65+
uint8_t data = 0;
66+
67+
data = nrf24_r_reg(CONFIG, 1);
68+
69+
data |= (1 << PWR_UP);
70+
71+
nrf24_w_reg(CONFIG, &data, 1);
72+
}
73+
74+
void nrf24_pwr_dwn(void){
75+
uint8_t data = 0;
76+
77+
data = nrf24_r_reg(CONFIG, 1);
78+
79+
data &= ~(1 << PWR_UP);
80+
81+
nrf24_w_reg(CONFIG, &data, 1);
82+
}
83+
84+
void nrf24_tx_pwr(uint8_t pwr){
85+
uint8_t data = 0;
86+
87+
data = nrf24_r_reg(RF_SETUP, 1);
88+
89+
data &= 184;
90+
91+
data |= (pwr << RF_PWR);
92+
93+
nrf24_w_reg(RF_SETUP, &data, 1);
94+
}
95+
96+
void nrf24_data_rate(uint8_t bps){
97+
uint8_t data = 0;
98+
99+
data = nrf24_r_reg(RF_SETUP, 1);
100+
101+
data &= ~(1 << RF_DR_LOW) & ~(1 << RF_DR_HIGH);
102+
103+
if(bps == _2Mbps){
104+
data |= (1 << RF_DR_HIGH);
105+
}else if(bps == _250kbps){
106+
data |= (1 << RF_DR_LOW);
107+
}
108+
109+
nrf24_w_reg(RF_SETUP, &data, 1);
110+
}
111+
112+
void nrf24_set_channel(uint8_t ch){
113+
nrf24_w_reg(RF_CH, &ch, 1);
114+
}
115+
116+
void nrf24_open_tx_pipe(uint8_t *addr){
117+
nrf24_w_reg(TX_ADDR, addr, 5);
118+
}
119+
120+
void nrf24_pld_size(uint8_t size){
121+
if(size > 32){
122+
size = 32;
123+
}else if(size < 0){
124+
size = 0;
125+
}
126+
127+
nrf24_w_reg(RX_PW_P0, &size, 1);
128+
nrf24_w_reg(RX_PW_P1, &size, 1);
129+
nrf24_w_reg(RX_PW_P2, &size, 1);
130+
nrf24_w_reg(RX_PW_P3, &size, 1);
131+
nrf24_w_reg(RX_PW_P4, &size, 1);
132+
nrf24_w_reg(RX_PW_P5, &size, 1);
133+
}
134+
135+
void nrf24_open_rx_pipe(uint8_t pipe, uint8_t *addr){
136+
137+
uint8_t data = 0;
138+
139+
data = nrf24_r_reg(EN_RXADDR, 1);
140+
141+
switch(pipe){
142+
case 0:
143+
nrf24_w_reg(RX_ADDR_P0, addr, 5);
144+
145+
data |= (1 << ERX_P0);
146+
break;
147+
case 1:
148+
nrf24_w_reg(RX_ADDR_P1, addr, 5);
149+
150+
data |= (1 << ERX_P1);
151+
break;
152+
case 2:
153+
nrf24_w_reg(RX_ADDR_P2, addr, 1);
154+
155+
data |= (1 << ERX_P2);
156+
break;
157+
case 3:
158+
nrf24_w_reg(RX_ADDR_P3, addr, 1);
159+
160+
data |= (1 << ERX_P3);
161+
break;
162+
case 4:
163+
nrf24_w_reg(RX_ADDR_P4, addr, 1);
164+
165+
data |= (1 << ERX_P4);
166+
break;
167+
case 5:
168+
nrf24_w_reg(RX_ADDR_P5, addr, 1);
169+
170+
data |= (1 << ERX_P5);
171+
break;
172+
}
173+
174+
nrf24_w_reg(EN_RXADDR, &data, 1);
175+
}
176+
177+
void nrf24_cls_rx_pipe(uint8_t pipe){
178+
uint8_t data = nrf24_r_reg(EN_RXADDR, 1);
179+
180+
data &= ~(1 << pipe);
181+
182+
nrf24_w_reg(EN_RXADDR, &data, 1);
183+
}
184+
185+
void nrf24_set_crc(uint8_t en_crc, uint8_t crc0){
186+
uint8_t data = nrf24_r_reg(CONFIG, 1);
187+
188+
data &= ~(1 << EN_CRC) & ~(1 << CRCO);
189+
190+
data |= (en_crc << EN_CRC) | (crc0 << CRCO);
191+
192+
nrf24_w_reg(CONFIG, &data, 1);
193+
}
194+
195+
void nrf24_set_addr_width(uint8_t bytes){
196+
bytes -= 2;
197+
nrf24_w_reg(SETUP_AW, &bytes, 1);
198+
}
199+
200+
void nrf24_flush_tx(void){
201+
csn_low();
202+
nrf24_w_spec_cmd(FLUSH_TX);
203+
csn_high();
204+
}
205+
206+
void nrf24_flush_rx(void){
207+
csn_low();
208+
nrf24_w_spec_cmd(FLUSH_RX);
209+
csn_high();
210+
}
211+
212+
void nrf24_clear_rx_dr(void){
213+
uint8_t data = 0;
214+
215+
data = nrf24_r_reg(STATUS, 1);
216+
217+
data |= (1 << RX_DR);
218+
219+
nrf24_w_reg(STATUS, &data, 1);
220+
}
221+
222+
void nrf24_clear_tx_ds(void){
223+
uint8_t data = 0;
224+
225+
data = nrf24_r_reg(STATUS, 1);
226+
227+
data |= (1 << TX_DS);
228+
229+
nrf24_w_reg(STATUS, &data, 1);
230+
}
231+
232+
void nrf24_clear_max_rt(void){
233+
uint8_t data = 0;
234+
235+
data = nrf24_r_reg(STATUS, 1);
236+
237+
data |= (1 << MAX_RT);
238+
239+
nrf24_w_reg(STATUS, &data, 1);
240+
}
241+
242+
uint8_t nrf24_r_pld_wid(void){
243+
uint8_t width = 0;
244+
245+
csn_low();
246+
nrf24_w_spec_cmd(R_RX_PL_WID);
247+
nrf24_r_spec_reg(&width, 1);
248+
csn_high();
249+
250+
return width;
251+
}
252+
253+
void nrf24_listen(void){
254+
uint8_t data = 0;
255+
256+
data = nrf24_r_reg(CONFIG, 1);
257+
258+
data |= (1 << PRIM_RX);
259+
260+
nrf24_w_reg(CONFIG, &data, 1);
261+
}
262+
263+
void nrf24_stop_listen(void){
264+
uint8_t data = 0;
265+
266+
data = nrf24_r_reg(CONFIG, 1);
267+
268+
data &= ~(1 << PRIM_RX);
269+
270+
nrf24_w_reg(CONFIG, &data, 1);
271+
}
272+
273+
void nrf24_ack(uint8_t ack){
274+
275+
}
276+
277+
void nrf24_transmit(uint8_t *data, uint8_t size){
278+
279+
ce_low();
280+
281+
nrf24_flush_tx();
282+
283+
nrf24_clear_tx_ds();
284+
285+
csn_low();
286+
nrf24_w_spec_cmd(W_TX_PAYLOAD);//W_TX_PAYLOAD_NOACK
287+
nrf24_w_spec_reg(data, size);
288+
csn_high();
289+
290+
ce_high();
291+
HAL_Delay(1);
292+
ce_low();
293+
}
294+
295+
uint8_t nrf24_data_available(void){
296+
297+
uint8_t reg_dt = nrf24_r_reg(FIFO_STATUS, 1);
298+
299+
if(!(reg_dt & (1 << RX_EMPTY))){
300+
return 1;
301+
}
302+
303+
return 0;
304+
}
305+
306+
void nrf24_flush_on_full_rx(void){
307+
uint8_t reg_dt = nrf24_r_reg(FIFO_STATUS, 1);
308+
309+
if((reg_dt & (1 << RX_FULL))){
310+
nrf24_flush_rx();
311+
}
312+
}
313+
314+
void nrf24_receive(uint8_t *data, uint8_t size){
315+
ce_high();
316+
317+
uint8_t reg_dt = nrf24_r_reg(STATUS, 1);
318+
319+
if((reg_dt & (1 << RX_DR))){
320+
321+
uint8_t wid = nrf24_r_pld_wid();
322+
323+
if(wid > 32){
324+
nrf24_flush_rx();
325+
}else{
326+
csn_low();
327+
nrf24_w_spec_cmd(R_RX_PAYLOAD);
328+
nrf24_r_spec_reg(data, size);
329+
csn_high();
330+
}
331+
nrf24_clear_rx_dr();
332+
}
333+
334+
}
335+
336+

0 commit comments

Comments
 (0)