1 | #include <stdint.h>
|
2 | #include <avr/io.h>
|
3 | #include <util/delay.h>
|
4 | #include "NRF24L01_Dec.h"
|
5 | #include "SoftwareSPI_Dec.h"
|
6 | #include "USART_Dec.h"
|
7 | #include "Converter.h"
|
8 | #include "USB_RF_Dec.h"
|
9 |
|
10 | extern unsigned char Payload[32];
|
11 | extern unsigned char data_receive[32];
|
12 |
|
13 | /****** NRF Init *****************/
|
14 |
|
15 | void NRF24L01_Init(void)
|
16 | {
|
17 | NRF_CE_DDR |= (1<<NRF_CE);
|
18 |
|
19 | NRF_IRQ_DDR &= ~(1<<NRF_IRQ);
|
20 | NRF_IRQ_PORT |= (1<<NRF_IRQ);
|
21 |
|
22 | INT_SENS;
|
23 | INT_EN;
|
24 |
|
25 | NRF_WriteRegister(0x0A, CONFIG);
|
26 | NRF_WriteRegister(0x01, EN_AA);
|
27 | NRF_WriteRegister(0x01, EN_RXADDR);
|
28 | NRF_WriteRegister(0x02, SETUP_AW);
|
29 | NRF_WriteRegister(0x01, SETUP_RETR);
|
30 | NRF_WriteRegister(0x02, RF_CH);
|
31 | NRF_WriteRegister(0x0E, RF_SETUP);
|
32 |
|
33 | NRF_CE_Lo;
|
34 | }
|
35 |
|
36 | /****** Write Register ***********/
|
37 |
|
38 | void NRF_WriteRegister(uint8_t u8Register, uint8_t u8Cmd)
|
39 | {
|
40 | uint8_t u8Command = W_REGISTER | u8Cmd;
|
41 |
|
42 | SCSN_Lo;
|
43 |
|
44 | SSPI_Write_byte(u8Command);
|
45 | SSPI_Write_byte(u8Register);
|
46 |
|
47 | SCSN_Hi;
|
48 | }
|
49 |
|
50 | /****** Read Register ************/
|
51 |
|
52 | uint8_t NRF_ReadRegister(uint8_t u8Cmd)
|
53 | {
|
54 | uint8_t u8Command = R_REGISTER | u8Cmd;
|
55 | uint8_t u8Content = 0x00;
|
56 |
|
57 | SCSN_Lo;
|
58 |
|
59 | SSPI_Read_byte(u8Command);
|
60 | u8Content = SSPI_Read_byte(0x00);
|
61 |
|
62 | SCSN_Hi;
|
63 | return u8Content;
|
64 | }
|
65 |
|
66 | /****** Read RX Address ***********/
|
67 |
|
68 | uint32_t NRF_ReadRXAddress(uint8_t u8Pipe)
|
69 | {
|
70 | uint8_t u8PipeReg = 0x00;
|
71 | uint8_t u8i = 0x00;
|
72 |
|
73 | switch (u8Pipe)
|
74 | {
|
75 | case 0x0A:
|
76 | u8PipeReg = RX_ADDR_P0;
|
77 | break;
|
78 | case 0x0B:
|
79 | u8PipeReg = RX_ADDR_P1;
|
80 | break;
|
81 | case 0x0C:
|
82 | u8PipeReg = RX_ADDR_P2;
|
83 | break;
|
84 | case 0x0D:
|
85 | u8PipeReg = RX_ADDR_P3;
|
86 | break;
|
87 | case 0x0E:
|
88 | u8PipeReg = RX_ADDR_P4;
|
89 | break;
|
90 | case 0x0F:
|
91 | u8PipeReg = RX_ADDR_P5;
|
92 | break;
|
93 | }
|
94 |
|
95 | uint8_t u8Command = R_REGISTER | u8PipeReg;
|
96 | SCSN_Lo;
|
97 | SSPI_Write_byte(u8Command);
|
98 | for(u8i = 4; u8i>0; u8i--)
|
99 | {
|
100 | Addressconvert.c[u8i-1] = SSPI_Read_byte(NO_OP);
|
101 | }
|
102 | SCSN_Hi;
|
103 | return Addressconvert.u32i;
|
104 | }
|
105 |
|
106 |
|
107 | /****** Read TX Address ***********/
|
108 |
|
109 | uint32_t NRF_ReadTXAddress()
|
110 | {
|
111 | uint8_t u8i = 0x00;
|
112 |
|
113 | uint8_t u8Command = R_REGISTER | TX_ADDR;
|
114 | SCSN_Lo;
|
115 | SSPI_Write_byte(u8Command);
|
116 | for(u8i = 4; u8i>0; u8i--)
|
117 | {
|
118 | Addressconvert.c[u8i-1] = SSPI_Read_byte(NO_OP);
|
119 | }
|
120 | SCSN_Hi;
|
121 | return Addressconvert.u32i;
|
122 | }
|
123 |
|
124 | /****** Change RX Address ***********/
|
125 |
|
126 | void NRF_ChangeRXAddress(uint32_t u32Address, uint8_t u8Pipe)
|
127 | {
|
128 | uint8_t u8PipeReg = 0x00;
|
129 | uint8_t u8CEFlag = 0x00;
|
130 | uint8_t u8i = 0x00;
|
131 | Addressconvert.u32i = u32Address;
|
132 |
|
133 | if(PORTB & NRF_CE)
|
134 | {
|
135 | NRF_CE_Lo;
|
136 | u8CEFlag = 0x11;
|
137 | }
|
138 | _delay_us(250);
|
139 | switch (u8Pipe)
|
140 | {
|
141 | case 0x0A:
|
142 | u8PipeReg = RX_ADDR_P0;
|
143 | break;
|
144 | case 0x0B:
|
145 | u8PipeReg = RX_ADDR_P1;
|
146 | break;
|
147 | case 0x0C:
|
148 | u8PipeReg = RX_ADDR_P2;
|
149 | break;
|
150 | case 0x0D:
|
151 | u8PipeReg = RX_ADDR_P3;
|
152 | break;
|
153 | case 0x0E:
|
154 | u8PipeReg = RX_ADDR_P4;
|
155 | break;
|
156 | case 0x0F:
|
157 | u8PipeReg = RX_ADDR_P5;
|
158 | break;
|
159 | }
|
160 | uint8_t u8Command = W_REGISTER | u8PipeReg;
|
161 | SCSN_Lo;
|
162 | SSPI_Write_byte(u8Command);
|
163 | for(u8i = 4; u8i>0; u8i--)
|
164 | {
|
165 | SSPI_Write_byte(Addressconvert.c[u8i-1]);
|
166 | }
|
167 | SCSN_Hi;
|
168 |
|
169 | _delay_us(10);
|
170 |
|
171 | if(u8CEFlag == 0x11)
|
172 | {
|
173 | NRF_CE_Hi;
|
174 | u8CEFlag = 0x00;
|
175 | }
|
176 | }
|
177 |
|
178 | /****** Change TX Address ***********/
|
179 |
|
180 | void NRF_ChangeTXAddress(uint32_t u32Address)
|
181 | {
|
182 | uint8_t u8i = 0x00;
|
183 | uint8_t u8CEFlag = 0x00;
|
184 | Addressconvert.u32i = u32Address;
|
185 |
|
186 | if(PORTB & NRF_CE)
|
187 | {
|
188 | NRF_CE_Lo;
|
189 | u8CEFlag = 0x11;
|
190 | }
|
191 | _delay_us(250);
|
192 | uint8_t u8Command = W_REGISTER | TX_ADDR;
|
193 | SCSN_Lo;
|
194 | SSPI_Write_byte(u8Command);
|
195 | for(u8i = 4; u8i>0; u8i--)
|
196 | {
|
197 | SSPI_Write_byte(Addressconvert.c[u8i-1]);
|
198 | }
|
199 | SCSN_Hi;
|
200 | _delay_us(10);
|
201 |
|
202 | if(u8CEFlag == 0x11)
|
203 | {
|
204 | NRF_CE_Hi;
|
205 | u8CEFlag = 0x00;
|
206 | }
|
207 | }
|
208 |
|
209 | /****** Write TX Payload ************/
|
210 |
|
211 | void NRF_WriteTXPayload(struct uint256_t u256Payload)
|
212 | {
|
213 | uint8_t u8i;
|
214 | Payloadconvert.u256i = u256Payload;
|
215 | SCSN_Lo;
|
216 | uint8_t u8Reg = NRF_ReadRegister(CONFIG);
|
217 | SCSN_Hi;
|
218 |
|
219 | if(u8Reg & 0x01)
|
220 | {
|
221 | SCSN_Lo;
|
222 | SSPI_Write_byte(W_TX_PAYLOAD);
|
223 | for(u8i=32 ; u8i>0; u8i--)
|
224 | {
|
225 | SSPI_Write_byte(Payloadconvert.c[u8i-1]);
|
226 | }
|
227 | SCSN_Hi;
|
228 | }
|
229 | }
|
230 |
|
231 | /****** Read RX Payload ************/
|
232 |
|
233 | struct uint256_t NRF_ReadRXPayload()
|
234 | {
|
235 | uint8_t u8i = 0x00;
|
236 |
|
237 | SCSN_Lo;
|
238 | uint8_t u8Reg = NRF_ReadRegister(CONFIG);
|
239 | SCSN_Hi;
|
240 |
|
241 | if(!(u8Reg & 0x01))
|
242 | {
|
243 | SCSN_Lo;
|
244 | SSPI_Write_byte(R_RX_PAYLOAD);
|
245 | for(u8i=32; u8i>0; u8i--)
|
246 | {
|
247 | Payloadconvert.c[u8i-1] = SSPI_Read_byte(NO_OP);
|
248 | }
|
249 | SCSN_Hi;
|
250 | }
|
251 | else
|
252 | {
|
253 | for(u8i=0; u8i<32; u8i++)
|
254 | {
|
255 | Payloadconvert.c[u8i] = 0xff;
|
256 | }
|
257 | }
|
258 | return Payloadconvert.u256i;
|
259 | }
|
260 |
|
261 | /****** Flush RX Buffer **********/
|
262 |
|
263 | void NRF_FlushRXBuffer(void)
|
264 | {
|
265 | SCSN_Lo;
|
266 | SSPI_Write_byte(FLUSH_RX);
|
267 | SCSN_Hi;
|
268 | }
|
269 |
|
270 | /****** Flush TX Buffer **********/
|
271 |
|
272 | void NRF_FlushTXBuffer(void)
|
273 | {
|
274 | SCSN_Lo;
|
275 | SSPI_Write_byte(FLUSH_TX);
|
276 | SCSN_Hi;
|
277 | }
|
278 |
|
279 | /****** Reuse TX Buffer **********/
|
280 |
|
281 | void NRF_ReuseTXBuffer(void)
|
282 | {
|
283 | SCSN_Lo;
|
284 | SSPI_Write_byte(REUSE_TX_PL);
|
285 | SCSN_Hi;
|
286 | }
|
287 |
|
288 | /****** Set RX State *************/
|
289 |
|
290 | void NRF_SetRXState()
|
291 | {
|
292 | uint8_t oldConfig = NRF_ReadRegister(CONFIG);
|
293 |
|
294 | uint8_t newConfig = oldConfig | 0x01;
|
295 |
|
296 | NRF_WriteRegister(newConfig, CONFIG);
|
297 | }
|
298 |
|
299 | /****** Set TX State *************/
|
300 |
|
301 | void NRF_SetTXState()
|
302 | {
|
303 | uint8_t oldConfig = NRF_ReadRegister(CONFIG);
|
304 |
|
305 | uint8_t newConfig = oldConfig & ~(0x01);
|
306 |
|
307 | NRF_WriteRegister(newConfig, CONFIG);
|
308 | }
|
309 |
|
310 | /****** Send Impuls **************/
|
311 |
|
312 | void NRF_SendImpuls()
|
313 | {
|
314 | NRF_CE_Hi;
|
315 | _delay_us(20);
|
316 | NRF_CE_Lo;
|
317 | }
|