打印

51单片机控制NRF905收发模块一直出错

[复制链接]
1495|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
teejay|  楼主 | 2013-3-28 00:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 teejay 于 2013-3-29 10:44 编辑

  用AT89S52来控制nrf905无线收发模块的数据发送与接收,再把接收端收到的数据通过串口传到PC机,但是一直出错,调了好几天了,还是这个问题,PC端收到的数据一直是00 00 00 00,若把接收程序main()函数中的数据接收函数注释掉,PC显示的就是接收程序中给接收数组事先赋的值,而只要一加上那个接收函数,PC收到的就都是0了,劳烦各位帮忙看看问题出在哪,谢谢了~程序如下:

下面是我的收发程序:
//////发送端程序///////////////
#include<reg52.h>
#include <ABSACC.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
/////////////////////////////
#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
#define RTP 0x21
#define WTA 0x22
#define RTA 0x23
#define RRP 0x24
bdata unsigned  char DATA_BUF;
#define DATA7 ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
sbit flag=DATA_BUF^7;
sbit flag1=DATA_BUF^0;
unsigned char TxRxBuf[4]=
{
0x31,0x32,0x33,0x34
};   
//IO/////////////
sbit TXEN=P1^7;
sbit TRX_CE=P1^6;
sbit PWR=P1^5;
///SPI IO///////
sbit MISO=P1^1;
sbit MOSI=P1^0;
sbit SCK=P3^7;
sbit CSN=P3^3;
//static IO//
sbit CD=P1^4;
sbit AM=P1^3;
sbit DR=P3^2;
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^3;
/////////////////
void Delaynop(void);   
//RF寄存器配置//
unsigned char idata RFConf[11]=
{
  0x00,                             //配置命令//
  0x4c,                             //CH_NO,配置频段在423MHZ
  0x0C,                             //输出功率为10db,不重发,节电为正常模式
  0x44,                             //地址宽度设置,为4字节
  0x04,0x04,                        //接收发送有效数据长度为32字节
  0xCC,0xCC,0xCC,0xCC,              //接收地址
  0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
bit lcdbit;
code TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
///////////延时/////////////////
static void Delay(uint n)
{
uint i;
while(n--)
for(i=0;i<80;i++);
}
void Delaynop(void)
{
    unsigned char i;
for(i=0;i<10;i++);
}
///////////////
unsigned char SpiRead(void)
{
unsigned char i;
for (i=0;i<8;i++)
{
DATA_BUF=DATA_BUF<<1;
SCK=1;
Delaynop();
if (MISO)//读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=BYTE_BIT0;
}
else
{
DATA_BUF&=~BYTE_BIT0;
}
SCK=0;
Delaynop();
}
return DATA_BUF;
}
void SpiWrite(unsigned char send)
{
unsigned char i;
DATA_BUF=send;
for (i=0;i<8;i++)
{
if (DATA7)//总是发送最高位
{
MOSI=1;
}
else
{
MOSI=0;
}
SCK=1;
Delaynop();
DATA_BUF=DATA_BUF<<1;
SCK=0;
Delaynop();
}
}
////////////////初始化nRF905///////////////////
void nRF905Init(void)
{
    CSN=1;// Spi disable
SCK=0;// Spi clock line init low
DR=0;// Init DR for input
AM=0;// Init AM for input
CD=0;// Init CD for input
PWR=1;// nRF905 power on
TRX_CE=0;// Set nRF905 in standby mode
TXEN=0;// set radio in Rx mode
}
////////初始化寄存器
void Config905(void)
{
uchar i;
CSN=0;// Spi enable for write a spi command
for (i=0;i<11;i++)// Write configration words  写放配置字
{
   SpiWrite(RFConf
);
}
CSN=1;// Disable Spi
}
/////////////发送数据
void TxPacket(void)
{
uchar i;
CSN=0;
SpiWrite(WTP);// Write payload command
for (i=0;i<4;i++)
{
SpiWrite(TxRxBuf
);// Write 4 bytes Tx data
}// Spi enable for write a spi command
CSN=1;
Delay(1);// Spi disable
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(TxAddress
);
}
CSN=1;// Spi disable
TRX_CE=1;// Set TRX_CE high,start Tx data transmission
Delay(5);// while (DR!=1);
TRX_CE=0;// Set TRX_CE low
}
void SetTxMode(void)
{
TRX_CE=0;
TXEN=1;
Delay(2); // delay for mode change(>=650us)
}
void SetRxMode(void)
{
TXEN=0;
TRX_CE=1;
Delay(2); // delay for mode change(>=650us)
}
void main()
{
  nRF905Init();
  Config905();
  LED3=0;
  Delay(2000);
  LED3=1;
  while(1)
  {
    LED2=0;
Delay(2000);
LED2=1;
Delay(2000);
SetRxMode();
Delay(2);
SetTxMode();
TxPacket();
LED3=0;
    Delay(2000);
     LED3=1;
Delay(2);
Delay(5000);
  }
}
/////////////////////////////////////////////////////////
//接收端程序/////////////////////////////////////////////
#include<reg52.h>
#include <ABSACC.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
/////////////////////////////
#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
#define RTP 0x21
#define WTA 0x22
#define RTA 0x23
#define RRP 0x24
bdata unsigned  char DATA_BUF;
#define DATA7 ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
sbit flag=DATA_BUF^7;
sbit flag1=DATA_BUF^0;
unsigned char RxBuf[4]=
{
0x34,0x33,0x32,0x31
};   
//IO/////////////
sbit TXEN=P1^7;
sbit TRX_CE=P1^6;
sbit PWR=P1^5;
///SPI IO///////
sbit MISO=P1^1;
sbit MOSI=P1^0;
sbit SCK=P3^7;
sbit CSN=P3^3;
//static IO//
sbit CD=P1^4;
sbit AM=P1^3;
sbit DR=P3^2;
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^3;
/////////////////
void Delaynop(void);   
//RF寄存器配置//
unsigned char idata RFConf[11]=
{
  0x00,                             //配置命令//
  0x4c,                             //CH_NO,配置频段在423MHZ
  0x0C,                             //输出功率为10db,不重发,节电为正常模式
  0x44,                             //地址宽度设置,为4字节
  0x04,0x04,                        //接收发送有效数据长度为32字节
  0xCC,0xCC,0xCC,0xCC,              //接收地址
  0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
bit lcdbit;
code TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
///////////延时/////////////////
static void Delay(uint n)
{
uint i;
while(n--)
for(i=0;i<80;i++);
}
void Delaynop(void)
{
    unsigned char i;
for(i=0;i<10;i++);
}
///////////////
unsigned char SpiRead(void)
{
unsigned char i;
for (i=0;i<8;i++)
{
DATA_BUF=DATA_BUF<<1;
SCK=1;
Delaynop();
if (MISO)//读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=BYTE_BIT0;
}
else
{
DATA_BUF&=~BYTE_BIT0;
}
SCK=0;
Delaynop();
}
return DATA_BUF;
}
void SpiWrite(unsigned char send)
{
unsigned char i;
DATA_BUF=send;
for (i=0;i<8;i++)
{
if (DATA7)//总是发送最高位
{
MOSI=1;
}
else
{
MOSI=0;
}
SCK=1;
Delaynop();
DATA_BUF=DATA_BUF<<1;
SCK=0;
Delaynop();
}
}
////////////////初始化nRF905///////////////////
void nRF905Init(void)
{
    CSN=1;// Spi disable
SCK=0;// Spi clock line init low
DR=0;// Init DR for input
AM=0;// Init AM for input
CD=0;// Init CD for input
PWR=1;// nRF905 power on
TRX_CE=0;// Set nRF905 in standby mode
TXEN=0;// set radio in Rx mode
}
////////初始化寄存器
void Config905(void)
{
uchar i;
CSN=0;// Spi enable for write a spi command
for (i=0;i<11;i++)// Write configration words  写放配置字
{
   SpiWrite(RFConf
);
}
CSN=1;// Disable Spi
}
void SetTxMode(void)
{
TRX_CE=0;
TXEN=1;
Delay(2); // delay for mode change(>=650us)
}
void SetRxMode(void)
{
TXEN=0;
TRX_CE=1;
Delay(2); // delay for mode change(>=650us)
}
unsigned char CheckDR(void)//检查是否有新数据传入 Data Ready
{
if (DR=1&&TRX_CE==1 && TXEN==0)
{
return 1;
}
else
{
return 0;
}
}
void RxPacket(void)
{
uchar i;
    Delay(1);
    Delay(100);
    TRX_CE=0;
CSN=0;// Spi enable for write a spi command
    Delay(1);
SpiWrite(RRP);
for (i = 0;i < 4 ;i++)
{     
RxBuf
=SpiRead();// Read data and save to buffer      
}
CSN=1;
          Delay(10);
TRX_CE=1;
}
////////////////
void  RX(void)
{
          SetRxMode();// Set nRF905 in Rx mode
//          while (CheckDR()==0);
         //Delay(10000);
if( CheckDR()==1)
   {
     Delay(10);
       RxPacket();
    }
  Delay(10);
}
void Init_MCU(void)
{
    SCON = 0x50;       /* uart in mode 1 (8 bit), REN=1 */
TMOD = 0x20 ;         /* Timer 1 in mode 2 */
TH1  = 0xFA;                 /* 9600 Bds at 11.059MHz */
TL1  = 0xFA;        /* 9600 Bds at 11.059MHz */
PCON=0X80;
TR1 = 1;        
}
void Sendpc(uchar mess)
{
  SBUF=mess;
  while(TI==0);
  TI=0;
}
void main()
{
  uchar i;
  Init_MCU();
  nRF905Init();
  Config905();
  Delay(5);
  while(1)
  {
for(i=0;i<4;i++)
{
Sendpc(RxBuf
);
}
SetRxMode();
RxPacket();
/*!注如果我把这句RxPacket()注释掉,PC端收到的是接收函数里接收数组事先定义的值,但是加了这个接收函数之后,PC收到的就一直是00 00 00 00  */
SetTxMode();   
Delay(500);
for(i=0;i<4;i++)
{
Sendpc(RxBuf
);
}
SetTxMode();
Delay(2);
Delay(5000);  
  }
}

相关帖子

沙发
interview| | 2013-3-28 22:09 | 只看该作者
《2012年度中国1-2线城市外资电子电气工程行业薪酬福利报告》之采购总监
www。eepeople。com是为全球电子/电气工程领域从业人员打造人脉互动、交友、技术交流和商务合作的平台。我们希望通过这份最新推出的《2012年度中国1-2线城市外资电子电气工程行业薪酬福利报告》,让您的职业规划道路锦上添花。
请看《2012年度中国1-2线城市外资电子电气工程行业薪酬福利报告》之采购总监

职位名称:  采购总监
职位描述:
1、协助决策层制定公司发展战略,负责公司短期及长期的采购决策和战略,对公司中长期目标达成产生重要影响;
2、全面负责公司采购工作,制定公司采购战略;
3、编制供应商开发计划、采购计划,并组织实施;
4、负责供应商选择、商务谈判等工作;
5、规划采购预算,控制采购成本;
6、建设和维护供应商管理体系。
以下为本职位在北京、上海、深圳的外资电子/电气工程行业于2012年的平均薪酬和福利信息:
本职位在北京、上海、深圳的外资电子电气工程行业的平均薪酬信息如下:
工作经验:北京、上海、深圳
月基本工资      4,000*币
月固定津贴      6,000*币
月奖金/提成     10,000*币
月其他浮动收入  10,000*币
年奖金收入      200,000*币
月薪数量        13个月
本职位在北京、上海、深圳的外资电子电气工程行业的平均福利信息如下:
法定福利企业缴纳部分(月)   5,000*币
培训计划                     1,000*币
补充住房公积金               1,500*币
有薪假期                     20天/年

