原创 NRF24L01快速无线数传模块

2008-11-24 22:32 4293 4 3 分类: 通信

(YC)RF-24L01 开发指南<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


我们愿与您一起走向成功!


 


 


 


联系方式:


QQ:812573266    511590829


电话:15814740612


淘宝:http://shop35175587.taobao.com


MSNqh200608@hotmail.com


地址:深圳宝安区龙华


 


200788


 


 


 


 


 


一、模块介绍


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


YC-RF<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />24L01(PCB) (尺寸37mm X 18mm  板厚:1.6mm)



YC-RF24L01(外接天线) (尺寸30mm X 18mm  板厚:1.6mm)


(1) 2.4Ghz 全球开放ISM 频段免许可证使用


(2) 最高工作速率2Mbps,高效GFSK调制,抗干扰能力强,特别适合工业控制场合


(3) 126 频道,满足多点通信和跳频通信需要


(4) 内置硬件CRC 检错和点对多点通信地址控制


(5) 低功耗1.9 - 3.6V 工作,待机模式下状态为22uA;掉电模式下为900nA


(6) 内置2.4Ghz 天线,体积小巧 34mm X 17mm


(7) 模块可软件设地址,只有收到本机地址时才会输出数据(提供中断指示),可直接接各种单片机使用,软件编程非常方便


(8) 内置专门稳压电路,使用各种电源包括DC/DC 开关电源均有很好的通信效果


(9) 标准DIP间距接口,便于嵌入式应用


(10)工作于Enhanced ShockBurst 具有Automatic packet handling, Auto packet transaction handling,具有可选的内置包应答机制,极大的降低丢包率。


(11)          51系列单片机P0口连接时候,需要加10K的上拉电阻,与其余口连接不需要。


(12)          其他系列的单片机,如果是5V的,请参考该系列单片机IO口输出电流大小,如果超过10mA,需要串联电阻分压,否则容易烧毁模块! 如果是3.3V的,可以直接和RF2401模块的IO口线连接。比如AVR系列单片机如果是5V的,一般串接2K的电阻。


 


二、接口电路


 



 


 


 


 


说明:


(1)        VCC脚接电压范围为 1.9V~3.6V之间,不能在这个区间之外,超过3.6V将会烧毁模块。推荐电压3.3V左右。


(2)        除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需电平转换。当然对3V左右的单片机更加适用了。


(3)        硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO口模拟SPI不需要单片机真正的串口介入,只需要普通的单片机IO口就可以了,当然用串口也可以了。


(4)        9脚接地脚,需要和母板的逻辑地连接起来;2脚和9脚悬空。


(5)        排针间距为100mil,标准DIP插针,如果需要其他封装接口,比如密脚插针,或者其他形式的接口,可以联系我们定做。


 


 


 


三、模块结构和引脚说明


   YC-RF24L01模块使用Nordic公司的nRF24L01芯片开发而成。





 


 


四、工作方式


YC-RF24L01有工作模式有四种:


收发模式


配置模式


空闲模式


关机模式


工作模式由PWR_UP register PRIM_RX registerCE决定,详见下表。



4.1 收发模式


收发模式有Enhanced ShockBurstTM收发模式、 ShockBurstTM收发模式和直接收发模式三种,收发模式由器件配置字决定,具体配置将在器件配置部分详细介绍。


4.1.1 Enhanced  ShockBurstTM收发模式


Enhanced  ShockBurstTM收发模式下,使用片内的先入先出堆栈区,数据低速从微控制器送入,但高速(1Mbps)发射,这样可以尽量节能,因此,使用低速的微控制器也能得到很高的射频数据发射速率。与射频协议相关的所有高速信号处理都在片内进行,这种做法有三大好处:尽量节能;低的系统费用(低速微处理器也能进行高速射频发射);数据在空中停留时间短,抗干扰性高。Enhanced ShockBurstTM技术同时也减小了整个系统的平均工作电流。


Enhanced  ShockBurstTM收发模式下,YC-RF24L01自动处理字头和CRC校验码。在接收数据时,自动把字头和CRC校验码移去。在发送数据时,自动加上字头和CRC校验码,在发送模式下,置CE为高,至少10us,将时发送过程完成后。


4.1.1.1 Enhanced ShockBurstTM发射流程


A. 把接收机的地址和要发送的数据按时序送入YC-RF24L01


