|
NRF24L01是一款工作在2.4-2.5GHz世界通用ISM頻段的單片收發(fā)芯片,無線收發(fā)器包括:頻率發(fā)生器 增強(qiáng)型 SchockBurstTM 模式控制器 功率放大器 晶體放大器 調(diào)制器 解調(diào)器 輸出功率頻道選擇和協(xié)議的設(shè)置可以通過SPI接口進(jìn)行設(shè)置極低的電流消耗,當(dāng)工作在發(fā)射模式下發(fā)射功率為6dBm時(shí)電流消耗為9.0mA 接受模式為12.3mA掉電模式和待機(jī)模式下電流消耗模式更低。
球開放ISM 頻段,最大0dBm 發(fā)射功率,免許可證使用?諘100米!支持六路通道的數(shù)據(jù)接收
特性如下:
1.低工作電壓:1.9~3.6V低電壓工作
2.高速率:2Mbps,由于空中傳輸時(shí)間很短,極大的降低了無線傳輸中的碰撞現(xiàn)象(軟件設(shè)置1Mbps或者2Mbps的空中傳輸速率)
3.多頻點(diǎn):125 頻點(diǎn),滿足多點(diǎn)通信和跳頻通信需要
4.超小型:內(nèi)置2.4GHz天線,體積小巧,15x29mm(包括天線)
5.低功耗:當(dāng)工作在應(yīng)答模式通信時(shí),快速的空中傳輸及啟動(dòng)時(shí)間,極大的降低了電流消耗。
6.低應(yīng)用成本:NRF24L01集成了所有與RF協(xié)議相關(guān)的高速信號(hào)處理部分,比如:自動(dòng)重發(fā)丟失數(shù)據(jù)包和自動(dòng)產(chǎn)生應(yīng)答信號(hào)等,NRF24L01的SPI接口可以利用單片機(jī)的硬件SPI口連接或用單片機(jī)I/O口進(jìn)行模擬,內(nèi)部有FIFO可以與各種高低速微處理器接口,便于使用低成本單片機(jī)。
7.便于開發(fā):由于鏈路層完全集成在模塊上,非常便于開發(fā)。自動(dòng)重發(fā)功能,自動(dòng)檢測(cè)和重發(fā)丟失的數(shù)據(jù)包,重發(fā)時(shí)間及重發(fā)次數(shù)可軟件控制自動(dòng)存儲(chǔ)未收到應(yīng)答信號(hào)的數(shù)據(jù)包自動(dòng)應(yīng)答功能,在收到有效數(shù)據(jù)后,模塊自動(dòng)發(fā)送應(yīng)答信號(hào),無須另行編程載波檢測(cè)—固定頻率檢測(cè)內(nèi)置硬件CRC 檢錯(cuò)和點(diǎn)對(duì)多點(diǎn)通信地址控制數(shù)據(jù)包傳輸錯(cuò)誤計(jì)數(shù)器及載波檢測(cè)功能可用于跳頻設(shè)置可同時(shí)設(shè)置六路接收通道地址,可有選擇性的打開接收通道標(biāo)準(zhǔn)插針Dip2.54MM間距接口,便于嵌入式應(yīng)用
0.png (21.11 KB, 下載次數(shù): 67)
下載附件
2016-6-6 10:16 上傳
0.png (229.93 KB, 下載次數(shù): 74)
下載附件
2016-6-6 10:17 上傳
原代碼:
- /****************************************/
- /* nRF24L01_SPI通信程序
- 連線方式:
- IOB0---》CE (7腳)
- IOB1---》CSN (6腳)
- IOB2---》SCK (5腳)
- IOB3---》MOSI (4腳)
- IOB4---》MISO (3腳)
- IOB5---》IRQ (2腳)
- */
- /****************************************/
- #include "SPCE061V004.H"
- //#include "LCD.h"
- #define MISO *P_IOB_Data
- #define uchar unsigned char
- #define MOSI_High *P_IOB_Data|=0x0008
- #define MOSI_Low *P_IOB_Data&=0xfff7
- #define SCK_High *P_IOB_Data|=0x0004
- #define SCK_Low *P_IOB_Data&=0xfffb
- #define CE_High *P_IOB_Data|=0x0001
- #define CE_Low *P_IOB_Data&=0xfffe
- #define CSN_High *P_IOB_Data|=0x0002
- #define CSN_Low *P_IOB_Data&=0xfffd
- #define TX_ADR_WIDTH 5 // 5 bytes TX(RX) address width
- #define TX_PLOAD_WIDTH 20 // 20 bytes TX payload
- #define RX_DS sta&0x40 // RX_DR=sta^6;
- #define TX_DS sta&0x20 // TX_DS =sta^5;
- #define MAX_RT sta&0x10 // MAX_RT =sta^4;
- // 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 // Define TX 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 // 'Observe TX' 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
- unsigned char Buffer[5]={"0","3","4","5","8"};
- unsigned char const TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // Define a static TX address
- unsigned char SPI_ReceiveData;
- unsigned char RX[16];
- unsigned char Tx_Buffer[5]={"abc"};
- void Initial_IOB() //初始化IOB端口
- {
- *P_IOB_Dir=0xffcf; //set IRQ,MISO input ,the other output
- *P_IOB_Attrib=0xffcf;
- *P_IOB_Data=0x0000;
-
- }
- void delay1us(unsigned char t)
- {
- while(--t)
- *P_Watchdog_Clear=1;
- }
- unsigned char SPI_RW(unsigned char byte) //寫一個(gè)字節(jié)到24L01,同時(shí)讀一個(gè)字節(jié)
- {
- unsigned char bit_ctr;
-
- for(bit_ctr=0;bit_ctr<8;bit_ctr++) //output 8-bit
- {
- if(byte&0x80)
- MOSI_High;
- else
- MOSI_Low;
- byte=(byte<<1);
- SCK_High;
- if(MISO&0x0010) byte |= 1; //SPI_ReceiveData=MISO;
- SCK_Low;
-
- // SPI_ReceiveData =( SPI_ReceiveData<<1);
- }
- return(byte); //return read byte
- }
- unsigned char SPI_Read(unsigned char reg)
- {
- unsigned char reg_val;
- CSN_Low; // CSN low, initialize SPI communication...
- SPI_RW(reg); // Select register to read from..
- reg_val = SPI_RW(0); // ..then read registervalue
- CSN_High; // CSN high, terminate SPI communication
- return(reg_val); // return register value
- }
- /****向寄存器reg寫一個(gè)字節(jié),同時(shí)返回狀態(tài)字節(jié)**************/
- unsigned char SPI_RW_Reg(unsigned char reg,unsigned char value)
- {
- unsigned char status;
- CSN_Low;
- status=SPI_RW(reg); //select register and write value to it
- SPI_RW(value);
- CSN_High;
- return(status);
- }
- /********讀出bytes字節(jié)的數(shù)據(jù)*************************/
- unsigned char SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes)
- {
- uchar status,byte_ctr;
- CSN_Low;
- status=SPI_RW(reg);
- for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
- pBuf[byte_ctr]=SPI_RW(0);
- CSN_High;
- return(status);
- }
- /****************寫入bytes字節(jié)的數(shù)據(jù)*******************/
- unsigned char SPI_Write_Buf(uchar reg,uchar *pBuf,uchar bytes)
- {
- uchar status,byte_ctr;
- CSN_Low;
- delay1us(1);
- status=SPI_RW(reg);
- for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
- SPI_RW(*pBuf++);
- CSN_High;
- delay1us(1);
- return(status);
- }
- /*接收函數(shù),返回1表示有數(shù)據(jù)收到,否則沒有數(shù)據(jù)接收到**/
- unsigned char nRF24L01_RxPacket(unsigned char *rx_buf)
- {
- unsigned char sta,revale=0;
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
- CE_High;
- delay1us(10);
-
- sta=SPI_Read(STATUS); // read register STATUS's value
- if(RX_DS) // if receive data ready (RX_DR) interrupt
- {
- CE_Low; // stand by mode
- SPI_Read_Buf(RD_RX_PLOAD,rx_buf,WR_TX_PLOAD); // 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;
-
- }
- /****************發(fā)送函數(shù)***************************/
- void nRF24L01_TxPacket(unsigned char *tx_buf)
- {
- CE_Low; // CE=0;
- SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // WritesTX_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_High; //CE=1;
- delay1us(10);
- CE_Low; //CE=0;
- }
- void RX_Mode(void)
- {
- CE_Low; //CE=0;
- delay1us(1);
- 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, Buffer, TX_PLOAD_WIDTH); // Writes data to TX payload
- 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, 40); // Select RF channel 40
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:2Mbps, 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_High; //CE = 1 Set CE pin high to enable RX device
- delay1us(1);
- // This device is now ready to receive one packet of 16 bytes payload from a TX device sending to address
- // '3443101001', with auto acknowledgment, retransmit count of 10, RF channel 40 and datarate = 2Mbps.
- }
- void TX_Mode(void)
- {
- CE_Low; //CE=0;
- delay1us(1);
- 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_Buffer, TX_PLOAD_WIDTH); // Writes data to TX payload
- 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, 40); // Select RF channel 40
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:2Mbps, 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_High; // CE=1;
- delay1us(1);
- }
- void nRF24L01_Initial(void)
- {
- CE_Low; //nRF24L01_CE=0; chip enable
- CSN_High; //nRF24L01_CSN=1; Spi disable
- SCK_Low; //nRF24L01_SCK=0; Spi clock line init high
-
-
- }
- /****************** 配置函數(shù)********************************/
- void nRF24L01_Config(void)
- {
- //initial io
- CE_Low; // CE=0 ;chip enable
- CSN_High; //CSN=1 Spi disable
- SCK_Low; //SCK=0 // Spi clock line init high
- CE_Low; //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,0x0f); // TX_PWR:0dBm, Datarate:2Mbps,
- }
- main()
- {
- int a;
- Initial_IOB();
- nRF24L01_Initial();
- TX_Mode();
- // RX_Mode();
- while(1)
- {
-
- //自己添加要發(fā)送的內(nèi)容到數(shù)組里
-
- /// nRF24L01_TxPacket(*****)
- delay1us(100);
- *P_Watchdog_Clear=1;
- }
- }
復(fù)制代碼
0.png (53.19 KB, 下載次數(shù): 77)
下載附件
2016-6-6 10:19 上傳
全部資料(壓縮包)下載:
|
-
-
NRF24L01原理圖.rar
2016-6-6 10:28 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
2.74 KB, 下載次數(shù): 9, 下載積分: 黑幣 -5
-
-
參考設(shè)計(jì)例程.zip
2016-6-6 10:29 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
1.57 MB, 下載次數(shù): 9, 下載積分: 黑幣 -5
-
-
相關(guān)參考設(shè)計(jì)文檔.zip
2016-6-6 10:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
7.03 MB, 下載次數(shù): 8, 下載積分: 黑幣 -5
|