打印

请教有关nrf905的程序问题

[复制链接]
1565|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
百合蜜茶|  楼主 | 2013-5-11 20:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请高手帮我看看我的发送程序,到底是什么问题,一直发送不出去
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#include <ABSACC.h>
#define uchar unsigned char
#define uint unsigned int
//*******************定义命令字**********************
#define WC 0x00        // Writeconfigurationregistercommand
#define RC 0x10        //Read configurationregistercommand
#define WTP 0x20       //WriteTXPayload command
#define RTP 0x21       //Read TXPayload command
#define WTA 0x22       //WriteTXAddress command
#define RTA 0x23
#define RRP 0x24
//---------------------------------------------------------------
#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

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;
//*******************管脚配置*********
//SPI口定义
sbit MOSI=P1^4;
sbit CSN=P1^5;
sbit SCK=P3^1;
sbit MISO=P3^0;
//配置口
sbit TRX_CE=P1^6;
sbit TXEN=P1^0;
sbit PWR=P1^1;
//状态口
sbit DR=P1^3;
sbit CD=P1^2;
sbit AM=P1^7;

sbit K1=P2^4;
//sbit K2=P2^5;
//sbit K3=P2^6;
//sbit K4=P2^7;

sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
//sbit d4=P0^3;
//uchar tf;
uchar TxRxBuf[4]={0x31,0x32,0x33,0x34};
uchar TxAddress[4]={0xE7,0xE7,0xE7,0xE7};

uchar RFConf[11]={0x00,0x4C,0x0E,0x44,0x04,0x04,0xE7,0xE7,0xE7,0xE7,0xDE};
//------------------------------------------------
void Delay(uint x)
{
uint i;
for(i=0;i<x;i++)
{
_nop_();
}
}          
//----------------------------------100us延时子程序-----------------------------
/*void Delay(uint x)
{
        uint i;
        while(x--)
        for(i=0;i<80;i++);
}        */
//=================================================SPI读函数=======================================================
unsigned char SpiRead(void)
{
         uchar i;
        for (i=0;i<8;i++)
        {
        DATA_BUF=DATA_BUF<<1;
                SCK=1;
                if (MISO)        //读取最高位,保存至最末尾,通过左移位完成整个字节
                {
                        DATA_BUF|=BYTE_BIT0;
                }
                else
                {
                        DATA_BUF&=~BYTE_BIT0;
                }
                SCK=0;
         }
         return DATA_BUF;
}
//=========================NRF905 SPI读写函数(IO模拟SPI时序)==================
void SpiWrite( uchar send)
{
        unsigned char i;
        DATA_BUF=send;
        for (i=0;i<8;i++)
        {
        if (((DATA_BUF&0x80) != 0))        //总是发送最高位
        {
            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=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[i]);
        }
        CSN=1;                    // Disable Spi
}
//--------------------------------------------------
  void TxPacket(void)
{
    uchar i;
        TXEN=1;
    CSN=0;
        SpiWrite(WTP);
        for(i=0;i<4;i++)
        {
                SpiWrite(TxRxBuf[i]);
        }
     CSN=1;
        _nop_();_nop_();
        CSN=0;
        SpiWrite(WTA);
   for(i=0;i<4;i++)
   {
                   SpiWrite(TxAddress[i]);
   }

        CSN=1;
        _nop_();_nop_();
        TRX_CE=1;
        Delay(50);
    TRX_CE=0;
        while(!DR);
        }

//-------------------------------------------------
void Set_TxMode()
{
    PWR=1;            // PWR_UP TRX_CE TXEN MODE
        TRX_CE=0;           // 1 1 1SHOCKBURSTTX
        TXEN=1;
        Delay(2000);          //timeustbe>=650us
}
//-----------------------------------------------------
void main()
{
        nRF905Init();
    Config905();
        K1=1;
        LED1=1;
        LED2=1;
        LED3=1;
        while(1)
        {
                Set_TxMode();
                if(K1==0)
        {        Delay(10);
                if(K1==0)
                {
                        LED1=0;
                        Delay(1000);
                        LED1=1;
                        Delay(1000);

                        TxPacket();

                        Delay(200);
                        LED2=0;
                        Delay(1000);
                        LED2=1;
                        Delay(1000);
                }
                else  
                   { LED3=0;Delay(1000);LED3=1;Delay(1000);        }
        }             
        }

}

