• 易迪拓培训,专注于微波、射频、天线设计工程师的培养

nrf905!

录入:edatop.com     点击:
为什么我今天早上用nrf905还可以通信,到了下午就不行了呢?
谁能帮忙找找问题,找了一晚上了,还是不行!
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//SPI接口指令的宏定义
#define WC   0X00
#define RC   0X10
#define WTP  0X20
#define RTP  0X21
#define WTA  0X22
#define RTA  0X23
#define RRP  0X24
sbit TRX_CE=P1^0;
sbit AM=P1^1;
sbit MISO=P1^2;
sbit SCK=P1^3;
sbit TX_EN=P1^4;  
sbit PWR_UP=P1^5;
sbit CD=P1^6;  
sbit DR=P1^7;
sbit MOSI=P2^6;
sbit CSN=P2^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
uchar DATA_BUF;
uchar TxBuf[2]={0xf0,0xf1};
uchar RxBuf[4];
//NRF905寄存器配置参数
uchar code RFconf[11]={
  0x00,                             //配置命令
  0x4c,                             //CH_NO,配置频段在423MHZ
  0x0C,                             //输出功率为10db,不重发,节电为正常模式
  0x44,                             //地址宽度设置,为4字节
  0x04,0x04,                        //接收发送有效数据长度为4字节
  0xCC,0xCC,0xCC,0xCC,              //接收地址
  0x58
};
//接收地址
uchar code tx_add[4]={0xcc,0xcc,0xcc,0xcc};
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
//SPI写操作
void spi_write(uchar byte)
{
uchar i;
DATA_BUF=byte;
for(i=0;i<8;i++)
{
  if(DATA_BUF&0X80)
   MOSI=1;
  else
   MOSI=0;
  SCK=1;
  DATA_BUF=DATA_BUF<<1;
  SCK=0;
}
}
/*
//SPI读操作
uchar spi_read()
{
uchar i;
for(i=0;i<8;i++)
{
  DATA_BUF=DATA_BUF<<1;
  SCK=1;
  if(MISO)
   DATA_BUF|=0X01;
  else
   DATA_BUF&=0XFE;
  SCK=0;
  delay1();
}
return DATA_BUF;
}
*/
//主机通过SPI接口向905配置寄存器写入信息
void Config905()
{
uchar i;
CSN=0;
for(i=0;i<11;i++)
{
  spi_write(RFconf[i]);
}
CSN=1;
}
//发送数据包
void tx_packet()
{
uchar i;
CSN=0;  
spi_write(WTP);
spi_write(TxBuf[0]);
spi_write(TxBuf[1]);
CSN=1;
delay(1);
CSN=0;
spi_write(WTA);
for(i=0;i<4;i++)
{
  spi_write(tx_add[i]);
}
CSN=1;
TRX_CE=1;
delay(1);
TRX_CE=0;
// while(!DR);
}
/*
//接收数据包
void rx_packet()
{
uchar i;
TRX_CE=0;
CSN=0;
spi_write(RRP);
for(i=0;i<4;i++)
{
  RxBuf[i]=spi_read();
}
CSN=1;
while(DR||AM);
TRX_CE=1;
}
*/
//设置为发送模式
void set_tx_mode()
{
TX_EN=1;
TRX_CE=0;
delay(1);
}
/*
//设置为接收模式
void set_rx_mode()
{
TX_EN=0;
TRX_CE=1;
delay(5);
}
*/
//NRF905初始化
void nrf_init()
{  
    CSN=1;                      // Spi  disable                    
    SCK=0;                      // Spi clock line init high
    DR=0;                       // Init DR for input                 
    PWR_UP=1;                   // nRF905 power on
    TRX_CE=0;                   // Set nRF905 in standby mode
    TX_EN=0;                    // set radio in Rx mode
Config905();
}
/*
//CPU初始化
void cpu_init()
{
TMOD=0X20;
TL1=0XFD;
TH1=0XFD;
SCON=0XD8;//工作方式3,SM2=1,TB8=1;
TR1=1;
P0=DISBUFF;;
}
*/
/*
void send(uchar c)
{
SBUF=c;
while(!TI);
TI=0;
}
*/
void main()
{
// cpu_init();
nrf_init();
P2_4=0;
while(1)
{
  if(P2_0==0)
  {
   delay(5);
   if(P2_0==0)
   {
    while(!P2_0);
    set_tx_mode();
    tx_packet();
    CD=0;
   }
  }         
}
}
从机程序
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define WC   0X00
#define RC   0X10
#define WTP  0X20
#define RTP  0X21
#define WTA  0X22
#define RTA  0X23
#define RRP  0X24
sbit TRX_CE=P1^0;
sbit AM=P1^1;
sbit MISO=P1^2;
sbit SCK=P1^3;
sbit TX_EN=P1^4;  
sbit PWR_UP=P1^5;
sbit CD=P1^6;  
sbit DR=P1^7;
sbit MOSI=P2^6;
sbit CSN=P2^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
uchar DATA_BUF;
uchar RxBuf[4];
uchar code RFconf[11]={
  0x00,                             //配置命令//
  0x4c,                             //CH_NO,配置频段在423MHZ
  0x0C,                             //输出功率为10db,不重发,节电为正常模式
  0x44,                             //地址宽度设置,为4字节
  0x04,0x04,                        //接收发送有效数据长度为4字节
  0xCC,0xCC,0xCC,0xCC,              //接收地址
  0x58
};
uchar tx_add[4]={0xcc,0xcc,0xcc,0xcc};
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void spi_write(uchar byte)
{
uchar i;
DATA_BUF=byte;
for(i=0;i<8;i++)
{
  if(DATA_BUF&0X80)
   MOSI=1;
  else
   MOSI=0;
  SCK=1;
  DATA_BUF=DATA_BUF<<1;
  SCK=0;
}
}
uchar spi_read()
{
uchar i;
for(i=0;i<8;i++)
{
  DATA_BUF=DATA_BUF<<1;
  SCK=1;
  if(MISO)
   DATA_BUF|=0X01;
  else
   DATA_BUF&=0XFE;
  SCK=0;
  delay(1);
}
return DATA_BUF;
}
void Config905()
{
uchar i;
CSN=0;
for(i=0;i<11;i++)
{
  spi_write(RFconf[i]);
}
CSN=1;
}
void rx_packet()
{
uchar i;
TRX_CE=0;
CSN=0;
spi_write(RRP);
for(i=0;i<4;i++)
{
  RxBuf[i]=spi_read();
}
CSN=1;
while(DR||AM);
TRX_CE=1;
}
/*
void set_tx_mode()
{
TX_EN=1;
TRX_CE=0;
delay(5);
}
*/
void set_rx_mode()
{
TX_EN=0;
TRX_CE=1;
delay(1);
}
void nrf_init()
{  
    CSN=1;                      // Spi  disable                    
    SCK=0;                      // Spi clock line init high
    DR=1;                       // Init DR for input
    AM=1;                       // Init AM for input
    PWR_UP=1;                   // nRF905 power on
    TRX_CE=0;                   // Set nRF905 in standby mode
    TX_EN=0;                    // set radio in Rx mode
Config905();
}
void main()
{
  nrf_init();
  while(1)
  {
   set_rx_mode();
     rx_packet();
  P0=RxBuf[0];
  delay(1000);
  P0=RxBuf[1];
  delay(1000);
  }
}

  这种一般是硬件问题,自己找一下

应该不是硬件的问题,现在的现象是一上电从机的P0口就是0x00(现象是第一个数码管通,蜂鸣器叫);但是在主机上发送数据,从机上只是闪一下又变为0x00了。
所以说能发过去就不是硬件上的问题了。

怎么在proteus里弄nrf905的元件?

你有弄成功嘛?  求指导

上一篇:ZIGBEE在智能小区管理的应用
下一篇:NRF24L01+无线数传模块

手机天线设计培训教程详情>>

手机天线设计培训教程 国内最全面、系统、专业的手机天线设计培训课程,没有之一;是您学习手机天线设计的最佳选择...【More..

射频和天线工程师培训课程详情>>

  网站地图