打印

求助,51写的NRF905不能正常工作。

[复制链接]
2239|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tkin1992|  楼主 | 2011-7-12 16:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tkin1992 于 2011-7-12 16:35 编辑

发射部分:
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

#define BYTE_BIT0 0x01
#define BYTE_BIT1 0x02
#define BYTE_BIT2 0x04
#define BYTE_BIT3 0x08
#define BYTE_BIT4 0x10
#define BYTE_BIT5 0x20
#define BYTE_BIT6 0x40
#define BYTE_BIT7 0x80

//SPI指令
#define WC    0x00
  //写配置寄存器
#define RC    0x10
  //读配置寄存器
#define WTP   0x20
  //向TX-Payload寄存器写入发送有效数据
#define RTP   0x21
  //向TX-Payload寄存器读取发送有效数据
#define WTA   0x22
  //向TX-Address寄存器读取发送有效数据
#define RTA   0x23
  //向TX-Address寄存器读取发送有效数据
#define RRP   0x24
  //向RX-Payload寄存器读取接收到的有效数据

uchar DATA_BUF;
uchar RxTxBuf[4]={'1','9','9','\0'};

typedef struct RFConfig
{

uchar n;

uchar buf[11];
}RFConfig;

//配置口定义
sbit TX_EN  =P0^0;
sbit TRX_CE =P0^1;
sbit PWR_UP =P0^2;
sbit MISO   =P0^3;
sbit MOSI   =P0^4;
sbit SCK    =P0^5;
sbit CSN    =P0^6;
sbit AM     =P0^7;
sbit DR     =P3^5;
sbit CD     =P3^6;

code RFConfig RxTxConf=
{

11,

0x00,
//配置命令WC

0x4c,
//CH_NO配置频段在430MHZ

0x0c,
//输出功率为10db,不重发,节电为正常模式

0x44,
//地址宽度设置为4字节

0x04,0x04,
//接收发送有效数据长度为4字节

0xCC,0xCC,0xCC,0xCC,
//接收地址

0x58
//CRC允许,8位CRC校验,外部时钟信号不使能,16M晶振
};

//=========================================
//函数功能:延时1ms
//=========================================
void Delay(int a)
{

uchar b;

for (;a>0;a--)

for (b=125;b>0;b--);
}

//=========================================
//函数功能:NRF905初始化
//=========================================
void NRF905Init(void)
{

CSN=1;      // Spi disable

SCK=0;      // Spi clock line init low

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
}

/*//=========================================
//函数功能:Spi读函数
//=========================================
uchar SpiRead(void)
{

uchar i;

for (i=0;i<8;i++)

{
   
DATA_BUF<<=1;
  

SCK=1;
   
if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
   
{
   
DATA_BUF|=BYTE_BIT0;
   
}
   
else
   
{
   
DATA_BUF&=~BYTE_BIT0;
   
}
   
SCK=0;

}

return DATA_BUF;

}*/

//=========================================
//函数功能:Spi写函数
//=========================================
void SpiWrite(uchar dat)
{

uchar i;

DATA_BUF=dat;

for (i=0;i<8;i++)

{
   
if ((DATA_BUF&BYTE_BIT7) != 0) //总是发送最高位
   
{
   
MOSI=1;
   
}
   
else
   
{
   
MOSI=0;
   
}
   
SCK=1;
   
DATA_BUF<<=1;
   
SCK=0;

}
}

//=========================================
//函数功能:初始化寄存器
//=========================================
void Config905(void)
{

uchar i;     

CSN=0;      
// Spi enable for write a spi command

SpiWrite(WC);   
// Write config command

for (i=0;i<RxTxConf.n;i++)  // Write configration words

{
  
SpiWrite(RxTxConf.buf);

}

CSN=1;      
// Disable Spi
}

//=========================================
//函数功能:发送数据
//=========================================
void TxPacket(void)
{

uchar i;

CSN=0;      
// Spi enable for write a spi command

SpiWrite(WTP);   
// Write payload command

for (i=0;i<4;i++)

{
  
SpiWrite(RxTxBuf); // Write 4 bytes Tx data

}

CSN=1;      
// Spi disable      

Delay(1);

CSN=0;      
// Spi enable for write a spi command

SpiWrite(WTA);   
// Write address command

for (i=0;i<4;i++)   
// Write 4 bytes address

{
  
SpiWrite(RxTxConf.buf[i+5]);

}

CSN=1;      
// Spi disable

TRX_CE=1;     
// Set TRX_CE high,start Tx data transmission

Delay(1);     

TRX_CE=0;     

// Set TRX_CE low
}