相关帖子

沙发
sfpxfpcfp| | 2013-5-13 12:41 | 只看该作者
只搞过RF2401的悄悄路过

使用特权

评论回复
板凳
chentongxiong| | 2013-5-19 00:35 | 只看该作者
#include <reg52.h>
#include <fasong.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

uchar data tx_buf[4] = {0x29,0x00,0x00,0x00};

//----------------------------------------NRF905工作模式控制端口------------------------------------------------------
sbit        TXEN   = P2^4;
sbit        TRX_CE = P3^2;
sbit        PWR    = P2^3;
//----------------------------------------NRF905 数据交换端口---------------------------------------------------
sbit        MISO   = P2^6;
sbit        MOSI   = P2^1;
sbit        SCK    = P2^5;
sbit        CSN    = P2^0;
//----------------------------------------nrf905状态端口---------------------------------------------------------
sbit        AM     = P2^7;
sbit        DR     = P3^3;
sbit        CD     = P2^2;
//------------------------------------------------NRF905寄存器配置------------------------------------------------
unsigned char idata RFConf[11]=
{
  0x00,                             //配置命令//
  0x6c,                             //CH_NO,配置频段在433.2MHZ
  0x0c,                             //输出功率为10db,不重发,节电为正常模式
  0x44,                             //地址宽度设置,为4字节
  0x04,0x04,                        //接收发送有效数据长度为4字节
  0xE7,0xE7,0xE7,0xE7,              //接收地址
  0xDE                             //CRC充许,16位CRC校验,外部时钟信号使能,16M晶振
};
//延时函数
void delay(uint ms)
{
  uint j;
  while(ms--)
  {
    for(j=115;j>0;j--);
  }
}
//SPI写函数
void WriteSPI(uchar d)
{
  uchar i=8;
  while(i--)
  {
    delay(1);
        SCK = 0;
        MOSI = (bit)(d&0x80);
        d<<=1;
        delay(1);
        SCK = 1;
        delay(1);
        SCK = 0;
  }
  SCK = 0;
}
//数据发送
void Send_nRF905(void)
{
  TXEN = 1;   //enable  TX
  CSN = 0;   //wait cmd
  WriteSPI(0x22);
  WriteSPI(0xE7);
  WriteSPI(0xE7);
  WriteSPI(0xE7);
  WriteSPI(0xE7);
  CSN = 1;  //close SPI
  _nop_();
  _nop_();
  CSN = 0;  // Transmission Data
  WriteSPI(0x20);
  WriteSPI(tx_buf[3]);
  WriteSPI(tx_buf[2]);
  WriteSPI(tx_buf[1]);
  WriteSPI(tx_buf[0]);
  CSN = 1; // close SPI
  _nop_();
  _nop_();
  TRX_CE = 1;  //enter TX mode star RF_TX
  delay(5);
  TRX_CE = 0;
  while(!DR);
}
//初始化nRF905
void Init_nRF905(void)
{
  uchar i;
  CSN = 1;
  SCK = 0;
  PWR = 1;
  TRX_CE = 0;
  TXEN = 0;
  _nop_();
  CSN = 0;
  for(i=0;i<11;i++)
  {
    WriteSPI(RFConf[i]);
  }
  CSN = 1;
  PWR = 1;
  delay(100);
}
我用的程序,已成功,你可以参考一下

使用特权

评论回复
地板
百合蜜茶|  楼主 | 2013-5-24 16:24 | 只看该作者
谢谢这位高手提供资料,貌似这只是一半的程序,能否方便提供一下整个程序,呵呵,我看不懂我的问题出在哪里,谢啦!

使用特权

评论回复
5
Daojia211| | 2013-5-26 16:28 | 只看该作者
你有没有写NRF905 的发送指令?是不是我眼花,我发现你貌似没写发送程序啊,可以参考3楼的。

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