NRF24L01P 3个FIFO发送接收问题
出道小白 2020-01-03 03:09:36 现在是想实现3FIFO通讯,也就是直接发送接收96byte,现在可以发送,但是接收那边用逻辑分析仪测试只接收到64byte,而且中间有一个446us的延时(代码没有加延时),发送不确定是否完美。
发送配置
void TX_Mode(void)
{
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+CONFIG, 0x02);//关机模式
NRF24L01_CE_0();
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(uint8_t*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址
//NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+SETUP_AW,0x01); //地址位3个字节
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+EN_AA,0x00); //关闭通道0的自动应答
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+FEATURE, 0x01); //使能命令W_TX_PAYLOAD_NOACK
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+SETUP_RETR, 0x00); //使能命令W_TX_PAYLOAD_NOACK
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_CH,1); //设置RF通道 ,通道1-125,要避免其他信号的干扰,选择不常用的,通常越中间干扰越大
//NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_SETUP,0x07); //设置TX发射参数,0db增益,1Mbps,低噪声增益开启
//NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_SETUP,0x27); //设置TX发射参数,0db增益,250kbps,低噪声增益开启
//NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+CONFIG,0x0A); //接收模式,开启所有中断,无CRC
NRF24L01_CE_1();//CE为高,10us后启动发送
Delay1(0xffff); //CE要拉高一段时间才进入发送模式
}
接收配置
void RX_Mode(void)
{
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+CONFIG, 0x02);//关机模式
NRF24L01_CE_0();
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+SETUP_AW,0x01); //地址位3个字节
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+FEATURE, 0x01); //使能命令W_TX_PAYLOAD_NOACK
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+EN_AA,0x00); //关闭通道0的自动应答
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+EN_RXADDR,0x02);
//使能通道0的接收地址
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_CH,1); //设置RF通信频率
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
//NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_SETUP,0x07);//设置TX发射参数,0db增益,1Mbps,低噪声增益开启
//NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+RF_SETUP,0x27);//设置TX发射参数,0db增益,250kbps,低噪声增益开启
//NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+CONFIG, 0x0B);//接收模式 ,无crc
NRF24L01_CE_1() ; //CE为高,进入接收模式
}
void NRF24L01_RxPacket_96bit(uint16_t *rxbuf)
{
uint8_t status,sta,i,j,data1,fifo_status;
uint16_t data;
uint8_t num=0;
NRF24L01_CE_1();
while(NRF24L01_IRQ!=0);//等待接收完成
NRF24L01_CE_0();
sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
if(sta&RX_OK)//接收到数据
{
fifo_status = NRF24L01_Read_Reg(FIFO_STATUS);
while(!(fifo_status & 0x01))
{
NRF24L01_CE_0();
NRF24L01_CSN_0(); //使能SPI传输
SPIx_ReadWriteByte(RD_RX_PLOAD);//发送寄存器值(位置),并读取状态值
for(j=0;j<FIFO_SIZE;j++)
{
data1=SPIx_ReadWriteByte(0xFF);//读出数据
data=(data1<<8);
*rxbuf++=data;
*rxbuf++=0;
}
NRF24L01_CSN_1(); //关闭SPI传输
NRF24L01_CE_1();
fifo_status = NRF24L01_Read_Reg(FIFO_STATUS);
}
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
NRF24L01_NRF_WRITE_REG(FLUSH_RX,0xff);//清除RX FIFO寄存器
}
}
void NRF24L01_TxPacket_96bit(uint16_t *txbuf)
{
uint8_t sta,status,j,i,data,fifo_status;
uint16_t data1,data2;
//NRF24L01_NRF_WRITE_REG(FLUSH_TX,0xff);//清除TX FIFO寄存器
NRF24L01_NRF_WRITE_REG(NRF_WRITE_REG+STATUS,0x20); //清除TX_DS或MAX_RT中断标志
fifo_status = NRF24L01_Read_Reg(FIFO_STATUS);
if((fifo_status & 0x10))
{
NRF24L01_CE_0();
for(i=0;i<3;i++)
{
NRF24L01_CSN_0();
status = SPIx_ReadWriteByte(W_TX_PAYLOAD_NOACK);//发送寄存器值(位置),并读取状态值
for(j=0;j<FIFO_SIZE; j++)
{
data1=*txbuf++;
data2=*txbuf++;
data=(uint8_t)((data1+data2)>>8);
SPIx_ReadWriteByte(data); //写入数据
}
NRF24L01_CSN_1(); //关闭SPI传输
}
NRF24L01_CE_1();//启动发送
}
while(NRF24L01_IRQ!=0);//等待发送完成
delay_us(7);//delay_us(500);
}