打印

nRF2401的使用疑问?望大虾赐教!

[复制链接]
2280|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houwuyi|  楼主 | 2009-6-2 17:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一下是我自己写的一段程序:


/*==================================================
nRF2401 设置配置寄存器时序
=====================================================*/
//用于ByteRead 和 ByteWrite 函数

bdata uchar DATA_BUF;
uchar ByteRead(void) //2401读数据函数
{
uchar i;

for (i=0;i<8;i++)
    {
     DATA_BUF=DATA_BUF<<1;

     DATA=1;     //51系列读数据前先写1
     
     DATA_BUF|=DATA;
     CLK1=1;
     CLK1=0;
        }

return DATA_BUF;
}


void ByteWrite(uchar send) //2401写数据函数
{
uchar i;
uchar DATA_BUF;

DATA_BUF=send;
for (i=0;i<8;i++)
   {
    if ((DATA_BUF&0x80)==0x80) //总是发送最高位
        DATA=1;
   
    else
        {
        DATA=0;
        }
CLK1=0;
CLK1=1;
DATA_BUF=DATA_BUF<<1;
CLK1=0;
}
}


/* <2401 配置寄存器的写入方式>*/
void Config2401(void)
{
unsigned int i;
uchar variablel;
PWR_UP=1; //上电
CS=0;
CE=0;


Delayms(1000);//进入配置方式需要延时

CS=1; //使RF2401 进入配置方式
Delayms(1);

CLK1=0;

for(i=0;i<18;i++)
{
variablel=nRF2401_Conf;
ByteWrite(variablel);
}

Delayms(1);
CS=0; //CS 置低使配置有效
Delayms(1);
}



void SetTxMode(void)  //设置成发射模式
{
//设置为配置模式
PWR_UP=1;
CS=1;
CE=0;

Delayms(1);

//配置寄存器0 字节RXEN 设置为0:发送模式
DATA=0;

CLK1=0;
CLK1=1;
CLK1=0;

//设置为Activemodes(Tx)
CS=0;
CE=1;
Delayms(1);
}



void SetRxMode(void) //设置成接收模式
{
//设置为配置模式
PWR_UP = 1;
CS=1;
CE=0;

Delayms(1);
//配置寄存器0 字节RXEN 设置为1:接收模式
DATA =1;

CLK1=0;
CLK1=1;
CLK1=0;

//设置为Activemodes(Rx)
CS=0;
CE=1;
Delayms(1);
}



//接收方通道硬件地址
uchar TxAddress[]={0x11,0x22,0x33,0x44,0x55};

//发射/接收数据
uchar TxBuf[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07} ;
uchar RxBuf[16]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} ;
//nRF2401 数据发送函数
void nRF2401_TxPacket(void)
{
uchar i;
uchar variable2;

CS=0;
CE=1;

_nop_();
_nop_();

for(i=0;i<5;i++) //写入接收地址(按字节对齐)
{
variable2=TxAddress;
ByteWrite(variable2);
}
for(i=0;i<16;i++) //写入需要发送的数据(按字节对齐)
{
variable2=TxBuf;
ByteWrite(variable2);
}

CE=0; //CE 置低使发送有效
Delayms(1);
}
/*----------------------------------------------------------------*/


void nRF2401_RxPacket(void)    //数据接收函数
{
uchar i;

for (i=0; i<16; i++)
    {
    RxBuf = ByteRead();
    }
}
/*****************主函数********************/
void main()
{ uchar k; 
  P1=0x00;
Delayms(100);                                //等待外部器件上电
LCD_Init();                                  //LCD初始化
Mcu_init(); 
Delayms(10);
//************************************************************
Config2401(); // 必须执行的配置操作
Delayms(3);
SetRxMode(); // 设置RF2401 为接收模式

while(1)
{while(DR1==0);
nRF2401_RxPacket();
LCD_Pos(0x40);
   for(i=0;i<16;i++)
      {LCD_WriteData(RxBuf) ;
        Delayms(10);}
}



    我想问下
1、我在查2401中文资料时说是 最高的3个配置位属于测试保留区,不用配置,但后来的英文资料又有如下说明:
  
D121  D120
0     0 Open TX/Closed RX
0     1 Open TX/Open RX
1     0 Closed TX/Closed RX
1     1 Closed TX/Open RX

在实际的使用时 121   120 位按照默认配置0x1c时收不到数据
而改为  0x1d 时就可以收到数据。 但我看大家发的程序都没有去配置121  120位,这是为什么呢?  谢谢!
   2、我先打开接收端,再开发射端,就一直收不到数据。但反过来先开发射,在开接受就能立刻收到数据。也是不得其解。  谢谢
   我是刚进入电子行业的一名毕业大学生,还望各位大虾多多提携!
谢谢了!

相关帖子

沙发
machunshui| | 2009-6-2 21:35 | 只看该作者

建议楼主下一段别人写的能运行的代码看看

建议楼主下一段别人写的能运行的代码看看。

和自己的对比一下,能很快找出问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

13

帖子

0

粉丝