OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6682|回复: 4

关于NRF905无线模块

[复制链接]

3

主题

5

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-4-3
在线时间
3 小时
发表于 2012-4-3 22:44:53 | 显示全部楼层 |阅读模式
我在测试时发现发射模块当按KEY1时  能接收,但要再按一次才会停止,我是想做一个遥控车 只是想当按键按下时就发送不按的时候就不发送,,接收和发送的程序我都改了N次还是不行,望哪位好心人帮忙改下,谢谢了本人新手
可发EMAIL:lhj8563@163.com    QQ:183995035 

程序.rar

30.57 KB, 下载次数: 227

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

5

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-4-3
在线时间
3 小时
 楼主| 发表于 2012-4-3 22:46:55 | 显示全部楼层
#include <reg52.h>
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.h>
#define uint  unsigned int
#define uchar unsigned char
#define U8     unsigned char
#define U16     unsigned int

#define   ROW(x)       (0x80|(x << 0x06))
#define   COL(x)       (x)
#define   LEN(x)       ((x-0x01) << 0x03)

#define   LEN_MASK     0x38
#define   COL_MASK     0x07
#define   ROW_MASK     0xC0
#define   ROW_COL      (ROW_MASK|COL_MASK)

#define   HexDisp(x)   HexDispArray[x]
#define   BYTE_LOW(x)  (x & 0x0F) 
#define   BYTE_HIGH(x) ((x & 0xF0)>>0x04)


//配置口定义//
sbit TXEN    =    1^6;
sbit TRX_CE =    1^0;
sbit WR    =    1^7;
//SPI口定义//
sbit MISO    =    1^1;
sbit MOSI    =    1^4;
sbit SCK    =    1^2;
sbit CSN    =    1^3;

// lcd bit define
sbit     LCD_RW = 2^2;
sbit     LCD_RS = 2^1;
sbit     LCD_EN = P2^0;
#define  LCD_DATA P0

sbit red_led  = P2^6;
sbit gre_led  = P2^7;

sbit key       = P2^4;
sbit key1      = P2^5;
sbit key2      = P2^1;
sbit key3      = P2^2;
sbit key4      = P2^3;

//sbit key1      = P2^4;

//状态输出口//
sbit DR        =    P1^5;
sbit LCD    =    P3^2;

/*/RF寄存器配置//
unsigned char idata RFConf[11]=
{
    0x00,        //配置命令//
    0x6C,        //CH_NO,配置频段在433.2MHZ
    0x0C,        //输出功率为10db,不重发,节电为正常模式
    0x44,        //地址宽度设置,为4字节
    0x03,0x03,    //接收发送有效数据长度为3字节
    0xE7,0xE7,0xE7,0xE7,    //接收地址
    0xC0,        //CRC充许,16位CRC校验16M晶振
};*/
   
uchar TxRxBuffer[5];
bit   success_flag=0;

uchar key_value=0;
uchar Rf_Rec_Cnt=0;

void delay_2us(U16 delay_cnt);




///////////延时/////////////////
void Delay(uint x)
{
    uint i;
    for(i=0;i<x;i++){
        _nop_();
    }
}

////////////用SPI口写数据至NRF905内//////////
void SpiWrite(unsigned char b)
{
    unsigned char i=8;
SCK=0;
    while (i--)
    {
        Delay(10);
        MOSI=(bit)(b&0x80);
        b><<=1 ; 
        Delay(10);
        SCK=1; 
        Delay(10);
        SCK=0;
    }
    SCK=0;
}
///////////////from 905 read data////////////////
unsigned char SpiRead(void)
{
    register unsigned char i=8;
    unsigned char ddata=0;
SCK=0;
    while (i--)
    {
        ddata<<=1 ;
       ddata|=MISO;
        SCK=1 ;
        Delay(10);
   SCK=0 ;
   Delay(10);
    }
    SCK=0;
    return ddata;
}
///////////////接收数据包/////////////////
void RxPacket(void)
{
    uchar i;
    i=0;
    //while(DR)
    {
        TxRxBuffer = SpiRead();
TxRxBuffer[1] = SpiRead();
TxRxBuffer[2] = SpiRead();
        //i++;
    }
}