B. 配置CONFIG寄存器,使之进入发送模式。
C.
 微控制器把CE置高(至少10us),激发YC-RF24L01进行Enhanced ShockBurstTM发射;
D.
 YC-RF24L01Enhanced ShockBurstTM发射
   (1)
 给射频前端供电;
   (2)
射频数据打包(加字头、CRC校验码)
   (3)
 高速发射数据包;
   (4)
发射完成,
YC-RF24L01进入空闲状态。
4.1.1.2 Enhanced  ShockBurstTM接收流程
A.
 配置本机地址和要接收的数据包大小;
B.
 配置CONFIG寄存器,使之进入接收模式,把CE置高。


C. 130us后,YC-RF24L01进入监视状态,等待数据包的到来;
D.
 当接收到正确的数据包(正确的地址和CRC校验码)YC-RF24L01自动把字头、地址和CRC校验位移去;


E. YC-RF24L01通过把STATUS寄存器的RX_DR置位(STATUS一般引起微控制器中断)通知微控制器;
F.
 微控制器把数据从YC-RF24L01读出;
G.
 所有数据读取完毕后,可以清除STATUS寄存器YC-RF24L01可以进入四种主要的模式之一。


4.1.2  ShockBurstTM收发模式


ShockBurstTM收发模式可以与Nrf2401a,02,E1E2兼容,具体表述前看本公司的YC-RF2401文档。


4.2 空闲模式


YC-RF24L01的空闲模式是为了减小平均工作电流而设计,其最大的优点是,实现节能的同时,缩短芯片的起动时间。在空闲模式下,部分片内晶振仍在工作,此时的工作电流跟外部晶振的频率有关。


4.4 关机模式


在关机模式下,为了得到最小的工作电流,一般此时的工作电流为900nA左右。关机模式下,配置字的内容也会被保持在YC-RF24L01片内,这是该模式与断电状态最大的区别。


 


五、配置YC-RF24L01模块


YC-RF24L01的所有配置工作都是通过SPI完成,共有30字节的配置字。


我们推荐YC-RF24L01工作于Enhanced  ShockBurstTM 收发模式,这种工作模式下,系统的程序编制会更加简单,并且稳定性也会更高,因此,下文着重介绍把YC-RF24L01配置为Enhanced  ShockBurstTM收发模式的器件配置方法。


ShockBurstTM的配置字使YC-RF24L01能够处理射频协议,在配置完成后,在YC-RF24L01工作的过程中,只需改变其最低一个字节中的内容,以实现接收模式和发送模式之间切换。


ShockBurstTM的配置字可以分为以下四个部分:


数据宽度:声明射频数据包中数据占用的位数。这使得YC-RF24L01能够区分接收数据包中的数据和CRC校验码;


地址宽度:声明射频数据包中地址占用的位数。这使得YC-RF24L01能够区分地址和数据;


地址:接收数据的地址,有通道0到通道5的地址;


CRC:使YC-RF24L01能够生成CRC校验码和解码。


当使用YC-RF24L01片内的CRC技术时,要确保在配置字(CONFIGEN_CRC)CRC校验被使能,并且发送和接收使用相同的协议。    


YC-RF24L01配置字的CONFIG寄存器的位描述如下表所示。
                      YC-RF24L01 CONFIG配置字描述




六、参考源代码


参考源代码


/*


Email:     qh200608


官方网址:http://shop35175587.taobao.com


*/


 


#include <reg51.h>


 


//<nRF2401_Pins 对应引脚>


sbit        MISO     =P1^3;


sbit        MOSI     =P1^4;


sbit  SCK     =P1^5;


sbit  CE       =P1^6;


sbit  CSN              =P3^7;


sbit  IRQ        =P1^2;


 


sbit    LED2    =P3^5;


sbit    LED1    =P3^4;


sbit    KEY1    =P3^0;


sbit    KEY2    =P3^1;


 


 


// SPI(nRF24L01) commands


#define READ_REG         0x00  // Define read command to register


#define WRITE_REG        0x20  // Define write command to register


#define RD_RX_PLOAD     0x61  // Define RX payload register address


#define WR_TX_PLOAD     0xA0  // DefineTX payload register address


#define FLUSH_TX         0xE1  // Define flush TX register command


#define FLUSH_RX         0xE2  // Define flush RX register command


