首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > Wireless >

NRF24L01无线模块发射程序解决方法

2013-01-04 
NRF24L01无线模块发射程序最近从网上下了一NRF24L01无线模块发射程序,改了一下,准备用AT89S51单片机控制,

NRF24L01无线模块发射程序
最近从网上下了一NRF24L01无线模块发射程序,改了一下,准备用AT89S51单片机控制,但是运行之后没有反应(不知道模块是否正常运行)。麻烦大家给看一下问题出在哪,程序如下:
#include <reg51.h>
#include <intrins.h>
#include "api.h"

/***************************************************/
#define uchar unsigned char
#define TX_ADR_WIDTH    5   // 5 bytes TX(RX) address width
#define TX_PLOAD_WIDTH  1  // 1 bytes TX payload

uchar const TX_ADDRESS[TX_ADR_WIDTH]  = {0x34,0x43,0x10,0x10,0x01}; // Define a static TX address

uchar rx_buf[TX_PLOAD_WIDTH];
uchar tx_buf[TX_PLOAD_WIDTH];
uchar flag;
/**************************************************/
sbit CE =  P1^2;
sbit CSN=  P1^3;
sbit SCK=  P1^4;
sbit MOSI= P1^5;
sbit MISO= P1^6;
sbit IRQ = P3^2;
/**************************************************/
uchar bdata sta;
sbitRX_DR=sta^6;
sbitTX_DS=sta^5;
sbitMAX_RT=sta^4;
/**************************************************/

/**************************************************/
#define KEY 0xaa
sbit p20=P2^0;
void init_io(void)
{
p20=0;                 //enable led
CE=0;// chip enable
CSN=1;// Spi disable
SCK=0;// Spi clock line init high
P0=0xff;// led close
}
/**************************************************/


/**************************************************
Function: init_int0();

Description:
  enable int0 interrupt;
/**************************************************/
void init_int0(void)
{
EA=1;
EX0=1;// Enable int0 interrupt.
}
/**************************************************/

/**************************************************/
void delay_10us(uchar x )
{
uchar i,j;
for(i=0;i<x;i++)
{
j=5;
while(j--);
}
}

/**************************************************/

/**************************************************/
void delay_ms(unsigned int x)
{
    unsigned int i,j;
    i=0;
    for(i=0;i<x;i++)
    {
       j=231;
           ;
       while(j--);
    }
}
/**************************************************/


/**************************************************/
uchar SPI_RW(uchar byte)
{
uchar bit_ctr;
   for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit
   {
   MOSI = (byte & 0x80);         // output 'byte', MSB to MOSI
   byte = (byte << 1);           // shift next bit into MSB..
   SCK = 1;                      // Set SCK high..
   byte |= MISO;         // capture current MISO bit


   SCK = 0;              // ..then set SCK low again
   }
           return(byte);             // return read byte
}
/**************************************************/

/**************************************************/
uchar SPI_RW_Reg(BYTE reg, BYTE value)
{
uchar status;

  CSN = 0;                   // CSN low, init SPI transaction
  status = SPI_RW(reg);      // select register
  SPI_RW(value);             // ..and write value to it..
  CSN = 1;                   // CSN high again

  return(status);            // return nRF24L01 status byte
}
/**************************************************/

/**************************************************/
BYTE SPI_Read(BYTE reg)
{
BYTE reg_val;

  CSN = 0;                // CSN low, initialize SPI communication...
  SPI_RW(reg);            // Select register to read from..
  reg_val = SPI_RW(0);    // ..then read registervalue
  CSN = 1;                // CSN high, terminate SPI communication

  return(reg_val);        // return register value
}
/**************************************************/

/**************************************************/
uchar SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)
{
uchar status,byte_ctr;

  CSN = 0;                    // Set CSN low, init SPI tranaction
  status = SPI_RW(reg);       // Select register to write to and read status byte

  for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
    pBuf[byte_ctr] = SPI_RW(0);    // Perform SPI_RW to read byte from nRF24L01

  CSN = 1;                           // Set CSN high again

  return(status);                    // return nRF24L01 status byte
}
/**************************************************/

/**************************************************/
uchar SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes)


{
uchar status,byte_ctr;

  CSN = 0;                   // Set CSN low, init SPI tranaction
  status = SPI_RW(reg);    // Select register to write to and read status byte
  for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // then write all byte in buffer(*pBuf)
    SPI_RW(*pBuf++);
  CSN = 1;                 // Set CSN high again
  return(status);          // return nRF24L01 status byte
}
/**************************************************/


