51单片机 nRF24L01 STC89C52 无线模块
本帖最后由 awellpoint 于 2018-11-4 07:53 编辑
问题:使用stc89c52+NRF24L01向STM32f103发送数据失败,按照网上调试经验,先屏蔽自动应答,自动重发,撇开接收端,单独调试发送端,判断发送中断,数据还是发送不出去。
现象:初始时判读模块是否存在,读写TX_ADDR寄存器相等,证明spi读写时序无问题,单次发送STATUS寄存器为0x0e,FIFO_STATUS寄存器为0x01;TX_DS未中断置1,TX_FIFO为还有数据。
发送模式和发送函数代码:
void NRF24L01_TX_Mode(void)
{
// NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置RX节点地址,主要为了使能ACK
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通道为40
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发送模式,开启所有中断
//调试时失能应答重发 这样发送方的流程就变成了发送-触发中断。这样就抛开了接收方,可以专心去调试发送
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x00); //使能通道0的自动应答
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x00); //使能通道0的接收地址
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x00);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
// NRF24L01_CE=1;//CE为高,10us后启动发送
}
>u8 NRF24L01_TxPacket(u8 *txbuf)
{
u8 sta=0,fifosta=0;
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,0xff);
NRF24L01_CE=0;
NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 32个字节
NRF24L01_CE=1;
Delay10us();//NRF24L01_CE=1 10u后启动发送
sta=NRF24L01_Read_Reg(NRF_READ_REG+STATUS); //读取状态寄存器的值(读出来为0x0e)
Lcd1602_WriteString(2,1,"STA:0x");
Lcd1602_WriteChar(2,7,(sta/16>9)?(sta/16+'A'):(sta/16+'0'));
Lcd1602_WriteChar(2,8,(sta%16>9)?(sta%16-10+'A'):(sta%16+'0'));
ledport=sta;
Lcd1602_WriteString(2,10,"FO:0x");
fifosta=NRF24L01_Read_Reg(NRF_READ_REG+NRF_FIFO_STATUS);(FIFO状态寄存器读出来为0x01)
Lcd1602_WriteChar(2,15,(fifosta/16>9)?(fifosta/16+'A'):(fifosta/16+'0'));
Lcd1602_WriteChar(2,16,(fifosta%16>9)?(fifosta%16-10+'A'):(fifosta%16+'0'));
ledport=fifosta;
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
if(sta&MAX_TX)//达到最大重发次数
{
NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
return MAX_TX;
}
if(sta&TX_OK)//发送完成
{
return TX_OK;
}
return 0xff;//其他原因发送失败
}
已退回10积分
更多回帖