2941|0

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

NRF2401的DR1脚莫名其妙的高电平,高手请赐教 [复制链接]

我用的MSP430与NRF2401做无线通信,问题是我没有发送信号,但是一把程序烧写进去就会出现DR1高电平。请高手看看 QQ:12676363.  怀疑是Receiveshock的问题。。

#include //2010.10.31

#define uchar unsigned char
#define uint unsigned int

uchar Initdata[15];
uchar RXdata[10];
uchar Bitcnt;
uchar Bytecnt;
uchar Data1=0xff;
uchar Tempi;

#define DATA BIT6 //P1.6
#define CLK1 BIT7 //P1.7

#define DR1 BIT0 //P2.0
#define CS BIT1 //P2.1
#define CE BIT5 //P2.5
#define PWR BIT6 //P2.6


void Init_io();
void Nrf2401_on();
void Buildinitword();
void Initnrf2401();
void Dospiclock();

void Delay10();
void Delay100();
void Receiveshock();

/***主程序***/
void main(void)
{
  uint i;
  WDTCTL=WDTPW+WDTHOLD;
  BCSCTL1 &=~XT2OFF; //XT2振荡器开启
  do
  {
    IFG1 &=~OFIFG;
    for(i=0xff;i>0;i--);
  }
  while(IFG1 & OFIFG);
  BCSCTL2 |=SELM_2+SELS;
  //以上是时钟配置过程
  
  Init_io();
  Nrf2401_on();
  Buildinitword();
  Initnrf2401();
  Delay10(); //delay for mode change
  while(1)
    {
        
      Receiveshock(); //在接收模式中,就应该将P1.6改为输入模式 P1DIR &=~DATA;
    }
}
/***主程序***/

/*************Init_io*************/
void Init_io()
  {
    //各个端口的配置
    P1DIR |=DATA+CLK1; // p1.6,p1.7在初始时设定为输出
    P2DIR |=CS+CE+PWR; // p2.1,p2.5,2.6 为输出
    P2DIR &=~DR1; //p2.0 为输入
   
    P1OUT &=~(DATA+CLK1);
    P2OUT |=PWR;
    P2OUT &=~(CE+CS); //设定为standby mode
   
  }
/*************Init_io*************/

/*************Buildinitword*************/
void Buildinitword() //初始模式配置,所写内容为配置字;由MSP430发送出
  {
// 设置为
    Initdata[0]=0x50;
    Initdata[1]=0x50;
    Initdata[2]=0x00;
    Initdata[3]=0x00;
    Initdata[4]=0x00;
    Initdata[5]=0x00;
    Initdata[6]=0xCC;
    //Initdata[6]=0xE7;
    Initdata[7]=0x00;
    Initdata[8]=0x00;
    Initdata[9]=0x00;
    Initdata[10]=0x00;
    Initdata[11]=0xCC; //地址为0XCC
    //Initdata[11]=0xE7;
    Initdata[12]=0x21;// 地址位为8位,CRC8,参考NRF初始配置,其各个位代表的意义
    Initdata[13]=0x4f;
    Initdata[14]=0x05;//RX塻式
  }
/*************Buildinitword*************/

/*************Initnrf2401*************/
void Initnrf2401()
  {
    P2OUT &=~CE;
    P2OUT |=CS;//将CE设为0,CS设为1, 进入配置模式(前提是已经上电)
   
    for(Bytecnt=0;Bytecnt<15;Bytecnt++)
      {
        Tempi=Initdata[Bytecnt];
          for(Bitcnt=0;Bitcnt<8;Bitcnt++)
          {
            if(Tempi&0x80)
              P1OUT |=DATA; //意思是如果该BIT为1,则MSP430通过端口P1.6将控制字输送到NRF2401
            else
               P1OUT &=~DATA;
            Tempi=Tempi<<1;
            Dospiclock();
          }
      }
    Delay100(); // time for change the mode
    P2OUT &=~CS; // standby mode;
    P1OUT &=~DATA;
  }
/*************Initnrf2401*************/

/*************Receiveshock*************/
void Receiveshock()
{
  uchar i=0,j=0;
  uchar dat;
  P2OUT |=CE;
  Delay100();
  P1DIR &=~DATA;
    while(P2IN &DR1)
      {
        dat=dat<<1;   
        P1OUT |=CLK1;
        if(P1IN &DATA)  {dat=dat|0x01;}
          i++;
          if(i>7)
            {
              i=0;
              RXdata[j]=dat;
              j++;
            }
       P1OUT &=~CLK1;
      }
    P2OUT &=~CE;
    P1DIR |=DATA;  
}
/*************Receiveshock*************/

/*************Dospiclock*************/
void Dospiclock()
{
  P1OUT |=CLK1;
  _NOP();
  _NOP();
  P1OUT &=~CLK1; //P1.7产生脉冲
}
/*************Dospiclock*************/

/*************Nrf2401_on*************/
void Nrf2401_on()
  {P2OUT |=PWR;}
/*************Nrf2401_on*************/


/*************Delay10,Delay100*************/
void Delay10()
{
  uchar x,y;
  for(x=0;x<100;x++)
  {
    for(y=0;y<100;y++)
      _NOP();
  }
}
void Delay100()
{
  uchar x,y;
  for(x=0;x<200;x++)
  {
    for(y=0;y<200;y++)
      _NOP();
  }
}
/*************Delay10,Delay100*************/
此帖出自无线连接论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表
  缈昏瘧锛