/**************************************************/
void RX_Mode(void)
{
     CE=0;
     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  
                                       // Use the same address on the RX device as the TX device
     SPI_RW_Reg(WRITE_REG + SETUP_AW, 0x03);
     SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0
     SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0
     SPI_RW_Reg(WRITE_REG + RF_CH, 0x40);        // Select RF channel 40
     SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Select same RX payload width as TX Payload width
     SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR
     SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);   // Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. RX_DR enabled..

     CE = 1; // Set CE pin high to enable RX device

  }
/**************************************************/

/**************************************************/
void TX_Mode(void)
{
     CE=0;

     SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // Writes TX_Address to nRF24L01
     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
     SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // Writes data to TX payload

     SPI_RW_Reg(WRITE_REG + SETUP_AW, 0x03);
     SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0
     SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0


     SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...
     SPI_RW_Reg(WRITE_REG + RF_CH, 0x40);        // Select RF channel 40
     SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR
     SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); 
                           // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled..
     CE=1;

}
/**************************************************/

/**************************************************/
void check_ACK()
{
sta=SPI_Read(STATUS);// read register STATUS's
if(TX_DS)// TX_DS =1
{
   SPI_RW_Reg(WRITE_REG+STATUS,SPI_Read(READ_REG+STATUS));// clear interrupt flag(TX_DS)
}
}
/**************************************************/

/**************************************************/
void CheckButtons()
{

tx_buf[TX_PLOAD_WIDTH]=KEY;
TX_Mode();// set TX Mode and transmitting
            delay_10us(10);
            check_ACK();

P0=0x00;// Turn on the led
           delay_ms(500);
P0=0xff;

}

/**************************************************/

/**************************************************/
void main(void)
{
init_io();// Initialize IO port
init_int0();// enable int0 interrupt
 RX_Mode();// set RX mode
while(1)
{
CheckButtons(); // scan key value and transmit 

}
}
/**************************************************/

/**************************************************/
void int0(void) interrupt 0
{
       sta=SPI_Read(STATUS);// read register STATUS's value
       if(RX_DR)// if receive data ready (RX_DR) interrupt
       {
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
flag=1;
        }
if(MAX_RT)
{
SPI_RW_Reg(FLUSH_TX,0);
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);// clear RX_DR or TX_DS or MAX_RT interrupt flag
}
/**************************************************/
[解决办法]
sbit MISO= P1^6;
byte 
[解决办法]
= MISO; // capture current MISO bit
你应该先MISO>>6移位再赋给byte吧,要不然byte字节肯定都是错的

[解决办法]
这个程序我也阅读了,但还没测试,期待LZ成功后分享一下经验
[解决办法]
我现在也在调试NRF24L01,用的是AT89C51,遇到了同样的问题,不知道楼主调试成功没,发一份到我的邮箱605714371@qq.com,谢谢


[解决办法]
MAK,看下。
[解决办法]
我也是下载的这个程序,可以用的,你没有用成功的话,多半是你自己的代码的问题,而不是给的代码的问题

要注意MISO 是单片机的输入口,数据从nRF24L01流向单片机
而MOSI则相反
[解决办法]
发送没有问题,但是接收端每复位一次只能接收一个字节,然后就接收不到了,必须再次复位接收端的单片机,发射端不用复位。
[解决办法]
楼主,我也在调51单片机应用NRF24L01模块,发射应该没有问题,可是就是不能接收,可后面可能是电路问题,那几块NRF24L01模块都不能用了,不知道楼主调通没,发份程序给我,(jincheng_lin@yahoo.cn)顺便讲一下电路怎么连接的,谢谢
[解决办法]
我也很期待有份正确的程序出来啊
[解决办法]
我现在载波检测也能检测得到,但是接收一直收不到,期待楼主实现功能
[解决办法]
原来的程序里好像是有这段的
Description:
  set uart working mode 
/**************************************************/
void Inituart(void)
{
TMOD = 0x20;//timer1 working mode 1
TL1 = 0xfd;//f7=9600 for 16mhz Fosc,and ... 
TH1 = 0xfd;//...fd=19200 for 11.0592mhz Fosc
SCON = 0xd8;//uart mode 3,ren==1
PCON = 0x80;//smod=0
TR1 = 1;//start timer1
}
/**************************************************/
要是我用的是12MHz的晶振,是不是只要把TL1 = 0xfc; TH1 = 0xfc;  就可以了?

热点排行