NRF24L01 怎么不能连续接收数据?
成钧 2014-06-02 10:42:17 问题:如果将SetRX_Mode(),放在while循环之外 只能接收一个数据, 且就是在上电那一刻。 求同行帮忙分析一下,
/***************主程序******************/
void main(void)
{
unsigned char tf =0;
unsigned char TxBuf[32]="WangChengJunWangChengJunWangChen"; //
unsigned char RxBuf[32]={0};
UART_init();
init_NRF24L01();
//SetTX_Mode();
while(1)
{
SetRX_Mode(); //如果将次语句放在while循环之外就不能连续接收数据,只会在上电接收一次数据
// nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
Delay(6000);
led = ~led;
if(nRF24L01_RxPacket(RxBuf))
{
RxBuf[31] ='\0';
Printf(RxBuf); // 串口发送数据
BufSet(RxBuf,32,0); //清除缓存区
}
}
}
/*****************************************************************************************************/
void SetRX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); //选择通道0的有效数据宽度
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收
CE = 1;
inerDelay_us(130);
}
/****************************************************************************************************/
/*函数:void SetTX_Mode(void)
/*功能:数据发送配置
/****************************************************************************************************/
void SetTX_Mode(void)
{
CE=0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
CE = 1;
inerDelay_us(130);
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0;//待机模式Ⅰ (写寄存器之前一定要进入待机模式或掉电模式)
CSN=1;
SCK=0;
IRQ=1;
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21
SPI_RW_Reg(WRITE_REG + RF_CH,40); // 设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f); //设置发射速率为1MHZ,发射功率为最大值0dB
CE = 1;
}
/******************************************************************************************************/
/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:数据读取后放如rx_buf接收缓冲区中
/******************************************************************************************************/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
if(RX_DR) // 判断是否接收到数据
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
SPI_RW_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
revale =1; //读取数据完成标志
}
return revale;
}
/***********************************************************************************************************
/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:发送 tx_buf中数据
/**********************************************************************************************************/
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
CE=0; //StandBy I模式
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据
CE=1; //置高CE,激发数据发送
while(IRQ!=0);//等待发送完成
sta=SPI_Read(STATUS); //读取状态寄存器的值
SPI_RW_Reg(WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
inerDelay_us(10);
}
/*****************************************END FILE***************************************************/