1 #ifndef __NRF24L01_H__2 #define __NRF24L01_H__3 #include4 #define uchar unsigned char5 #define uint unsigned int6 7 sbit CE =P1^0;8 sbit CSN =P1^1;9 sbit SCK =P1^2;10 sbit MOSI =P1^3;11 sbit MISO =P1^4;12 sbit IRQ =P1^5;13 14 //uchar TxBuf[20]={"1234567890abcdefghij"};15 #define TX_ADR_WIDTH 5 // 5 uints TX address width16 #define RX_ADR_WIDTH 5 // 5 uints RX address width17 #define TX_PLOAD_WIDTH 32 // 32 uints TX payload18 #define RX_PLOAD_WIDTH 32 // 32 uints TX payload19 uchar TX_ADDRESS[TX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7}; //本地地址20 uchar RX_ADDRESS[RX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7}; //接收地址21 ///***************************************NRF24L01寄存器指令*******************************************************22 #define READ_REG 0x00 // 讀寄存器指令23 #define WRITE_REG 0x20 // 寫寄存器指令24 #define RD_RX_PLOAD 0x61 // 讀取接收數(shù)據(jù)指令25 #define WR_TX_PLOAD 0xA0 // 寫待發(fā)數(shù)據(jù)指令26 #define FLUSH_TX 0xE1 // 沖洗發(fā)送 FIFO指令27 #define FLUSH_RX 0xE2 // 沖洗接收 FIFO指令28 #define REUSE_TX_PL 0xE3 // 定義重復(fù)裝載數(shù)據(jù)指令29 #define NOP 0xFF // 保留30 ///*************************************SPI(nRF24L01)寄存器地址****************************************************31 #define CONFIG 0x00 // 配置收發(fā)狀態(tài),CRC校驗(yàn)?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式32 #define EN_AA 0x01 // 自動應(yīng)答功能設(shè)置33 #define EN_RXADDR 0x02 // 可用信道設(shè)置34 #define SETUP_AW 0x03 // 收發(fā)地址寬度設(shè)置35 #define SETUP_RETR 0x04 // 自動重發(fā)功能設(shè)置36 #define RF_CH 0x05 // 工作頻率設(shè)置37 #define RF_SETUP 0x06 // 發(fā)射速率、功耗功能設(shè)置38 #define NRFRegSTATUS 0x07 // 狀態(tài)寄存器39 #define OBSERVE_TX 0x08 // 發(fā)送監(jiān)測功能40 #define CD 0x09 // 地址檢測 41 #define RX_ADDR_P0 0x0A // 頻道0接收數(shù)據(jù)地址42 #define RX_ADDR_P1 0x0B // 頻道1接收數(shù)據(jù)地址43 #define RX_ADDR_P2 0x0C // 頻道2接收數(shù)據(jù)地址44 #define RX_ADDR_P3 0x0D // 頻道3接收數(shù)據(jù)地址45 #define RX_ADDR_P4 0x0E // 頻道4接收數(shù)據(jù)地址46 #define RX_ADDR_P5 0x0F // 頻道5接收數(shù)據(jù)地址47 #define TX_ADDR 0x10 // 發(fā)送地址寄存器48 #define RX_PW_P0 0x11 // 接收頻道0接收數(shù)據(jù)長度49 #define RX_PW_P1 0x12 // 接收頻道1接收數(shù)據(jù)長度50 #define RX_PW_P2 0x13 // 接收頻道2接收數(shù)據(jù)長度51 #define RX_PW_P3 0x14 // 接收頻道3接收數(shù)據(jù)長度52 #define RX_PW_P4 0x15 // 接收頻道4接收數(shù)據(jù)長度53 #define RX_PW_P5 0x16 // 接收頻道5接收數(shù)據(jù)長度54 #define FIFO_STATUS 0x17 // FIFO棧入棧出狀態(tài)寄存器設(shè)置55 ///*****************************子函數(shù)集*********************************************************56 uchar NRF24SPI_Send_Byte(uchar dat);57 uchar SPI_WR_Reg(uchar reg, uchar value);58 uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len);59 uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len);60 uchar nRF24L01_RxPacket(unsigned char* rx_buf);61 void nRF24L01_TxPacket(unsigned char * tx_buf);62 uchar SPI_RD_Reg(uchar reg);63 void init_NRF24L01(void);64 void TX_Mode(void);65 void RX_Mode(void);66 void NRF_Send(void);67 uchar NRF24L01_Check(void);68 ///*************************************************************************************69 uchar NRF24SPI_Send_Byte(uchar dat)70 {71 uchar i;72 for (i = 0; i < 8; i++) // output 8-bit73 {74 //發(fā)送1位數(shù)據(jù)75 if (dat & 0x80) // output uchar, MSB to MOSI76 {77 MOSI = 1;78 }79 else80 {81 MOSI = 0;82 }83 84 dat <<= 1; // shift next bit into MSB..85 86 //讀取1位數(shù)據(jù)87 SCK = 1; // Set SCK high..88 89 if (MISO)90 {91 dat = 1;92 } // capture current MISO bit93 else94 {95 dat &= 0xFE;96 }97 SCK = 0; // ..then set SCK low again98 }99 100 return(dat); // return read uchar101 }102 103 void Delay_n10us(uint n) //延時n個10us104 {105 for(;n>0;n--)106 {107 unsigned char a,b;108 for(b=1;b>0;b--)109 for(a=2;a>0;a--);110 }}112 ///****************************************************************************************113 ///*NRF24L01檢測是否存在114 ///***************************************************************************************/115 uchar NRF24L01_Check(void)116 {117 uchar bu[5]={0XA5,0XA5,0XA5,0XA5,0XA5};118 uchar bu1[5];119 uchar i; 120 SPI_Write_Buf(WRITE_REG+TX_ADDR,bu,5);//寫入5個字節(jié)的地址. 121 SPI_Read_Buf(TX_ADDR,bu1,5); //讀出寫入的地址 122 for(i=0;i<5;i++)if(bu1[i]!=0XA5)break; 123 if(i!=5)return 1; //NRF24L01不在位 124 return 0; //NRF24L01在位125 } 126 ///****************************************************************************************127 ///*NRF24L01初始化128 ///***************************************************************************************/129 void init_NRF24L01(void)130 {131 uchar buf[5]={0};132 Delay_n10us(10);133 CE = 0; // chip enable134 CSN= 0; // Spi disable 135 136 SPI_Read_Buf(TX_ADDR, buf, TX_ADR_WIDTH);//debug 測試原來的本地地址:復(fù)位值是:0xE7 0xE7 0xE7 0xE7 0xE7137 138 // SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 寫本地地址 139 // SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址140 141 // 142 // SPI_WR_Reg(WRITE_REG + EN_AA, 0x01); // 頻道0自動 ACK應(yīng)答允許 143 // SPI_WR_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允許接收地址只有頻道0,如果需要多頻道可以參考Page21 144 // SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 設(shè)置自動重發(fā)時間和次數(shù):500us + 86us, 10 retrans...145 // SPI_WR_Reg(WRITE_REG + RF_CH, 22); // 設(shè)置信道工作為2.4GHZ,收發(fā)必須一致146 // SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設(shè)置接收數(shù)據(jù)長度,本次設(shè)置為32字節(jié)147 // SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x07); //設(shè)置發(fā)射速率為1MHZ,發(fā)射功率為最大值0dB148 // 149 // SPI_RD_Reg(WRITE_REG + EN_AA);150 // SPI_RD_Reg(WRITE_REG + EN_RXADDR);151 // SPI_RD_Reg(WRITE_REG + RF_CH);152 // SPI_RD_Reg(WRITE_REG + RX_PW_P0);153 // SPI_RD_Reg(WRITE_REG + RF_SETUP);154 }155 ///****************************************************************************************************156 ///*函數(shù):uchar SPI_Read(uchar reg)157 ///*功能:NRF24L01的SPI時序158 ///****************************************************************************************************/159 uchar SPI_RD_Reg(uchar reg)160 {161 uchar reg_val;162 163 CSN = 0; // CSN low, initialize SPI communication...164 NRF24SPI_Send_Byte(reg); // Select register to read from..165 reg_val = NRF24SPI_Send_Byte(0); // ..then read registervalue166 CSN = 1; // CSN high, terminate SPI communication167 168 return(reg_val); // return register value169 }170 //****************************************************************************************************/171 //*功能:NRF24L01讀寫寄存器函數(shù)172 //****************************************************************************************************/173 uchar SPI_WR_Reg(uchar reg, uchar value)174 {175 uchar status;176 177 CSN = 0; // CSN low, init SPI transaction178 status = NRF24SPI_Send_Byte(reg);// select register179 NRF24SPI_Send_Byte(value); // ..and write value to it..180 CSN = 1; // CSN high again181 182 return(status); // return nRF24L01 status uchar183 }184 ///****************************************************************************************************/185 //*函數(shù):uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len)186 //*功能: 用于讀數(shù)據(jù),reg:為寄存器地址,pBuf:為待讀出數(shù)據(jù)地址,uchars:讀出數(shù)據(jù)的個數(shù)187 //****************************************************************************************************/188 uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len)189 {190 uint status,i;191 192 CSN = 0; // Set CSN low, init SPI tranaction193 status = NRF24SPI_Send_Byte(reg); // Select register to write to and read status uchar194 195 for(i=0;i
評論