新手上路
- 积分
- 39
- 金钱
- 39
- 注册时间
- 2013-1-13
- 在线时间
- 3 小时
|
<p> 这两天在调试无线通信模块,选用NRF24L01,采用网上许多人的调试方式:关闭自动应答,让一方不停的发送,一方不停的接收,看STATUS状态。程序参考原子哥例程。目前调试出现这样一个非常奇怪的问题:<br />
STM32发送,STC15L接收,通道0模式,发送数据正常(以LED标志),但反过来,以STC15L发送,STM32接收,却始终得不到结果;寄存器配置上相互参照,非常奇怪,怎么也出不来!下面贴上发送、接收端的配置:(STM32下,STC15L下配置一样)<br />
/*******************************************************************************<br />
* 函数名 : NRF24L01_TxPacket<br />
* 功能描述: 启动NRF24L01发送一次数据<br />
* 输入参数: 待发送数据首地址<br />
* 输出参数:发送状态<br />
*******************************************************************************/<br />
uint8_t NRF24L01_TxPacket(uint8_t *txbuf)<br />
{<br />
<br />
NRF24L01_CE_L;<br />
NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH); /*写数据到 txbuf 32个字节*/<br />
NRF24L01_CE_H; /*启动发送*/ <br />
while(NRF24L01_IRQ); /*等待发送完成*/<br />
status=NRF24L01_Read_Reg(STATUS); /*读取状态寄存器的值*/ <br />
FIFO_Reg=NRF24L01_Read_Reg(NRF_FIFO_STATUS);<br />
NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,status); /*清除TX_DS或MAX_RT中断标志*/<br />
if(status&MAX_TX) /*达到最大重发次数*/<br />
{<br />
NRF24L01_Write_Reg(FLUSH_TX,0x00); /*清除TX FIFO寄存器*/ <br />
return MAX_TX; <br />
}<br />
else if(status&TX_OK) /*发送完成*/<br />
{<br />
NRF24L01_Write_Reg(FLUSH_TX,0x00); /*清除TX FIFO寄存器*/<br />
return TX_OK;<br />
}<br />
else <br />
return 0xff; /*其他原因发送失败*/<br />
}<br />
/*******************************************************************************<br />
* 函数名 : NRF24L01_RxPacket<br />
* 功能描述: 启动NRF24L01接收一次数据<br />
* 输入参数: 待接收数据首地址<br />
* 输出参数:接收状态<br />
*******************************************************************************/<br />
uint8_t NRF24L01_RxPacket(uint8_t *rxbuf)<br />
{ <br />
status=NRF24L01_Read_Reg(STATUS); /*读取状态寄存器的值*/<br />
FIFO_Reg=NRF24L01_Read_Reg(NRF_FIFO_STATUS); <br />
NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,status); /*清除RX_DR中断标志*/<br />
if(status&RX_OK) /*接收到数据*/<br />
{<br />
NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);/*读取数据*/<br />
NRF24L01_Write_Reg(FLUSH_RX,0x00); /*清除RX FIFO寄存器*/ <br />
return RX_OK; <br />
} <br />
else<br />
return 0xff; /*没收到任何数据*/<br />
}<br />
/*******************************************************************************<br />
* 函数名 : NRF24L01_RX_Mode<br />
* 功能描述: 初始化NRF24L01到接收模式,<br />
设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR<br />
当CE变高后,即进入RX模式,并可以接收数据<br />
* 输入参数: 无<br />
* 输出参数:无<br />
*******************************************************************************/ <br />
void NRF24L01_RX_Mode(void)<br />
{<br />
NRF24L01_CE_L; <br />
NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);/*写RX节点地址,接收数据宽度*/<br />
<br />
<span style="color:#e53333;">NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x00); /*使能通道0的自动应答*/ </span> <br />
NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01);/*使能通道0的接收地址*/ <br />
NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,0); /*设置RF通道频率*/ <br />
NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,TX_PLOAD_WIDTH);/*选择通道0的有效数据宽度*/ <br />
NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x07); /*设置RX发射参数,0db增益,1Mbps,低噪声增益开启*/ <br />
NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0f); /*配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式 */<br />
NRF24L01_CE_H; /*CE为高,进入接收模式*/ <br />
Delay(250); /*130us后接收*/<br />
} <br />
/*******************************************************************************<br />
* 函数名 : NRF24L01_TX_Mode<br />
* 功能描述: 初始化NRF24L01到发送模式,<br />
设置TX地址,写TX数据宽度,选择RF频道,波特率和LNA HCURR<br />
当CE变高10us后,即进入TX模式,发送数据<br />
* 输入参数: 无<br />
* 输出参数:无<br />
*******************************************************************************/ <br />
void NRF24L01_TX_Mode(void)<br />
{ <br />
NRF24L01_CE_L; <br />
NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); /*写TX节点地址*/ <br />
NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH); /*设置TX节点地址,主要为了使能ACK*/ </p>
<p> <span style="color:#e53333;">NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x00); /*使能通道0的自动应答*/ </span><br />
<span style="color:#e53333;"> NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x00); /*使能通道0的接收地址*/ </span><br />
<span style="color:#e53333;"> NRF24L01_Write_Reg(WRITE_REG_NRF+SETUP_RETR,0x00);/*设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次*/</span><br />
NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,0); /*设置RF通道工作频率为40*/<br />
NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x07); /*设置TX发射参数,0db增益,2Mbps,低噪声增益开启*/ <br />
NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG,0x0e); /*配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,发送模式,开启所有中断*/<br />
NRF24L01_CE_H; /*CE为高,10us后启动发送*/<br />
Delay(10); /*10us后发送*/<br />
}<br />
/*结束*/<br />
在主程序就是简单的调用发送、接收包程序。原子哥帮忙看看问题出在哪?调试2天了...<br />
</p> |
|