智能车制作

标题: NRF2401程序问题 [打印本页]

作者: xuguopan    时间: 2010-8-26 23:00
标题: NRF2401程序问题
我写的程序无法实现通信,不知道为什么,读STATUS的值一直是1E,求高手帮助。给点意见亦可。
  1. #include <mc9s12db128.h>
  2. #include <hidef.h>
  3. #include <math.h>
  4. #include "2401.h"

  5. void lcd_writeBCD(unsigned char ) ;
  6. void lcd_pos(uchar );
  7. void delay(uint i)
  8. {
  9. while(i--);
  10. asm(nop;);
  11. }


  12. ReadByte(uchar com)
  13. {   //读一个字节
  14. uchar value;
  15. CSN0=0;
  16. delay(30);
  17.   while(!(SPI0SR&0X20));
  18.   SPI0DR=com;
  19.   delay(30);
  20.   while(!(SPI0SR&0X20));
  21.   if(com==0x07)
  22.                   {
  23.                   value=SPI0DR;
  24.                   }
  25.   else
  26.                   {
  27.                   value=SPI0DR;
  28.                   asm("nop");
  29.                   //SPI0DR=0XFF;
  30.                   SPI0DR=0X00;
  31.                  while(!(SPI0SR&0X20));
  32.                   delay(30);
  33.                  value=SPI0DR;
  34.                   }
  35. CSN0=1;
  36. return(value);
  37. }

  38. void WriteByte(uchar com,uchar data)
  39. {   //写一个字节
  40.   unsigned int i;
  41.   CSN0=0;
  42.   delay(20);
  43.   while(!(SPI0SR&0X20));
  44.   SPI0DR=com;
  45.   delay(20);
  46.   while(!(SPI0SR&0X20));
  47.   i=SPI0DR;
  48.   delay(20);
  49.   while(!(SPI0SR&0X20));
  50.   SPI0DR=data;
  51.   delay(20);
  52.   while(!(SPI0SR&0X20));
  53.   delay(20);
  54.   CSN0=1;
  55. }
  56.   
  57. void ReadBytes(uchar com,uchar table[],uchar count)
  58. {
  59. uchar i;
  60. CSN0=0;
  61. delay(20);
  62. while(!(SPI0SR&0X20));
  63. SPI0DR=com;
  64. delay(20);
  65. while(!(SPI0SR&0X20));
  66. i=SPI0DR; //read SPIDR clear data
  67. delay(20);
  68. while(!(SPI0SR&0X20));
  69. for(i=0;i<count;i++)
  70. {
  71.   //SPI0DR=0XFF;
  72.   SPI0DR=0X00;
  73.   delay(20) ;
  74.   while(!(SPI0SR&0X20));
  75.   delay(20);
  76.   table[i]=SPI0DR;
  77. delay(20);
  78. }
  79. CSN0=1;
  80. }

  81. void WriteBytes(uchar com,uchar table[],uchar count)
  82. {
  83. uchar i;
  84. CSN0=0;
  85. delay(20);
  86. while(!(SPI0SR&0X20));
  87. SPI0DR=com;
  88. delay(20);
  89. while(!(SPI0SR&0X20));
  90. i=SPI0DR;
  91. delay(20);
  92. while(!(SPI0SR&0X20));
  93. for(i=0;i<count;i++){
  94.   while(!(SPI0SR&0X20));
  95.   SPI0DR=table[i];
  96.   delay(20);
  97. }
  98. CSN0=1;
  99. }

  100. void RFinit(void)
  101. {
  102. //uchar temp;
  103. uchar TX_ADDRESS[]={0xE7,0xE7,0xE7,0xE7};  
  104. ce0=0;
  105. CSN0=1;//
  106. //WriteBytes(WRITE_REG+TX_ADDR,TX_ADDRESS,4);//发送地址
  107. //WriteBytes(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,4);//接收地址
  108. WriteByte(WRITE_REG+STATUS,0xfe);     //清除标志位
  109. WriteByte(WRITE_REG+CONFIG,0X0F);//CRC使能/16位CRC校验上电/接收模式
  110. WriteByte(WRITE_REG+EN_AA,0X01);//数据通道0自动应答允许
  111. WriteByte(WRITE_REG+EN_RXADDR,0X01);//接收数据通道0允许
  112. WriteByte(WRITE_REG+SETUP_AW,0X03);//接收发送地址宽度 5字节宽度
  113. WriteByte(WRITE_REG+SETUP_RETR,0X00);//接收模式重发设置
  114. WriteByte(WRITE_REG+RF_CH,0X02);//设置NRF工作通道频率为默认值
  115. WriteByte(WRITE_REG+RF_SETUP,0X0a);//数据传输率和发送功率设置
  116. WriteByte(WRITE_REG+RX_PW_P0,4);//接收数据通道0有效数据宽度为4字节
  117. delay(10000);
  118. }

  119. void RFTx(void)
  120. { uchar TX_ADDRESS[]={0xE7,0xE7,0xE7,0xE7};  
  121. ce0=0;
  122. WriteBytes(WRITE_REG+TX_ADDR,TX_ADDRESS,4);
  123. WriteBytes(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,4);//装载接收端地址
  124. WriteBytes(WR_TX_PLOAD,Txtable,1);//装载数据
  125. WriteByte(WRITE_REG+CONFIG,0X0E);//发送模式
  126. ce0=1;
  127. delay(1000);
  128. //ce0=0;
  129. }

  130. void RFRx(void)
  131. { //extern unsigned char flag;
  132.   uchar TX_ADDRESS[]={0xE7,0xE7,0xE7,0xE7};  
  133.   //uchar status;
  134.   WriteBytes(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,4);//接收地址
  135.   WriteByte(WRITE_REG+CONFIG,0X0F);//接收模式
  136.   ce0=1;
  137.   delay(1000);
  138.   /******************************888
  139.   status=ReadByte(READ_REG+STATUS);
  140.   while(status&0x40)
  141.   { flag=1;
  142.     ce0=0;
  143.     ReadBytes(RD_RX_PLOAD,Rxtable,4);
  144.    WriteByte(WRITE_REG+STATUS,status);
  145.    status=0x00;
  146.   }
  147. ***************************************/
  148. }



  149. #include <hidef.h>      /* common defines and macros */
  150. #include <mc9s12db128.h>     /* derivative information */
  151. #include "2401.h"
  152. #include "MCUInit.h"
  153. #include "SPIinit.h"
  154. #include "LcdDisplay.h"

  155. #pragma LINK_INFO DERIVATIVE "mc9s12db128b"

  156. //uchar TX_ADDRESS[]={0xE7,0xE7,0xE7,0xE7};
  157. uchar Txtable[1];
  158. uchar Rxtable[4];
  159. uchar sta,sta1;
  160. unsigned char flag;
  161. uint aa;
  162. unsigned char t;
  163. unsigned int j;
  164. void lcd_writeBCD(unsigned char value)
  165. {


  166.         t=value>>4;
  167.         if(t>9)t+=7;
  168.         lcd_wdat(t+0x30);
  169.         t=value&0x0f;       
  170.         if(t>9)t+=7;
  171.         lcd_wdat(t+0x30);
  172.        
  173. }
  174. //void A(void){
  175. // PORTA_BIT3=0;delay(10);PORTA_BIT3=1;delay(10);}
  176.   
  177. void main(void)
  178. {
  179.   /* put your own code here */
  180.   MCUInit();
  181.   SPIinit();
  182.   EnableInterrupts;
  183.   /*************LCD_I/O_INIT*****************/
  184.   DDRK=0XFF;
  185.   DDRM=0XFF;
  186.   PTM=0XFF;
  187.   lcd_init();                                // 初始化LCD                       
  188.   delayms(1000);
  189.   DDRA_BIT0=1;         //CE
  190.   DDRA_BIT1=1;         //CSN output
  191.   DDRA_BIT2=0;//PTS2口为输入、2401IRQ引脚\
  192.   DDRA_BIT3=1;
  193.   DDRB=0XFF;
  194.   PORTB=0XFF;
  195.   //PORTB=0X00;


  196.   //DDRM=0XFF;
  197.   //PPSJ_PPSJ0=0;//下降沿
  198.   //PIEJ_PIEJ0=1;//中断使能
  199.   //Txtable[0]=0Xaa;
  200.   //LcdDisplay(0);
  201.   //delay(1000);
  202.   //lcd_wcmd(0x01);                        //清除LCD的显示内容
  203.   //delay(1000);
  204.    RFinit();//初始化2401
  205.   delay(1000);
  206.   
  207.   /****************************
  208.   aa=0;
  209.   for(j=0;j<9;j++) {
  210.          
  211.           sta1= ReadByte(READ_REG+CONFIG+aa);
  212.           lcd_pos(0+aa*2);
  213.         lcd_writeBCD(sta1);
  214.         aa++;
  215.   }
  216.   ****************************/
  217. RFRx();//是成为接收模式
  218. //delayms(100);  

  219.   
  220.                   for(;;)
  221.                   {                /*        sta= ReadByte(READ_REG+CONFIG);//READ CONFIG
  222.                                         lcd_pos(0);
  223.                                         lcd_writeBCD(sta); */       
  224.                                
  225.                                   //*
  226.                                   
  227.                                   sta=ReadByte(READ_REG+STATUS);
  228.                               lcd_pos(0X40);
  229.                                   lcd_writeBCD(sta);//*/       
  230.                                               
  231.                              // RFRx();//是成为接收模式
  232.                              /*delay(100);
  233.                               sta=ReadByte(READ_REG+STATUS);
  234.                               lcd_pos(0X40+2);
  235.                                   lcd_writeBCD(sta);*/       
  236.   
  237.                                   while(sta&0x40)
  238.                                   {       
  239.                                     ce0=0;
  240.                                     ReadBytes(RD_RX_PLOAD,Rxtable,4);
  241.                                     PORTB=Rxtable[0];//send data to PORTB
  242.                                     WriteByte(WRITE_REG+STATUS,sta);
  243.                                     sta=0x00;
  244.                                     RFRx();
  245.                                     delay(1000);
  246.                                   }
  247.                           
  248.                            RFRx();//是成为接收模式
  249.                   
  250.                   }
  251.   
  252. }
复制代码

作者: Solemn胜威    时间: 2012-3-4 14:12
为你顶起哈

作者: 刘筅苼    时间: 2014-11-17 19:53
我也在弄这个。。。




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2