新手上路
- 积分
- 24
- 金钱
- 24
- 注册时间
- 2019-10-29
- 在线时间
- 9 小时
|
本帖最后由 chenxiu 于 2019-11-16 21:46 编辑
用原子哥的例子稍微改下,将原来的例子中的NRF24L01_TxPacket函数分开,第一部分NRF24L01_TxPacket用于发送数据,NRF24L01_TxCheck用于对中断标志来的时候查询并做相应的处理。这两段都是从原子哥程序中简单分开下。主程序在发送后就不再发送,并一直等待中断标志位,如果IRQ发送成功或者超最大数的外部中断触发(PA0作为IRQ外部中断)发生,中断中只将NRF_TX_IRQTRIG置位,通知主程序的NRF24L01_TxCheck来处理中断。结束后又开始继续发送。循环往复。u8 NRF24L01_TxPacket(u8 *txbuf)
{
u8 sta;
SPI1_SetSpeed(SPI_BaudRatePrescaler_16);//spi速度为10.5Mhz(24L01的最大SPI时钟为10Mhz)
NRF24L01_CE=0;
NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF 32个字节
NRF24L01_CE=1;//启动发送
nRfTxSta&=~NRF_TX_NEEDSEND;//复位发送标志,代表已经发送
nRfTxSta|=NRF_TX_OVERCHECK;//置位等待检查发送结果
return 0;
}
u8 NRF24L01_TxCheck(void)
{
u8 sta, cnt, ut;
sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志
if(sta&MAX_TX)//达到最大重发次数
{
nRfTxSta &=~NRF_TX_OVERCHECK;//将需要待检查结果标志位复位
nRfTxSta &=~NRF_TX_IRQTRIG;//清除中断标志位
NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器
nRfTxSta |=NRF_TX_NEEDSEND;
return MAX_TX;
}
if(sta&TX_OK)//发送完成
{
nRfTxSta &=~NRF_TX_OVERCHECK;//将需要待检查结果标志位复位
nRfTxSta &=~NRF_TX_IRQTRIG;//清除中断标志位
return TX_OK;
}
}
IRQ发送成功或者超最大数的中断用外部中断,中断中只将NRF_TX_IRQTRIG置位,通知主程序的NRF24L01_TxCheck来处理中断。
void EXTI0_IRQHandler (void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
iC++;
if (nRfTxSta & NRF_TX_OVERCHECK)
{nRfTxSta|=NRF_TX_IRQTRIG;//置位中断标志位
}
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
Main主程序前门配置部分不贴了,将主要部分贴下
while(1)
{
/************* nRF24L01 无线通讯*************/
nRfTxSta|=NRF_TX_NEEDSEND;
if (((nRfTxSta & NRF_TX_NEEDSEND)!=0) && ((nRfTxSta & NRF_TX_OVERCHECK)==0))//需要发送且不在等待发送结果状态,则发生数据
{
key=mode;
for(t=0;t<32;t++)
{
key++;
if(key>('~'))key=' ';
tmp_buf[t]=key;
}
mode++;
if(mode>'~')mode=' ';
tmp_buf[32]=0;//加入结束符
NRF24L01_TxPacket(tmp_buf);
sC++;
printf("NRF_Tx, nRfTxSta=%x\r\n", nRfTxSta); //这句不能屏蔽,屏蔽了发现接收不到
}
if ((nRfTxSta&NRF_TX_OVERCHECK) && (nRfTxSta&NRF_TX_IRQTRIG))
{
sta=NRF24L01_TxCheck();
}
我的问题是上面这句话
printf("NRF_Tx, nRfTxSta=%x\r\n", nRfTxSta); //这句不能屏蔽,屏蔽了发现接收不到 竟然不能屏蔽,
如果注释掉这句这段程序发送就不正常,要嘛上电后不发送,要嘛发送几下就停止了。但是将这句话不注释掉的话,发送完全正常,接收端直接用探索者的例程做的,接收端的板子也是用的探索者。这到底是为什么啊?原子哥能否帮忙解答下?这个发送怎么会跟串口输出有关系呢?一周了,实在想不明白了。请各位大神指导下小弟。谢谢了!
|
|