📄 rf2401_demo.lst
字号:
313 2 {
314 3 DATA_BUF |= BYTE_BIT0;
315 3 }
316 2 else
317 2 {
318 3 DATA_BUF &= ~BYTE_BIT0;
319 3 }
320 2 CLK1 = 0;
321 2 }
322 1
323 1 return DATA_BUF;
324 1 }
325
326 void Spi_ByteWrite(unsigned char send)
327 {
328 1 unsigned char i;
329 1
330 1 DATA_BUF = send;
331 1
332 1 CLK1 = 0;
333 1
334 1 for (i=0; i<8; i++)
335 1 {
336 2
337 2 if (DATA7) //总是发送最高位
338 2 {
339 3 DATA = 1;
340 3 }
341 2 else
342 2 {
343 3 DATA = 0;
344 3 }
345 2 CLK1 = 1;
346 2 DATA_BUF = DATA_BUF << 1;
347 2 CLK1 = 0;
348 2 }
349 1 }
350
351
352
353
354 /* <RF2401配置寄存器的写入方式>
355 NOTE.
356 On the falling edge of CS, the nRF2401A updates the number of bits actually shifted
357 in during the last configuration.
358 Ex:
359 If the nRF2401A is to be configured for 2 channel RX in ShockBurst., a total of 120
360 bits must be shifted in during the first configuration after VDD is applied.
361 Once the wanted protocol, modus and RF channel are set, only one bit (RXEN) is
362 shifted in to switch between RX and TX.
363 */
364 void Config2401(void)
365 {
C51 COMPILER V8.12 RF2401_DEMO 04/27/2008 19:15:28 PAGE 7
366 1 unsigned int i = 0;
367 1 unsigned char variablel;
368 1
369 1 //RF2401进入配置方式
370 1 CS = 0;
371 1 CE = 0;
372 1 PWR_UP = 1; //上电
373 1
374 1 for(i=0; i<20; i++)
375 1 {
376 2 Delay100();
377 2 }
378 1
379 1 CS = 1;
380 1 DATA = 0;
381 1 CLK1 = 0;
382 1
383 1 Delay100();//-----
384 1
385 1
386 1 /*
387 1 for(i=0; i<20; i++)
388 1 {
389 1 Delay100();
390 1 }
391 1 */
392 1 //PWR_DWN -> Configuration_mode Delay_3ms
393 1
394 1
395 1 for(i=0; i<18; i++)
396 1 {
397 2 variablel = nRF2401_Conf[i];
398 2 Spi_ByteWrite(variablel);
399 2 }
400 1
401 1 Delay100(); // configuration mode -> stand by mode ??
402 1
403 1 CS = 0; //CS置低使配置有效
404 1 Delay100();
405 1 }
406
407 void SetTxMode(void)
408 {
409 1 //设置为配置模式
410 1 PWR_UP = 1;
411 1 CE = 0;
412 1 CS = 1;
413 1
414 1 Delay100();
415 1
416 1 //配置寄存器0字节RXEN 设置为0:发送模式
417 1 DATA = 0;
418 1 CLK1=1;
419 1 CLK1=0;
420 1
421 1 //设置为Activemodes(Tx)
422 1 CS=0;
423 1 CE=1;
424 1 Delay100();
425 1 }
426
427 void SetRxMode(void)
C51 COMPILER V8.12 RF2401_DEMO 04/27/2008 19:15:28 PAGE 8
428 {
429 1 Delay100();
430 1 //设置为配置模式
431 1 PWR_UP = 1;
432 1 CE=0;
433 1 CS=1;
434 1 Delay100(); /////----
435 1 //配置寄存器0字节RXEN 设置为1:接收模式
436 1 DATA = 1;
437 1 CLK1 = 1;
438 1 CLK1 = 0;
439 1
440 1 //设置为Activemodes(Rx)
441 1 CS=0;
442 1 CE=1;
443 1 Delay100();
444 1 }
445
446
447
448 //接收方通道硬件地址
449 unsigned char TxAddress[]={0xcc,0xcc,0xcc,0xcc};
450
451 //nRF2401数据发送函数定义如下:
452 void RF2401_TxPacket(unsigned char TxBuf[])
453 {
454 1 int i;
455 1 unsigned char variable2;
456 1
457 1
458 1 CE=1;
459 1 Delay100();
460 1 for(i=0;i< (ADDR_W/8);i++) //写入接收地址(按字节对齐)
461 1 {
462 2 variable2=TxAddress[i];
463 2 Spi_ByteWrite(variable2);
464 2 }
465 1
466 1 for(i=0;i<(DATA1_W/8);i++) //写入需要发送的数据(按字节对齐)
467 1 {
468 2 variable2=TxBuf[i];
469 2 Spi_ByteWrite(variable2);
470 2 }
471 1
472 1 CE=0; //CE置低使发送有效
473 1
474 1 Delay100(); //时钟信号高电平保持
475 1 Delay100(); //时钟信号高电平保持
476 1 Delay100(); //时钟信号高电平保持
477 1 Delay100(); //时钟信号高电平保持
478 1
479 1 }
480
481 /*******************************************/
482 //接收数据函数
483 //返回 0:没有数据接收
484 // 1:接收到数据
485 unsigned char RF2401_RxPacket(unsigned char *RxBuf)
486 {
487 1 unsigned int i;
488 1
489 1 DR1=1;
C51 COMPILER V8.12 RF2401_DEMO 04/27/2008 19:15:28 PAGE 9
490 1
491 1 if(DR1)
492 1 {
493 2 for (i=0; i<DATA1_W/8; i++)
494 2 {
495 3 *RxBuf = Spi_ByteRead();
496 3 RxBuf++;
497 3 }
498 2 return 1;
499 2 }
500 1 return 0;
501 1 }
502
503
504 //*****************************************************************
505 //*****************************************************************
506 //*****************************************************************
507 unsigned char TxRxBuf[2];
508
509
510
511
512 void main(void)
513 {
514 1 unsigned int i = 0;
515 1 unsigned int j = 0;
516 1 unsigned int led0_count = 0;
517 1 unsigned int led1_count = 0;
518 1 unsigned int tem;
519 1 unsigned char inbuf[5];
520 1
521 1 //
522 1 Config2401();
523 1 Delay100();
524 1
525 1 //TxRxBuf[0] = 1;
526 1 //TxRxBuf[DATA1_W/8 - 1] = 1;
527 1
528 1 // SetTxMode(); // Set Tx Mode
529 1
530 1 // RF2401_TxPacket(TxRxBuf); // Transmit Tx buffer data
531 1
532 1 LED0 = 0;
533 1 LED1 = 0;
534 1
535 1 Delay(500); // delay for led light
536 1 Delay(500);
537 1 Delay(500);
538 1 Delay(500);
539 1
540 1
541 1
542 1 LED0 = 1;
543 1 LED1 = 1; // led close
544 1
545 1 // TxRxBuf[0] = 0xff;
546 1 // TxRxBuf[DATA1_W/8 - 1] = 0xff;
547 1
548 1
549 1 SetRxMode(); // Set RF2401 in Rx mode
550 1 init_serial();
551 1
C51 COMPILER V8.12 RF2401_DEMO 04/27/2008 19:15:28 PAGE 10
552 1 while(1)
553 1 {
554 2 send_string("start to select\n",16);
555 2 Delay(500);
556 2 Delay(500);
557 2 Delay(500);
558 2 Delay(500);
559 2 for(i=0;i<30;i++) for(j=0;j<30;j++);
560 2
561 2 if (RF2401_RxPacket(TxRxBuf) == 1) //返回1 表明有数据包接收到
562 2 { tem=(TxRxBuf[0]+TxRxBuf[1]);
563 3 }
564 2
565 2
566 2 //tem=163;
567 2 sprintf(inbuf,"%d\n",tem);
568 2 send_string(inbuf,strlen(inbuf)); //向串口发送字符串
569 2 Delay(500); // delay for led light
570 2 Delay(500);
571 2 Delay(500);
572 2 Delay(500);
573 2
574 2
575 2 // send_string("start to select1\n",17);
576 2 /*
577 2
578 2 //按键检测
579 2 if (KEY0==0)
580 2 {
581 2 TxRxBuf[0] = 1;
582 2 led0_count=15;
583 2 while( KEY0==0);
584 2 }
585 2 if (KEY1==0)
586 2 {
587 2 TxRxBuf[DATA1_W/8 - 1] = 1;
588 2 led1_count=15;
589 2 while( KEY1==0);
590 2 }
591 2 if (TxRxBuf[0]==1 || TxRxBuf[DATA1_W/8 - 1]==1)
592 2 {
593 2 SetTxMode(); //设置为发射模式
594 2 RF2401_TxPacket(TxRxBuf); //发送数据
595 2 SetRxMode();
596 2 }
597 2 TxRxBuf[0]=0;
598 2 TxRxBuf[DATA1_W/8 - 1]=0;
599 2
600 2
601 2 //LED显示延时
602 2 if (led0_count>0)
603 2 {
604 2 led0_count--;
605 2 LED0 = 0;
606 2 }
607 2 else LED0 = 1;
608 2 if (led1_count>0)
609 2 {
610 2 led1_count--;
611 2 LED1 = 0;
612 2 }
613 2 else LED1 = 1;
C51 COMPILER V8.12 RF2401_DEMO 04/27/2008 19:15:28 PAGE 11
614 2
615 2 }//end_while(1);
616 2 */
617 2 }
618 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 596 ----
CONSTANT SIZE = 39 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 25
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -