打印

nRF905调试问题

[复制链接]
2275|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Mobile1991|  楼主 | 2014-5-31 10:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
两个组合模块:51单片机+nRF905模块,一个为发送方32个字节数据,接收方接收32个字节数据,并将接收到的数据送至PC显示。
结果是,发送和接收两者之间的通信不成功。
已经验证过接收方的MCU和PC机之间的串口通信是正常的;
也验证单片机和905之间的SPI通信时正常的;
示波器观察发送发905的DR引脚,有跳变,说明发送方是正常的;
示波器观察接收方905的DR引脚,DR信号很微弱,被50Hz的正弦波信号淹没,可知,问题出在接收方。
有坛友提出,是905的寄存器配置问题,这程序里,发送方和接收方的寄存器配置是相同的,10个字节的配置如下
{
    0x4c,        //配置频段为430MHz,
    0x0c,       //输出功率为10dBm,正常接收模式,不自动重发
    0x44,      //接收、发送的地址宽度为4字节
    0x20,0x20,  //接收、发送有效数据宽度为32字节
    0xcc,0xcc,0xcc,0xcc,   //接收地址的4个字节为0xcc,0xcc,0xcc,0xcc
    0x58 ,  //CRC校验允许,8位CRC校验,外部时钟信号不使能,16M晶振
}
配置寄存器的字节5,6,7,8分别是RX地址的0字节,1字节,2字节,和3字节。
发送方和接收方的RX地址的字节配置都是0xcc,0xcc,0xcc,0xcc,
在发送方通过将TRX_CE置高来启动发送之前,通过SpiWrite(WTA)写入了TX地址,且为0xcc,0xcc,0xcc,0xcc。
保证发送方和接收方地址匹配来建立通信。
所以,目前还不知道问题出在哪里?

相关帖子

沙发
Mobile1991|  楼主 | 2014-5-31 10:27 | 只看该作者
将发送方程序贴出,希望坛友能多多指教!谢谢!
#include <reg52.h>
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.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
////////////////
#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;
#define TxRxBuf_Len 32
                                                       
unsigned char TxRxBuffer[32];
//----------------------------------------------NRF905控制IO------------------------------------------------------
sbit        TXEN=P1^0;
sbit        TRX_CE=P3^2;
sbit        PWR=P1^1;
//----------------------------------------------NRF905 SPI接口---------------------------------------------------
sbit        MISO=P1^6;
sbit        MOSI=P1^5;
sbit        SCK=P1^7;
sbit        CSN=P1^3;
//----------------------------------------nrf905状态标志---------------------------------------------------------
sbit        AM=P1^4;
sbit        DR=P3^3;
sbit        CD=P1^2;
//---------------------------------------------------------------------------------------------------------------
sbit        led1=P2^0;
sbit        led2=P2^1;

//RF寄存器配置//
unsigned char idata RFConf[11]=
{
  0x00,                             //配置命令//
   0x4c,                             //CH_NO,配置频段在915MHZ
  0x0c,                             //输出功率为10db,不重发,节电为正常模式
0x44,
0x20,0x20,
0xcc,0xcc,0xcc,0xcc,
0x58,                            //CRC允许,8位CRC校验,外部时钟信号不使能,16M晶振
};

///////////80us延时/////////////////
void Delay(uchar n)
{
        uint k;
        while(n--)
        for(k=0;k<8;k++);
}
///////////////
unsigned char SpiRead(void)
{
        unsigned char j;
        for (j=0;j<8;j++)
        {
        DATA_BUF=DATA_BUF<<1;
                SCK=1;
                if (MISO)        //读取最高位,保存至最末尾,通过左移位完成整个字节
                {
                        DATA_BUF|=BYTE_BIT0;
                }
                else
                {
                        DATA_BUF&=~BYTE_BIT0;
                }
                SCK=0;
         }
         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;
                DATA_BUF=DATA_BUF<<1;
                SCK=0;
        }
}
////////////////初始化nRF905///////////////////
void nRF905Init(void)
{
    CSN=1;                                                // Spi         disable
        SCK=0;                                                // Spi clock line init low

     DR=1;
        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
        SpiWrite(WC);                                // Write config command写放配置命令
        for (i=0;i<11;i++)        // Write configration words  写放配置字
        {
           SpiWrite(RFConf[i]);
        }
        CSN=1;                                        // Disable Spi
}
void SetRxMode(void)
{
        TXEN=0;
        TRX_CE=1;
        Delay(1);                                         // delay for mode change(>=650us)
}

unsigned char CheckDR(void)                //检查是否有新数据传入 Data Ready
{
        if (DR=1&&TRX_CE==1 && TXEN==0)
        {

                return 1;
        }
        else
        {
                return 0;
        }
}
unsigned char   RxPacket(void)                                                        //读数据
{
        uchar i;
        if(CheckDR()==1)
          {  
            TRX_CE=0;
                CSN=0;                                                // Spi enable for write a spi command
            Delay(1);
                SpiWrite(RRP);
                for (i = 0 ;i < 32 ;i++)
                {      
                        TxRxBuffer[i]=SpiRead();                // Read data and save to buffer   
                }
                CSN=1;
       
           while(DR||AM);
                TRX_CE=1;
                return 1;
        }
        else
        {
                return 0;
        }

                                                               
}

void StartUART( void )
{                                                          //波特率19200
     TMOD = 0x20;
     TH1 = 0xFD;
     TL1 = 0xFD;

     PCON = 0x80;

         SM0=1;
         SM1=1;
     TR1 = 1;
}
void R_S_Byte(uchar R_Byte)
{       
        ES=0;
        TI=0;
         SBUF = R_Byte;  
     while( TI == 0 );                                //查询法
           TI = 0;
         ES=1;

}
void main(void)
{
        StartUART();
        nRF905Init();
             Config905();
        while(1)
        {
                char i;
            SetRxMode();
                if(RxPacket()==1)//如果接收完数据,LED1和LED2闪烁
                {
                        led1=0;
                        led2=0;
                        Delay(255);
                        led1=1;
                        led2=1;
                        Delay(255);       
                }

       
                for(i=0;i<32;i++)//将接收到的数据送至PC显示
                {
                R_S_Byte(TxRxBuffer[i]);
                Delay(1);
                }
       
               
        }
}



使用特权

评论回复
板凳
dirtwillfly| | 2014-5-31 20:49 | 只看该作者
好长的代码

使用特权

评论回复
地板
Mobile1991|  楼主 | 2014-6-2 20:22 | 只看该作者
dirtwillfly 发表于 2014-5-31 20:49
好长的代码

版主,能不能给调试提点建议呢?

使用特权

评论回复
5
dirtwillfly| | 2014-6-2 20:38 | 只看该作者
先发送一个字符试试,成功了再调试32个字符的通讯

使用特权

评论回复
6
Mobile1991|  楼主 | 2014-6-3 11:31 | 只看该作者
dirtwillfly 发表于 2014-6-2 20:38
先发送一个字符试试,成功了再调试32个字符的通讯

版主,问题解决了。问题不在软件上,接收方MCU的问题,换一块单片机就好了。
硬件,实在是太重要了!

使用特权

评论回复
7
dirtwillfly| | 2014-6-3 14:07 | 只看该作者
Mobile1991 发表于 2014-6-3 11:31
版主,问题解决了。问题不在软件上,接收方MCU的问题,换一块单片机就好了。
硬件,实在是太重要了! ...

:L
解决了就好

使用特权

评论回复
8
Mobile1991|  楼主 | 2014-6-3 16:41 | 只看该作者
dirtwillfly 发表于 2014-6-3 14:07
解决了就好

:lol

使用特权

评论回复
9
dirtwillfly| | 2014-6-3 17:12 | 只看该作者
结贴吧。最详细的结贴教程:https://bbs.21ic.com/icview-442857-1-1.html

使用特权

评论回复
10
icawei| | 2017-9-1 18:07 | 只看该作者
楼主用的是什么mcu。

使用特权

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

本版积分规则

11

主题

45

帖子

1

粉丝