/*//=========================================
//函数功能:接收数据
//=========================================
void RxPacket(void)
{

uchar i;

TRX_CE=0;     
// Set nRF905 in standby mode

CSN=0;      
// Spi enable

SpiWrite(RRP);   
// Read payload command

for (i=0;i<4;i++)

{
  
RxBuf=SpiRead(); // Read data and save to buffer  

}

CSN=1;      
// Disable spi

while(DR||AM);

TRX_CE=1;      
}*/

//=========================================
//函数功能:设置为发送模式
//=========================================
void SetTxMode(void)   
{

TX_EN=1;
   //Select RX mode

TRX_CE=0;
   //Enables chip for receive and transmit

Delay(1);      //Delay for mode change(>=650us)
}

/*//=========================================
//函数功能:设置为接收模式
//=========================================
void SetRxMode(void)
{

TX_EN=0;
   //Select RX mode

TRX_CE=1;
   //Enables chip for receive and transmit

Delay(1);      //Delay for mode change(>=650us)   
}*/

//=========================================
//函数功能:主函数
//=========================================
void main()
{

uint i=0;

NRF905Init();

Config905();   // Config nRF905 module


while(1)

{
      
SetTxMode();     // Set Tx Mode
      
TxPacket();   
// Transmit Tx buffer data
   
Delay(1000);


}
}


接收部分:
#include<reg52.h>
#include <math.h>

#define uchar unsigned char
#define uint unsigned int

#define BYTE_BIT0 0x01
#define BYTE_BIT1 0x02
#define BYTE_BIT2 0x04
#define BYTE_BIT3 0x08
#define BYTE_BIT4 0x10
#define BYTE_BIT5 0x20
#define BYTE_BIT6 0x40
#define BYTE_BIT7 0x80

//SPI指令
#define WC    0x00
  //写配置寄存器
#define RC    0x10
  //读配置寄存器
#define WTP   0x20
  //向TX-Payload寄存器写入发送有效数据
#define RTP   0x21
  //向TX-Payload寄存器读取发送有效数据
#define WTA   0x22
  //向TX-Address寄存器读取发送有效数据
#define RTA   0x23
  //向TX-Address寄存器读取发送有效数据
#define RRP   0x24
  //向RX-Payload寄存器读取接收到的有效数据

#define TxRxBuf_Len 4

uchar DATA_BUF;
unsigned char TxRxBuf[TxRxBuf_Len];


typedef struct RFConfig
{

uchar n;

uchar buf[11];
}RFConfig;

//配置口定义
sbit TX_EN  =P1^0;
sbit TRX_CE =P1^1;
sbit PWR_UP =P1^2;
sbit MISO   =P1^3;
sbit MOSI   =P1^4;
sbit SCK    =P1^5;
sbit CSN    =P1^6;
sbit AM     =P1^7;
sbit DR     =P3^5;
sbit CD     =P3^6;

sbit rw=P2^5;//读写选择端(0/1)
sbit rs=P2^6;//数据命令选择端(1/0)
sbit en=P2^7;//1602使能端口

code RFConfig RxTxConf=
{

11,

0x00,
//配置命令WC

0x4c,
//CH_NO配置频段在430MHZ

0x0c,
//输出功率为10db,不重发,节电为正常模式

0x44,
//地址宽度设置为4字节

0x04,0x04,
//接收发送有效数据长度为4字节

0xCC,0xCC,0xCC,0xCC,
//接收地址

0x58
//CRC允许,8位CRC校验,外部时钟信号不使能,16M晶振
};

//=========================================
//函数功能:延时1ms
//=========================================                                                                                                                          
void Delay(uint a)//延时1ms
{
    uchar b;
    for(a;a>0;a--)
        for(b=125;b>0;b--);
}

//=========================================
//函数功能:向1602发送命令
//=========================================
void lcdwritecom(uchar com)
{
    rs=0;
    P0=com;
    Delay(5);
    en=1;
    Delay(5);
    en=0;
}

//=========================================
//函数功能:向1602发送数据
//=========================================
void lcdwritedat(uchar dat)
{
    rs=1;
    P0=dat;
    Delay(5);
    en=1;
    Delay(5);
    en=0;
}

//=========================================
//函数功能:1602初始化
//=========================================
void lcdinit()
{
    en=0;
    rw=0;               //选择写
    lcdwritecom(0x01);  //清屏

Delay(5);
    lcdwritecom(0x38);  //设置显示模式
    lcdwritecom(0x0c);  //设置开显示,不显示光标
    lcdwritecom(0x06);  //写一个字符后地址指针加1      
}