/*
;写发射数据命令:20H
;读发射数据命令:21H
;写发射地址命令:22H
;读发射地址命令:23H
;读接收数据命令:24H
*/
void TxPacket(void)
{   PWR=1;
    TXEN=1;
TRX_CE=0; 
Delay(2);
    CSN=0;
    SpiWrite(0x22);        //写发送地址,后面跟4字节地址//
    SpiWrite(0xE7);
    SpiWrite(0xE7);
    SpiWrite(0xE7);
    SpiWrite(0xE7);
    CSN=1;
    Delay(2);
    CSN=0;
    SpiWrite(0x20);        //写发送数据命令,后面跟三字节数据//
    SpiWrite(0x01);
    SpiWrite(0x02);
    //SpiWrite(0x03);
SpiWrite(key_value);

    CSN=1;
    Delay(5);
    TRX_CE=1;                    //使能发射模式//
    Delay(500);                    //等带发送完成//
    TRX_CE=0;
while(!DR);
   
    

////////////////等待接收数据包///////////////////
uchar temp;
void Wait_Rec_Packet(void)
{
    //TXEN=0;
    //TRX_CE=1;
    //PWR=1;
    //Delay(1000);
    //while(1)
    {// if (LCD==1)
        if(DR)
        { 
            TRX_CE=0;            //如果数据准备好,则进入待机模式,以便SPI口操作
            CSN=0;
            SpiWrite(0x24);
            RxPacket();
            CSN=1;
while(DR);
TRX_CE=1;
if((TxRxBuffer[0]==0x01)&&(TxRxBuffer[1]==0x02)&&(TxRxBuffer[2]==0x03))
{
success_flag=1;
/*
    red_led=0;
    Delay(5000);
    Delay(5000);
    success_flag=0;
    red_led=1;
                             */

            
          //break;
        }
    }
}
////////////初始化配置寄存器////////////////
void Ini_System(void)
{
   // uchar i;
    
    CSN=1;
    SCK=0;
    PWR=1;
    TRX_CE=0;
    TXEN=0;
    Delay(2);
    CSN=0;

    SpiWrite( 0x00);        //配置命令//
    SpiWrite( 0x6C);        //CH_NO,配置频段在433.2MHZ
    SpiWrite( 0x0C);        //输出功率为10db,不重发,节电为正常模式
    SpiWrite( 0x44);        //地址宽度设置,为4字节
    SpiWrite( 0x03);SpiWrite( 0x03);    //接收发送有效数据长度为3字节
    SpiWrite( 0xE7);SpiWrite( 0xE7);SpiWrite( 0xE7);SpiWrite( 0xE7);    //接收地址
    SpiWrite( 0xDE); 


    /*for(i=0;i<11;i++){
        SpiWrite(RFConf);
    }*/
    CSN=1;
    PWR=1;
    TRX_CE=1;
    TXEN=0;
    Delay(1000);
}





        
void main(void)
{
   

Ini_System();

DR=1;
red_led=0;
gre_led=0;

success_flag=0;
    TRX_CE=0;
    Delay(1000);
    TXEN=0;
    TRX_CE=1;
    PWR=1;

   key_value=0x0;





    while(1)
    {   
        

if(!key)         //senfing  key0
{
Delay(5);
if(!key)
{    Delay(3);
 while(!key);  
 key_value=0xa0;    
}

}

else if(!key1)         //senfing  key1
{
Delay(5);
if(!key1)
{    Delay(3);
 while(!key1);  
 key_value=0xa1;    
}

}

if(!key2)         //senfing  key2
{
Delay(5);
if(!key2)
{    Delay(3);
 while(!key2);  
 key_value=0xa2;
}

}

if(!key3)         //senfing  key3
{
Delay(5);
if(!key3)
{    Delay(3);
 while(!key3);  
 key_value=0xa3;
}

}

if(!key4)         //senfing  key2
{
Delay(5);
if(!key4)
{    Delay(3);
 while(!key4);  
 key_value=0xa4;  
}

}



if(key_value!=0x0)
{
 red_led=1;
 TxPacket();  
 key_value=0x0;
 TXEN=0;
             TRX_CE=1;
             PWR=1;
 Delay(6000);
 red_led=0;
}

    }
}

//----------------- 20091113 START---------------


























回复 支持 反对

使用道具 举报

3

主题

5

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-4-3
在线时间
3 小时
 楼主| 发表于 2012-4-3 22:47:25 | 显示全部楼层
#include <reg52.h>
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.h>
#define uint  unsigned int
#define uchar unsigned char
#define U8     unsigned char
#define U16     unsigned int

#define   ROW(x)       (0x80|(x << 0x06))
#define   COL(x)       (x)
#define   LEN(x)       ((x-0x01) << 0x03)

#define   LEN_MASK     0x38
#define   COL_MASK     0x07
#define   ROW_MASK     0xC0
#define   ROW_COL      (ROW_MASK|COL_MASK)

#define   HexDisp(x)   HexDispArray[x]
#define   BYTE_LOW(x)  (x & 0x0F) 
#define   BYTE_HIGH(x) ((x & 0xF0)>>0x04)


//配置口定义//
sbit TXEN    =    1^6;
sbit TRX_CE =    1^0;
sbit WR    =    1^7;
//SPI口定义//
sbit MISO    =    1^1;
sbit MOSI    =    1^4;
sbit SCK    =    1^2;
sbit CSN    =    1^3;

// lcd bit define
sbit     LCD_RW = 2^2;
sbit     LCD_RS = 2^1;
sbit     LCD_EN = P2^0;
#define  LCD_DATA P0

sbit red_led  = P2^6;
sbit gre_led  = P2^7;
sbit led1  = P3^2;
sbit led2  = P3^3;
sbit led3  = P3^5;


sbit key      = P2^4;
sbit key1      = P2^5;
//sbit key1      = P2^4;

//状态输出口//
sbit DR        =    P1^5;
//sbit LCD    =    P3^2;

/*/RF寄存器配置//
unsigned char idata RFConf[11]=
{
    0x00,        //配置命令//
    0x6C,        //CH_NO,配置频段在433.2MHZ
    0x0C,        //输出功率为10db,不重发,节电为正常模式
    0x44,        //地址宽度设置,为4字节
    0x03,0x03,    //接收发送有效数据长度为3字节
    0xE7,0xE7,0xE7,0xE7,    //接收地址
    0xC0,        //CRC充许,16位CRC校验16M晶振
};*/
   
uchar TxRxBuffer[5];
bit   success_flag=0;

void delay_2us(U16 delay_cnt);
void Ini_System(void);

///////////延时/////////////////
void Delay(uint x)
{
    uint i;
    for(i=0;i<x;i++){
        _nop_();
    }
}

////////////用SPI口写数据至NRF905内//////////
void SpiWrite(unsigned char b)
{
    unsigned char i=8;
SCK=0;
    while (i--)
    {
        Delay(10);
        MOSI=(bit)(b&0x80);
        b><<=1 ; 
        Delay(10);
        SCK=1; 
        Delay(10);
        SCK=0;
    }
    SCK=0;
}
///////////////from 905 read data////////////////
unsigned char SpiRead(void)
{
    register unsigned char i=8;
    unsigned char ddata=0;
SCK=0;
    while (i--)
    {
        ddata<<=1 ;
       ddata|=MISO;
        SCK=1 ;
        Delay(10);
   SCK=0 ;
   Delay(10);
    }
    SCK=0;
    return ddata;
}
///////////////接收数据包/////////////////
void RxPacket(void)
{
    uchar i;
    i=0;
    //while(DR)
    {
        TxRxBuffer = SpiRead();
TxRxBuffer[1] = SpiRead();
TxRxBuffer[2] = SpiRead();
        //i++;
    }
}

/*
;写发射数据命令:20H
;读发射数据命令:21H
;写发射地址命令:22H
;读发射地址命令:23H
;读接收数据命令:24H
*/
void TxPacket(void)
{   PWR=1;
    TXEN=1;
    CSN=0;
    SpiWrite(0x22);        //写发送地址,后面跟4字节地址//
    SpiWrite(0xE7);
    SpiWrite(0xE7);
    SpiWrite(0xE7);
    SpiWrite(0xE7);
    CSN=1;
    Delay(2);
    CSN=0;
    SpiWrite(0x20);        //写发送数据命令,后面跟三字节数据//
    SpiWrite(0x01);
    SpiWrite(0x02);
    SpiWrite(0x03);
    CSN=1;
    Delay(5);
    TRX_CE=1;                    //使能发射模式//
    Delay(500);                    //等带发送完成//
    TRX_CE=0;
    while(!DR);
    


uchar temp;
void Wait_Rec_Packet(void)
{
    //TXEN=0;
    //TRX_CE=1;
    //PWR=1;
    //Delay(1000);
    //while(1)
    {// if (LCD==1)
        if(DR)
        { 
            TRX_CE=0;            //如果数据准备好,则进入待机模式,以便SPI口操作
            CSN=0;
            SpiWrite(0x24);
            RxPacket();
            CSN=1;
while(DR);
TRX_CE=1;
if((TxRxBuffer[0]==0x01)&&(TxRxBuffer[1]==0x02))   //&&(TxRxBuffer[2]==0x03))
{
TxRxBuffer[0]=0xff;
TxRxBuffer[1]=0xff;
success_flag=1;
if(TxRxBuffer[2]==0xa0)
{

red_led=~red_led;



}

else if(TxRxBuffer[2]==0xa1)
{

gre_led=~gre_led;

}
else if(TxRxBuffer[2]==0xa2)
{
led1=~led1;
}
else if(TxRxBuffer[2]==0xa3)
{
led2=~led2;
}
else if(TxRxBuffer[2]==0xa4)
{
led3=~led3;
}

Ini_System();
                                    
/*
    red_led=0;
    Delay(5000);
    Delay(5000);
    success_flag=0;
    red_led=1;
                             */

            
          //break;
        }
    }
}
////////////初始化配置寄存器////////////////
void Ini_System(void)
{
   // uchar i;
    
    CSN=1;
    SCK=0;
    PWR=1;
    TRX_CE=0;
    TXEN=0;
    Delay(2);
    CSN=0;

    SpiWrite( 0x00);        //配置命令//
    SpiWrite( 0x6C);        //CH_NO,配置频段在433.2MHZ
    SpiWrite( 0x0C);        //输出功率为10db,不重发,节电为正常模式
    SpiWrite( 0x44);        //地址宽度设置,为4字节
    SpiWrite( 0x03);SpiWrite( 0x03);    //接收发送有效数据长度为3字节
    SpiWrite( 0xE7);SpiWrite( 0xE7);SpiWrite( 0xE7);SpiWrite( 0xE7);    //接收地址
    SpiWrite( 0xDE); 


    /*for(i=0;i<11;i++){
        SpiWrite(RFConf);
    }*/
    CSN=1;
    PWR=1;
    TRX_CE=1;
    TXEN=0;
    Delay(1000);
}





        
void main(void)
{
   

Ini_System();
PWR=0;
//P0=0;
DR=1;
red_led=1;
gre_led=1;
led1  = 1;
led2  = 1;
led3  = 1;
success_flag=0;
    TRX_CE=0;
    Delay(1000);
    TXEN=0;
    TRX_CE=1;
    PWR=1;

 
Delay(5000);


 
TXEN=0;
    TRX_CE=1;
    PWR=1;
    Delay(1000);
    


    while(1)
    {   
         
Wait_Rec_Packet();        //等待接收完成 

if(success_flag)
        {
TXEN=0;
            TRX_CE=1;
            PWR=1;

Delay(5000);
Delay(5000);
success_flag=0;

     
 
     
            Delay(10000);



}




   
    }
}

//----------------- 20091113 START---------------


























回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-4-3 23:20:19 | 显示全部楼层
等待好心人出现.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2017-7-15
在线时间
58 小时
发表于 2018-12-26 16:12:09 | 显示全部楼层
我有STM32F103C8的,还是低功耗15uA,6年了,你还要吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 16:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表