请点击以下链接继续浏览更多城市和更多职位的薪酬福利信息。
2012年的《电子电气工程行业薪酬福利报告》包括以下城市:北京、上海、深圳、广州、成都、西安、南京、杭州、合肥、哈尔滨、沈阳。
http://www。eepeople。com/searchEventsBysubject。action?type=2
-采购总监  
-高级软件工程师
-销售总监  
-销售经理
-市场营销经理  
-采购主管
-采购总监  
-高级硬件工程师
-首席技术执行官  
-系统架构设计师
-项目总监  
-集成电路设计师
-现场应用工程师  
-项目经理

祝您阅读愉快,有所收获!!

使用特权

评论回复
板凳
chenjiancan| | 2013-3-28 22:43 | 只看该作者
void SpiWrite(unsigned char send)
{
unsigned char i;
DATA_BUF=send;
for (i=0;i<8;i++)
{
if (DATA7)//总是发送最高位
{
MOSI=1;
}
else
{
MOSI=0;
}
SCK=1;
Delaynop();
DATA_BUF=DATA_BUF<<1;
SCK=0;
Delaynop();
}
我没用过这款MCU 不知道DATA7 这个是怎么定义的

使用特权

评论回复
地板
ningling_21| | 2013-3-28 22:51 | 只看该作者
很显然是  RxPacket() 有问题...

使用特权

评论回复
5
teejay|  楼主 | 2013-3-29 10:41 | 只看该作者
chenjiancan 发表于 2013-3-28 22:43
void SpiWrite(unsigned char send)
{
unsigned char i;

DATA7在宏定义里面定义为(DATA_BUF&BYTE_BIT7) != 0,其中 BYTE_BIT7是0x80,相与之后得最高位,当最高位为1时 MOSI=1,为0时MOSI=0,从最高位开始,循环8次,一位一位地处理数据

使用特权

评论回复
6
teejay|  楼主 | 2013-3-29 10:56 | 只看该作者
ningling_21 发表于 2013-3-28 22:51
很显然是  RxPacket() 有问题...

用RxPacket()接收数据后,事先定义用来存放接收数据的数组RxBuf[4]={0x34,0x33,0x32,0x31}里的值就都变成{0x00,0x00,0x00,0x00}了,说明RxPacket()对数组RxBuf[]产生了影响,正常的话发送端我事先定义要发送的数据是{0x31,0x32,0x33,0x34},我现在不知道是发送端有问题然后发过来的都是00 00 00 00,还是接收函数有问题,但是我参考了很多例程,接收函数基本都是这样写的,别人都能调通,实在困惑...

使用特权

评论回复
7
yhhsky| | 2013-3-29 19:24 | 只看该作者

使用特权

评论回复
8
teejay|  楼主 | 2013-4-15 22:15 | 只看该作者
我改了一下SPI的读写时序,程序又莫名其妙的通了。。。其实我觉得程序没问题。。。真奇怪,最近比较忙,闲了我在改程序看看是不是SPI时序的问题。。。。顺便再请教一下大家,NRF905模块的传输距离是否可以通过改变天线来增加传输距离,还有其他方法增强传输距离吗,谢谢~

使用特权

评论回复
9
梦幻FLY| | 2013-5-7 21:15 | 只看该作者
我最近也在做NRF905,程序跟你的差不多,我这个也有个相似的问题,就是两边相互发送。上位机端发送数据,下位机端可以接收到数据。然后下位机端进入发送模式,给上位机发送。上位端 好像收不到.(上位端在发送完数据以后,就转换成了接收模式)这个问题 我不知道如何解决 ,求方法。谢谢

使用特权

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

本版积分规则

1

主题

7

帖子

0

粉丝