forked from fancy3013/NRF24L01_WriessUart
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNRF24L01.LST
384 lines (371 loc) · 16.1 KB
/
NRF24L01.LST
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
C51 COMPILER V9.52.0.0 NRF24L01 10/07/2014 21:27:14 PAGE 1
C51 COMPILER V9.52.0.0, COMPILATION OF MODULE NRF24L01
OBJECT MODULE PLACED IN NRF24L01.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE NRF24L01.c BROWSE DEBUG OBJECTEXTEND TABS(2)
line level source
1 /****************************************
2 NRF24L01库函数
3 STC15F2K61S2已测试OK
4 支持24L01+和BK2423
5 支持ACK和NOACK
6 支持发送完自动切换到接收模式
7 中断处理消息
8 制作人:Fancy
9 QQ:652774317
10 ******************************************/
11
12 #include <STC/STC15F2K60S2.H>
13 #include "NRF24L01.H"
14 #include "uart.h"
15
16 unsigned char RF_CH=0x40; //RF频道
17 unsigned char NRF24L01_FLAG=0; //NRF24L01当前状态标志
18 //DB7; 1接收模式 0发射模式
19 //DB6; 1有任务 0空闲
20 //DB5; 1发送成功 0发送失败(配合DB6检测是否发送成功)
21 //DB4; 1NRF正常连接 0 检测不到连接
22 //DB3; 1接收到数据包 0 缓冲区无数据
23 //DB2; 1 ACK模式 0 NOACK模式
24 //DB1; 1发送完自动进入接收模式 0关闭自动切换模式
25 unsigned char DYNPD_LEN=0; //用于存放动态数据包长度
26 unsigned char TX_ADDRESS[NRF24L01_ADR_LEN]= {0x12,0x34,0x56,0x78,0x90}; //本地地址
27 unsigned char RX_ADDRESS[NRF24L01_ADR_LEN]= {0x12,0x34,0x56,0x78,0x90}; //接收地址
28
29
30 //向从机发送一个字节数据并返回接收数据
31 /**************************************************/
32
33 unsigned char SPI_WriteRead(unsigned char byte)
34 {
35 1
36 1 SPSTAT |= 0Xc0; // 清高两位,
37 1 SPDAT=byte;
38 1 while(!(SPSTAT&0X80));
39 1 return SPDAT;
40 1 }
41
42 /**********************/
43 /* 初始化硬件SPI口 */
44 /**********************/
45 void SPI_Init(void)
46 {
47 1 SPSTAT |= 0XC0;
48 1 SPCTL = 0XD0;
49 1 }
50 //写NRF24L01寄存器,返回状态值
51 unsigned char NRF24L01_Write_Reg(unsigned char reg, unsigned char value)
52 {
53 1 unsigned char BackDate;
54 1 SPI_SS=0;
55 1 SPI_WriteRead(reg);
C51 COMPILER V9.52.0.0 NRF24L01 10/07/2014 21:27:14 PAGE 2
56 1 BackDate=SPI_WriteRead(value);
57 1 SPI_SS=1;
58 1 return(BackDate);
59 1 }
60 //读NRF24L01寄存器,返回寄存器值
61 unsigned char NRF24L01_Read_Reg(unsigned char reg)
62 {
63 1 unsigned char BackDate;
64 1 SPI_SS=0;
65 1 SPI_WriteRead(reg);
66 1 BackDate=SPI_WriteRead(0x00);
67 1 SPI_SS=1;
68 1 return(BackDate);
69 1 }
70 //读取缓冲区数据
71 void NRF24L01_Read_Buf(unsigned char reg, unsigned char *pBuf,unsigned char bytes)
72 {
73 1 unsigned char byte_ctr;
74 1 SPI_SS = 0;
75 1 SPI_WriteRead(reg);
76 1 for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
77 1 pBuf[byte_ctr] = SPI_WriteRead(0x00);
78 1 SPI_SS = 1;
79 1 }
80 //向缓冲区写入数据
81 unsigned char NRF24L01_Write_Buf(unsigned char reg,unsigned char *pBuf,unsigned char bytes)
82 {
83 1 unsigned char status,byte_ctr;
84 1 SPI_SS = 0;
85 1 status = SPI_WriteRead(reg);
86 1 for(byte_ctr=0; byte_ctr<bytes; byte_ctr++)
87 1 SPI_WriteRead(*pBuf++);
88 1 SPI_SS = 1;
89 1 return(status);
90 1 }
91
92 //NRF24L01初始化函数
93 void NRF24L01_Init(void)
94 {
95 1 #if BK2423
NRF24L01_CE=0;
NRF24L01_Write_Reg(ACTIVATE_CMD, 0x73);
NRF24L01_CE=1;
#endif
100 1
101 1 NRF24L01_CE=0;
102 1 //配置寄存器
103 1 NRF24L01_FLAG |= NRF24L01_AUTO_ACK; //是否开启应答模式
104 1 NRF24L01_FLAG |= NRF24L01_AUTO_RX; //发送完是否自动进入接收模式
105 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_SETUP_AW, NRF24L01_ADR_LEN-2); //设置地址长度为 NRF24L0
-1_ADR_LEN
106 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_RF_CH,RF_CH); //设置RF通道为RFCH
107 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_RF_SETUP, 0x27); //设置TX发射参数,7db增益
-,250kbps,低噪声增益开启
108 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_EN_AA, 0x01); //使能通道0的自动应答
109 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_EN_RXADDR, 0x01); //使能通道0的接收地址
110 1 //RX模式配置
111 1 NRF24L01_Write_Buf(NRF24L01_WRITE_REG | NRF24L01_RX_ADDR_P0,RX_ADDRESS,NRF24L01_ADR_LEN); //写RX节点地址
112 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_FEATURE,0x05); //使能动态数据包长度,AUTO_ACK模�
-�
113 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_DYNPD,0X01); //选择通道0动态数据包长度
114 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_FLUSE_RX,NRF24L01_NOP); //清除RX FIFO寄�
C51 COMPILER V9.52.0.0 NRF24L01 10/07/2014 21:27:14 PAGE 3
-嫫�
115 1 //TX模式配置
116 1 NRF24L01_Write_Buf(NRF24L01_WRITE_REG | NRF24L01_TX_ADDR ,TX_ADDRESS,NRF24L01_ADR_LEN); //写TX节点地址
117 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_SETUP_RETR, 0x1f); //设置自动重发间隔时间:500
-us + 86us;最大自动重发次数:15次
118 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_FLUSE_TX, NRF24L01_NOP); //清除TX FIFO寄存
-器
119 1 NRF24L01_RxMode(); //默认进入接收模式
120 1 NRF24L01_CE=1;
121 1 IT0=1; //下降沿中断
122 1 EX0=1; //开启外部中断0
123 1 EA=1;
124 1 }
125
126 //NRF24L01进入发送模式
127 void NRF24L01_TxMode(void)
128 {
129 1 NRF24L01_CE=0;
130 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_CONFIG, 0x0e);
131 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_FLUSE_TX,NRF24L01_NOP); //清除TX FIFO寄存器
132 1 NRF24L01_CE = 1;
133 1 NRF24L01_FLAG &= ~NRF24L01_MODE_RX; //修改状态标识为发射模式
134 1 NRF24L01_FLAG &= ~NRF24L01_BUSY; //BUSY标志置0
135 1 NRF24L01_FLAG &= ~NRF24L01_RECIVE;//清除有数据标志
136 1 }
137 //NRF24L01进入接收模式
138 void NRF24L01_RxMode(void)
139 {
140 1 NRF24L01_CE=0;
141 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_CONFIG, 0x0f); //配置基本工作模式的参数;PWR_UP,EN_CRC,1
-6BIT_CRC,接收模式
142 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_FLUSE_RX,NRF24L01_NOP); //清除RX FIFO寄存器
143 1 NRF24L01_CE = 1;
144 1 NRF24L01_FLAG |= NRF24L01_MODE_RX; //修改状态标识为接收模式
145 1 NRF24L01_FLAG &= ~NRF24L01_BUSY; //BUSY标志置0
146 1 DYNPD_LEN=0; //清0动态数据包长度
147 1 NRF24L01_FLAG &= ~NRF24L01_RECIVE;//清除有数据标志
148 1 }
149
150 //NRF24L01 SPI通信检查
151 void NRF24L01_Check(void)
152 {
153 1 unsigned char i=0;
154 1 unsigned char Buff[5];
155 1 NRF24L01_Read_Buf(NRF24L01_TX_ADDR,Buff,NRF24L01_ADR_LEN);
156 1 i=NRF24L01_Read_Reg(NRF24L01_DYNPD); //读取DYNPD监测是否正确写入
157 1 if(i==0x01) //这里设置的是0x01,要与初始化的值相对应
158 1 {
159 2 for(i = 0; i < NRF24L01_ADR_LEN; i++)
160 2 {
161 3
162 3 if(Buff[i] == TX_ADDRESS[i])
163 3 {
164 4 NRF24L01_FLAG |= NRF24L01_CHECK;
165 4 }
166 3 else
167 3 {
168 4 NRF24L01_FLAG &= ~NRF24L01_CHECK;
169 4 break;
170 4 }
171 3 }
172 2 }
C51 COMPILER V9.52.0.0 NRF24L01 10/07/2014 21:27:14 PAGE 4
173 1 else NRF24L01_FLAG &= ~NRF24L01_CHECK;
174 1 }
175
176 ////NRF24L01发送数据
177 //void NRF24L01_SendFrame(unsigned char *temp,unsigned char len)
178 //{
179 // if(NRF24L01_FLAG & NRF24L01_MODE_RX)
180 // {
181 // NRF24L01_TxMode();
182 // }
183 // NRF24L01_FLAG |= NRF24L01_BUSY; //BUSY标志置1
184 // NRF24L01_FLAG &= ~NRF24L01_TX_ACCESS;//清除发送成功标志
185 // NRF24L01_CE = 0;
186 // if(NRF24L01_FLAG & NRF24L01_AUTO_ACK)
187 // {
188 // NRF24L01_Write_Buf(NRF24L01_WR_TX_PLOAD,temp,len); //写待发数据包,需要回应
189 // }
190 // else
191 // {
192 // NRF24L01_Write_Buf(W_TX_PAYLOAD_NOACK_CMD,temp,len); //写待发数据包,无须回应
193 // }
194 // NRF24L01_CE = 1;
195 //}
196
197 ////NRF24L01接收数据
198 //void NRF24L01_RecvFrame(unsigned char *temp)
199 //{
200 // DYNPD_LEN=NRF24L01_Read_Reg(R_RX_PL_WID_CMD);
201 // if(DYNPD_LEN>32)
202 // {
203 // NRF24L01_RxMode(); //重新初始化接收模式
204 // }
205 // else
206 // {
207 // NRF24L01_Read_Buf(NRF24L01_RD_RX_PLOAD,temp,DYNPD_LEN); //读取缓冲区数据
208 // }
209 // NRF24L01_FLAG &= ~NRF24L01_RECIVE;//清除有数据标志
210 //}
211 //更改RF_CH
212 void NRF24L01_Change_Ch(unsigned char ch)
213 {
214 1 NRF24L01_CE = 0;
215 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_RF_CH,ch&0x7F); //设置RF频道
216 1 RF_CH=ch&0x7F; //同步设置到系统参数
217 1 }
218
219 //NRF24L01中断处理
220 void NRF24L01_Handler(void) interrupt 0
221 {
222 1 unsigned char state;
223 1 state=NRF24L01_Read_Reg(NRF24L01_STATUS); //读NRF24L01状态寄存器
224 1 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_STATUS,state);//清除中断
225 1 //发送成功中断
226 1 if(state & NRF24L01_STATUS_TX_DS)
227 1 {
228 2 BLUE=0;
229 2 NRF24L01_FLAG &= ~NRF24L01_BUSY; //BUSY标志置0
230 2 NRF24L01_FLAG |= NRF24L01_TX_ACCESS;//发送成功标志置1
231 2 if(NRF24L01_FLAG & NRF24L01_AUTO_RX)
232 2 {
233 3 NRF24L01_RxMode(); //重新初始化接收模式
234 3 }
C51 COMPILER V9.52.0.0 NRF24L01 10/07/2014 21:27:14 PAGE 5
235 2 BLUE=1;
236 2 }
237 1 //达到最大重发次数中断
238 1 if(state & NRF24L01_STATUS_MAX_RT)
239 1 {
240 2 NRF24L01_Write_Reg(NRF24L01_WRITE_REG | NRF24L01_FLUSE_TX,NRF24L01_NOP); //清除TX FIFO寄存器
241 2 NRF24L01_FLAG &= ~NRF24L01_BUSY; //BUSY标志置0
242 2 NRF24L01_FLAG &= ~NRF24L01_TX_ACCESS;//发送成功标志置0
243 2 if(NRF24L01_FLAG & NRF24L01_AUTO_RX)
244 2 {
245 3 NRF24L01_RxMode(); //重新初始化接收模式
246 3 }
247 2 }
248 1 //接收到数据中断
249 1 if(state & NRF24L01_STATUS_RX_DR)
250 1 {
251 2 RED=0;
252 2 NRF24L01_FLAG |= NRF24L01_RECIVE; //接收到数据标志位置1
253 2 NRF24L01_Recvfifo();
254 2 RED=1;
255 2 }
256 1 }
257
258 //环形FIFO缓冲区配置
259 unsigned char idata nrf_rxarray[NRF_RXFIFO_MAX];
260
261 ST_NRF nrf_rxfifo=
262 {
263 NRF_RXFIFO_MAX, //缓冲区长度
264 nrf_rxarray, //缓冲区首地址
265 0, //有效数据长度
266 0 //起始数据位置
267 };
268
269 unsigned char NRF_RXFIFO_Read(void)
270 {
271 1 unsigned char *addr;
272 1 addr=nrf_rxfifo.P_buf + nrf_rxfifo.Buf_Start;
273 1 if(nrf_rxfifo.Value_Data>0)
274 1 {
275 2 nrf_rxfifo.Value_Data--;
276 2 nrf_rxfifo.Buf_Start++;
277 2 if(nrf_rxfifo.Buf_Start >= nrf_rxfifo.Max_Date) nrf_rxfifo.Buf_Start=0;
278 2 }
279 1 return *addr;
280 1 }
281
282 void NRF_RXFIFO_Write(unsigned char temp)
283 {
284 1 unsigned char *addr;
285 1 if(nrf_rxfifo.Value_Data<nrf_rxfifo.Max_Date)
286 1 {
287 2 if((nrf_rxfifo.Value_Data+nrf_rxfifo.Buf_Start)>=nrf_rxfifo.Max_Date) addr=nrf_rxfifo.P_buf+nrf_rxfifo.V
-alue_Data+nrf_rxfifo.Buf_Start-nrf_rxfifo.Max_Date;
288 2 else addr=nrf_rxfifo.P_buf+nrf_rxfifo.Value_Data+nrf_rxfifo.Buf_Start;
289 2 *(addr)=temp;
290 2 nrf_rxfifo.Value_Data++;
291 2 }
292 1 }
293 //接收数据到FIFO
294 void NRF24L01_Recvfifo(void)
295 {
C51 COMPILER V9.52.0.0 NRF24L01 10/07/2014 21:27:14 PAGE 6
296 1 unsigned char byte_ctr;
297 1 DYNPD_LEN=NRF24L01_Read_Reg(R_RX_PL_WID_CMD);
298 1 if(DYNPD_LEN>32)
299 1 {
300 2 NRF24L01_RxMode(); //重新初始化接收模式
301 2 }
302 1 else
303 1 {
304 2 SPI_SS = 0;
305 2 SPI_WriteRead(NRF24L01_RD_RX_PLOAD);
306 2 for(byte_ctr=0;byte_ctr<DYNPD_LEN;byte_ctr++)
307 2 NRF_RXFIFO_Write(SPI_WriteRead(0x00));
308 2 SPI_SS = 1;
309 2 }
310 1 NRF24L01_FLAG &= ~NRF24L01_RECIVE;//清除有数据标志
311 1 }
312
313 //NRF24L01发送fifo数据
314 void NRF24L01_Sendfifo(unsigned char len)
315 {
316 1 unsigned char byte_ctr;
317 1 if(NRF24L01_FLAG & NRF24L01_MODE_RX)
318 1 {
319 2 NRF24L01_TxMode();
320 2 }
321 1 NRF24L01_FLAG |= NRF24L01_BUSY; //BUSY标志置1
322 1 NRF24L01_FLAG &= ~NRF24L01_TX_ACCESS;//清除发送成功标志
323 1 NRF24L01_CE = 0;
324 1 if(NRF24L01_FLAG & NRF24L01_AUTO_ACK)
325 1 {
326 2 //写待发数据,需要回应
327 2 SPI_SS = 0;
328 2 SPI_WriteRead(NRF24L01_WR_TX_PLOAD);
329 2 for(byte_ctr=0; byte_ctr<len; byte_ctr++)
330 2 SPI_WriteRead(UART_BUF_Read());
331 2 SPI_SS = 1;
332 2 }
333 1 else
334 1 {
335 2 //写待发数据包,无须回应
336 2 SPI_SS = 0;
337 2 SPI_WriteRead(W_TX_PAYLOAD_NOACK_CMD);
338 2 for(byte_ctr=0; byte_ctr<len; byte_ctr++)
339 2 SPI_WriteRead(UART_BUF_Read());
340 2 SPI_SS = 1;
341 2 }
342 1 NRF24L01_CE = 1;
343 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 781 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 19 21
IDATA SIZE = 120 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)