#define REUSE_TX_PL      0xE3  // Define reuse TX payload register command


#define NOP               0xFF  // Define No Operation, might be used to read status register


 


 


 


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


// SPI(nRF24L01) registers(addresses)


#define CONFIG           0x00  // 'Config' register address


#define EN_AA            0x01  // 'Enable Auto Acknowledgment' register address


#define EN_RXADDR      0x02  // 'Enabled RX addresses' register address


#define SETUP_AW        0x03  // 'Setup address width' register address


#define SETUP_RETR      0x04  // 'Setup Auto. Retrans' register address


#define RF_CH            0x05  // 'RF channel' register address


#define RF_SETUP         0x06  // 'RF setup' register address


#define STATUS           0x07  // 'Status' register address


#define OBSERVE_TX      0x08  // 'ObserveTX' register address


#define CD                0x09  // 'Carrier Detect' register address


#define RX_ADDR_P0      0x0A  // 'RX address pipe0' register address


#define RX_ADDR_P1      0x0B  // 'RX address pipe1' register address


#define RX_ADDR_P2      0x0C  // 'RX address pipe2' register address


#define RX_ADDR_P3      0x0D  // 'RX address pipe3' register address


#define RX_ADDR_P4      0x0E  // 'RX address pipe4' register address


#define RX_ADDR_P5      0x0F  // 'RX address pipe5' register address


#define TX_ADDR         0x10  // 'TX address' register address


#define RX_PW_P0        0x11  // 'RX payload width, pipe0' register address


#define RX_PW_P1        0x12  // 'RX payload width, pipe1' register address


#define RX_PW_P2        0x13  // 'RX payload width, pipe2' register address


#define RX_PW_P3        0x14  // 'RX payload width, pipe3' register address


#define RX_PW_P4        0x15  // 'RX payload width, pipe4' register address


#define RX_PW_P5        0x16  // 'RX payload width, pipe5' register address


#define FIFO_STATUS 0x17  // 'FIFO Status Register' register address //------------------------------------------------------------


 


// 写一个字节到24L01,同时读出一个字节


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


}


 


//  向寄存器reg写一个字节,同时返回状态字节


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


}


 


// 读出bytes字节的数据


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);    //


      


       CSN = 1;                          


      


       return(status);                    // return nRF24L01 status byte


}


 


// 写入bytes字节的数据


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


{


       uchar status,byte_ctr;


      


       CSN = 0;                  


       status = SPI_RW(reg);  


       for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) //


              SPI_RW(*pBuf++);


       CSN = 1;                 // Set CSN high again


       return(status);          //


}


 


// 接收函数,返回1表示有数据收到,否则没有数据接受到


unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)


{


    unsigned char revale="0";


    // set in RX mode


       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


    dalay130us();


       sta=SPI_Read(STATUS);      // read register STATUS's value


       if(RX_DR)                          // if receive data ready (RX_DR) interrupt


       {


           CE = 0;   // stand by mode


              SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer


              revale =1;


       }


       SPI_RW_Reg(WRITE_REG+STATUS,sta);// clear RX_DR or TX_DS or MAX_RT interrupt flag


      


       return revale;


}


 


// 发送函数


void nRF24L01_TxPacket(unsigned char * tx_buf)


{


       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 + CONFIG, 0x0e);     // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled..


       CE=1;


       dalay10us();


    CE=0;


}


 


 


 


// 配置函数


void nRF24L01_Config(void)


{


       //initial io


       CE=0;   // chip enable


      CSN=1;   // Spi disable


      SCK=0;   // Spi clock line init high


    CE=0;


    SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);     // Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. RX_DR enabled..


       SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);    


       SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0


       SPI_RW_Reg(WRITE_REG + SETUP_AW, 0x02);    // Setup address width="5" bytes


       SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);  // 500us + 86us, 10 retrans...


       SPI_RW_Reg(WRITE_REG + RF_CH, 0);       


       SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR


       SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);       CE=1;  //


 }


补充:完整的代码请和我联系!


 


 


 


七、联系方式


网站: http://shop35175587.taobao.com


手机:15814740612


Email:qh200608@126.com


MSN: qh200608@hotmail.com   QQ: 812573266


淘宝:gqh200608             旺旺:qh200608


地址:深圳市宝安区龙华镇


 

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条