//=========================================
//函数功能:NRF905初始化
//=========================================
void NRF905Init(void)
{

CSN=1;      // Spi disable

SCK=0;      // Spi clock line init low

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
}

//=========================================
//函数功能:Spi读函数
//=========================================
uchar SpiRead(void)
{

uchar i;

for (i=0;i<8;i++)

{
   
DATA_BUF<<=1;
  

SCK=1;
   
if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
   
{
   
DATA_BUF|=BYTE_BIT0;
   
}
   
else
   
{
   
DATA_BUF&=~BYTE_BIT0;
   
}
   
SCK=0;

}

return DATA_BUF;

}

//=========================================
//函数功能:Spi写函数
//=========================================
void SpiWrite(uchar dat)
{

uchar i;

DATA_BUF=dat;

for (i=0;i<8;i++)

{
   
if ((DATA_BUF&BYTE_BIT7) != 0) //总是发送最高位
   
{
   
MOSI=1;
   
}
   
else
   
{
   
MOSI=0;
   
}
   
SCK=1;
   
DATA_BUF<<=1;
   
SCK=0;

}
}

//=========================================
//函数功能:初始化寄存器
//=========================================
void Config905(void)
{

uchar i;     

CSN=0;      
// Spi enable for write a spi command

SpiWrite(WC);   
// Write config command

for (i=0;i<RxTxConf.n;i++)  // Write configration words

{
  
SpiWrite(RxTxConf.buf);

}

CSN=1;      
// Disable Spi
}

/*//=========================================
//函数功能:发送数据
//=========================================
void TxPacket(void)
{

uchar i;

CSN=0;      
// Spi enable for write a spi command

SpiWrite(WTP);   
// Write payload command

for (i=0;i<4;i++)

{
  
SpiWrite(TxBuf); // Write 32 bytes Tx data

}

CSN=1;      
// Spi disable      

Delay(1);

CSN=0;      
// Spi enable for write a spi command

SpiWrite(WTA);   
// Write address command

for (i=0;i<4;i++)   
// Write 4 bytes address

{
  
SpiWrite(RxTxConf.buf[i+5]);

}

CSN=1;      
// Spi disable

TRX_CE=1;     
// Set TRX_CE high,start Tx data transmission

Delay(1);     

TRX_CE=0;     

// Set TRX_CE low
}*/

//=========================================
//函数功能:接收数据
//=========================================
void RxPacket(void)
{

uchar i;

TRX_CE=0;     
// Set nRF905 in standby mode

CSN=0;      
// Spi enable

SpiWrite(RRP);   
// Read payload command

for (i=0;i<4;i++)

{
  
TxRxBuf=SpiRead(); // Read data and save to buffer  

}

CSN=1;      
// Disable spi

while(DR||AM);

TRX_CE=1;      
}

/*//=========================================
//函数功能:设置为发送模式
//=========================================
void SetTxMode(void)   
{

TX_EN=1;
   //Select RX mode

TRX_CE=0;
   //Enables chip for receive and transmit

Delay(1);      //Delay for mode change(>=650us)
}*/

//=========================================
//函数功能:设置为接收模式
//=========================================
void SetRxMode(void)
{

TX_EN=0;
   //Select RX mode

TRX_CE=1;
   //Enables chip for receive and transmit

Delay(1);      //Delay for mode change(>=650us)   
}

//=========================================
//函数功能:显示函数
//=========================================
void display()
{

uchar i;

lcdwritecom(0x80);

for(i=0;TxRxBuf!='\0';i++)
    {
        lcdwritedat(TxRxBuf);
    }
}

//=========================================
//函数功能:主函数
//=========================================
void main()
{

NRF905Init();

Config905();

lcdinit();

while(1)

{

SetRxMode();

RxPacket();

display();

Delay(100);

}
}


我用的3.3V供电,其余口直接和51单片机项链。问题:把程序下进去不给NRF905供电测得VCC和GND约0.9V,此时模块能发送数据,但是是乱码;给模块供电后不能发送数据。。。小弟初学,请给位大侠赐教。谢谢

NRF905.rar

102.62 KB

相关帖子

沙发
hotpower| | 2011-7-12 19:47 | 只看该作者
搜索“nrf905 hotpower”

使用特权

评论回复
板凳
teejay| | 2013-3-28 17:53 | 只看该作者
您好,我最近也在用nRF905模块,出现了不少问题,我想问问你这个最后调通了吗,问题是出在哪了

使用特权

评论回复
地板
yhhsky| | 2013-3-29 22:35 | 只看该作者

使用特权

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

本版积分规则

0

主题

15

帖子

0

粉丝