#include "nRF24L01_API.h" static uchar TX_ADDRESS[TX_ADR_WIDTH] = {0x00, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}; //发送地址 static uchar RX_ADDRESS[RX_ADR_WIDTH] = {0x00, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}; //接收地址 /* 00 配置寄存器 [7] [6]可屏蔽中断 RX_RD [5]可屏蔽中断 TX_DS [4]可屏蔽中断 MAX_RT [3]CRC 使能 [2]CRC 模式 [1]1:上电0:掉电 [0]1:接收模式0:发射模式 01 使能“自动应答”功能 [7:6] [5:0]数据通道 5 ~0自动应答允许 02 接收地址允许 [7:6] [5:0]接收数据通道 5 ~0允许 03 设置地址宽度(所有数据通道) [7:2] [1:0]0.无效 1.3byte 2.4byte 3.5byte 宽度 04 建立自动重发 [7:4]自动重发延时:'0000'-等待 250+86us '1111'-等待 4000+86us [3:0]自动重发计数:'0000'-禁止自动重发 '1111'-自动重发 15 次 05 射频通道 [7] [6:0]设置 nRF24L01 工作通道频率 06 射频寄存器 ..... ..... */ #if 1 void delay_us ( uchar num ) { uchar i; for ( i = 0; i < num; i++ ) { #ifdef N76E003_IAR asm ( "nop" ); #else nop; #endif } } #else #define delay_us(us) Timer3_Delay10us(us/10+1) #endif /***************************************************************/ /*******************************************************************/ //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz) #if 0 uchar SPI_RW ( uchar byte ) { uchar bit_ctr; for ( bit_ctr = 0; bit_ctr < 8; bit_ctr++ ) // 输出8位 { NRF_MOSI = ( byte & 0x80 ); // MSB TO MOSI byte = ( byte << 1 ); // shift next bit to MSB NRF_SCK = 1; byte |= NRF_MISO; // capture current MISO bit NRF_SCK = 0; } return byte; } #else uchar SPI_RW ( uchar byte ) { uchar i; SPDR = byte; //写寄存器 for ( i = 0; i < 255; i++ ) { if ( SPSR & SET_BIT7 ) { break; //等待传输 } } SPSR &= ~SET_BIT7; byte = SPDR; //读寄存器 return byte; } #endif /*********************************************/ /* 函数功能:给24L01的寄存器写值(一个字节) */ /* 入口参数:reg 要写的寄存器地址 */ /* value 给寄存器写的值 */ /* 出口参数:status 状态值 */ /*********************************************/ uchar NRF24L01_Write_Reg ( uchar reg, uchar value ) { uchar status; NRF_CSN = 0; //CSN=0; status = SPI_RW ( reg ); //发送寄存器地址,并读取状态值 SPI_RW ( value ); NRF_CSN = 1; //CSN=1; return status; } /*************************************************/ /* 函数功能:读24L01的寄存器值 (一个字节) */ /* 入口参数:reg 要读的寄存器地址 */ /* 出口参数:value 读出寄存器的值 */ /*************************************************/ uchar NRF24L01_Read_Reg ( uchar reg ) { uchar value; NRF_CSN = 0; //CSN=0; SPI_RW ( reg ); //发送寄存器值(位置),并读取状态值 value = SPI_RW ( NOP ); NRF_CSN = 1; //CSN=1; return value; } /*********************************************/ /* 函数功能:读24L01的寄存器值(多个字节) */ /* 入口参数:reg 寄存器地址 */ /* *pBuf 读出寄存器值的存放数组 */ /* len 数组字节长度 */ /* 出口参数:status 状态值 */ /*********************************************/ uchar NRF24L01_Read_Buf ( uchar reg, uchar *pBuf, uchar len ) { uchar status, u8_ctr; NRF_CSN = 0; //CSN=0 status = SPI_RW ( reg ); //发送寄存器地址,并读取状态值 for ( u8_ctr = 0; u8_ctr < len; u8_ctr++ ) { pBuf[u8_ctr] = SPI_RW ( 0XFF ); //读出数据 } NRF_CSN = 1; //CSN=1 return status; //返回读到的状态值 } /**********************************************/ /* 函数功能:给24L01的寄存器写值(多个字节) */ /* 入口参数:reg 要写的寄存器地址 */ /* *pBuf 值的存放数组 */ /* len 数组字节长度 */ /**********************************************/ uchar NRF24L01_Write_Buf ( uchar reg, uchar *pBuf, uchar len ) { uchar status, u8_ctr; NRF_CSN = 0; status = SPI_RW ( reg ); //发送寄存器值(位置),并读取状态值 for ( u8_ctr = 0; u8_ctr < len; u8_ctr++ ) { SPI_RW ( *pBuf++ ); //写入数据 } NRF_CSN = 1; return status; //返回读到的状态值 } /*********************************************/ /* 函数功能:24L01接收数据 */ /* 入口参数:rxbuf 接收数据数组 */ /* 返回值: 0 成功收到数据 */ /* 1 没有收到数据 */ /*********************************************/ uchar NRF24L01_RxPacket ( uchar *rxbuf, uchar rxlen ) { uchar state; uchar res = 0; state = NRF24L01_Read_Reg ( STATUS ); //读取状态寄存器的值 if ( state & RX_DR ) //接收到数据 { state &= ~RX_DR; NRF_CE = 0; //配置前 //rxlen = (rxlen