//传输一次,数据最长为 32字节 static u8 NRF_TX_Dat_Once(u8 *txbuf) { u8 state; /*ce为低,进入待机模式1*/ NRF_CE_LOW(); /*写数据到TX BUF 最大 32个字节*/ NRF_WriteBuf(WR_TX_PLOAD,txbuf,MAX_ONCE_TX_NUM); /*CE为高,txbuf非空,发送数据包 */ NRF_CE_HIGH(); /*等待发送完成中断 */ while(NRF_Read_IRQ()!=0); /*读取状态寄存器的值 */ state = NRF_ReadReg(STATUS); /*清除TX_DS或MAX_RT中断标志*/ NRF_WriteReg(NRF_WRITE_REG+STATUS,state); NRF_WriteReg(FLUSH_TX,NOP); //清除TX FIFO寄存器 /*判断中断类型*/ return state; }
/* * 函数名:NRF_RX_Mode * 描述 :配置并进入接收模式 * 输入 :无 * 输出 :无 * 调用 :外部调用 */ void NRF_RX_Mode(void) { NRF_CE_LOW(); NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答 NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址 NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址 NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0B | (IS_CRC16<<2)); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 #if 1 /* 清除中断标志*/ NRF_WriteReg(NRF_WRITE_REG+STATUS,0xff); NRF_WriteReg(FLUSH_RX,NOP); //清除RX FIFO寄存器 #endif /*CE拉高,进入接收模式*/ NRF_CE_HIGH(); nrf_mode = RX_MODE; }
/*=====================================================================================================*/ static void NRF_TxData( u8 *TxBuf ) { NRF_CE = 0; NRF_SetAddr(NRF_TX_ADDR, TX_ADDRESS); // 設定 TX 地址 NRF_WriteReg(CMD_W_REG | NRF_CONFIG, 0x0E); // Power UP,Enable 16bit CRC,TX Mode,no mask NRF_WriteBuf(CMD_W_TX_PLOAD, TxBuf, NRF_TX_PL_WIDTH); // 寫入資料 NRF_CE = 1; Delay_10us(1); // A high pulse on CE starts the transmission. The minimum pulse width on CE is 10μs. }
/* * 函数名:NRF_TX_Mode * 描述 :配置发送模式 * 输入 :无 * 输出 :无 * 调用 :外部调用 */ void NRF_TX_Mode(void) { u32 i; NRF_CE_LOW(); NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址 NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //设置RX节点地址 ,主要为了使能ACK NRF_WriteReg(NRF_WRITE_REG+CONFIG,0x0A | (IS_CRC16<<2)); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发射模式,开启所有中断 /*CE拉高,进入发送模式*/ NRF_CE_HIGH(); i=0xffff; while(i--); //CE要拉高一段时间才进入发送模式 //DELAY_MS(1); nrf_mode = TX_MODE; }
/*=====================================================================================================*/ static u8 NRF_Check( void ) { u8 i; u8 buf[5] = {0}; NRF_WriteBuf(CMD_W_REG | NRF_TX_ADDR, TX_ADDRESS, 5); NRF_ReadBuf(CMD_R_REG | NRF_TX_ADDR, buf, 5); for(i=0; i<5; i++) if(buf[i]!=TX_ADDRESS[i]) return ERROR; return SUCCESS; }
void SetRxMode(void) { SPI_CE_L; NRF_WriteReg(FLUSH_RX, 0xff);//清除TX FIFO寄存器 NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);//写RX节点地址 NRF_WriteReg(NRF_WRITE_REG+EN_AA, 0x01);//使能通道0的自动应答 NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR, 0x01);//使能通道0的接收地址 NRF_WriteReg(NRF_WRITE_REG+RF_CH, 40);//设置RF通信频率 NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0, RX_PLOAD_WIDTH);//选择通道0的有效数据宽度 NRF_WriteReg(NRF_WRITE_REG+RF_SETUP, 0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启 NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 SPI_CE_H; printf("nrf24l01 work on rx..\r\n"); }
/*=====================================================================================================*/ u8 NRF_Check( void ) { u8 i; u8 SendBuf[5] = {0xc2, 0xb5, 0x81, 0xd0, 0xa9}; u8 RecvBuf[5] = {0}; NRF_WriteBuf(CMD_W_REG | NRF_TX_ADDR, SendBuf, 5); NRF_ReadBuf(CMD_R_REG | NRF_TX_ADDR, RecvBuf, 5); for(i=0; i<5; i++) if(RecvBuf[i]!=SendBuf[i]) return ERROR; return SUCCESS; }
//中断发送函数,仅仅发送一次,就等待中断发送 void NRF_ISR_Tx_Dat_Once(void) { if(isr_L > 0) { /*ce为低,进入待机模式1*/ NRF_CE_LOW(); /*写数据到TX BUF 最大 32个字节*/ NRF_WriteBuf(WR_TX_PLOAD,(u8 *)isr_addr,MAX_ONCE_TX_NUM); /*CE为高,txbuf非空,发送数据包 */ NRF_CE_HIGH(); isr_L--; } }
//判断SPI接口是否接入NRF芯片是否可用 uint8_t NRF24L01_Check(void) { uint8_t buf[5] = {0xC2,0xC2,0xC2,0xC2,0xC2}; uint8_t buf1[5] = {0}; uint8_t i; NRF_WriteBuf(NRF_WRITE_REG + TX_ADDR, buf, 5); NRF_ReadBuf(TX_ADDR, buf1, 5); for (i=0;i<5;i++) { if (buf1[i]!=0xC2) break; } if (i==5) {printf("NRF24L01 is working...\r\n");return 1 ;} //MCU 与NRF 成功连接 else {printf("NRF24L01 wrong...\r\n");return 0 ;} //MCU与NRF不正常连接 }
/*=====================================================================================================*/ static void NRF_SetAddr( u8 RegAddr, u8 *Address ) { u8 PipeLen = 0; switch(RegAddr) { case NRF_TX_ADDR: case NRF_RX_ADDR_P0: case NRF_RX_ADDR_P1: PipeLen = NRF_PIPE_WIDTH; break; case NRF_RX_ADDR_P2: case NRF_RX_ADDR_P3: case NRF_RX_ADDR_P4: case NRF_RX_ADDR_P5: PipeLen = 1; break; } NRF_WriteBuf(CMD_W_REG | RegAddr, Address, PipeLen); }
/* * 函数名:NRF_Check * 描述 :主要用于NRF与MCU是否正常连接 * 输入 :无 * 输出 :SUCCESS/ERROR 连接正常/连接失败 * 调用 :外部调用 */ u8 NRF_Check(void) { #define NRF_CHECH_DATA 0xC2 u8 buf[5]={NRF_CHECH_DATA,NRF_CHECH_DATA,NRF_CHECH_DATA,NRF_CHECH_DATA,NRF_CHECH_DATA}; u8 buf1[5]; u8 i; /*写入5个字节的地址. */ NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,buf,5); /*读出写入的地址 */ NRF_ReadBuf(TX_ADDR,buf1,5); /*比较*/ for(i=0;i<5;i++) { if(buf1[i] != NRF_CHECH_DATA) { return 0 ; //MCU与NRF不正常连接 } } return 1 ; //MCU与NRF成功连接 }
void NRF_TxPacket(uint8_t *txbuf, uint8_t len) { SPI_CE_L;////StandBy I模式 NRF_WriteBuf(WR_TX_PLOAD, txbuf, len); SPI_CE_H;//置高CE,激发数据发送 }