- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
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);
}
}
谁能帮忙找找问题,找了一晚上了,还是不行!
#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+无线数传模块