NRF2401的DR1脚莫名其妙的高电平,高手请赐教
时间:10-02
整理:3721RD
点击:
我用的MSP430与NRF2401做无线通信,问题是我没有发送信号,但是一把程序烧写进去就会出现DR1高电平。请高手看看 QQ:12676363. 怀疑是Receiveshock的问题。。
#include <msp430x14x.h>//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*************/
#include <msp430x14x.h>//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*************/