OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6936|回复: 1

NRF24L01说明书很含糊,有关IRQ的理解不知道是否正确?恳请高人指点迷津。

[复制链接]

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2013-11-13 23:02:22 | 显示全部楼层 |阅读模式
以原子老师的接收数据函数为例,我的注释是否正确,请指教!谢谢!<br />
<br />
u8 NRF24L01_TxPacket(u8 *txbuf)<br />
{<br />
&nbsp;u8 sta;<br />
&nbsp;&nbsp;SPI2_SetSpeed(SPI_SPEED_8) ;//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)&nbsp;&nbsp; <br />
&nbsp;NRF24L01_CE=0;&nbsp; //空闲时CE为0,<br />
&nbsp; &nbsp;NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF&nbsp; 32个字节<br />
&nbsp;&nbsp;NRF24L01_CE=1;&nbsp; //启动发送,根据NRF24L01时序CE上升沿发送&nbsp;&nbsp;&nbsp; <br />
&nbsp;while(NRF24L01_IRQ!=0);&nbsp;&nbsp;&nbsp; //等待发送完成,“#define NRF24L01_IRQ&nbsp; PGin(8)”;“NRF24L01_IRQ!=0”等价于“NRF24L01_IRQ=1”<br />
/* 如果IRQ为高电平,说明没有产生中断。反之,如果IRQ为低电平,说明已经产生中断。通过向STATUS寄存器的TX_DS或MAX_RT位写1可以清除中断即IRQ恢复为高电平。<br />
IRQ 引脚会在以下三种情况变低(即产生中断):<br />
Tx FIFO(发送缓存buf) 发完并且收到ACK(使能ACK 情况下)<br />
Rx FIFO(接收缓存buf) 收到数据,Rx FIFO已满<br />
达到最大重发次数(对应STATUS寄存器的MAX_RT位),将MAX_RT位置1则清除中断。将IRQ接到外部中断输入引脚,通过中断程序进行处理。IRQ为低电平时说明已经产生了相应的中断,空闲时为高电平。<br />
&nbsp;所以,如果发生了中断,则STATUS寄存器的TX_DS或MAX_RT位会置1,再次向STATUS寄存器的TX_DS或MAX_RT位写1<br />
会使IRQ恢复为高电平<br />
*/<br />
&nbsp;sta=NRF24L01_Read_Reg(STATUS);&nbsp; //读取状态寄存器的值,根据状态寄存器的状态值来操作<br />
/*<br />
#define STATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x07&nbsp; //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发,0x07是FIFO_STATUS的寄存器地址;本句中:读寄存器STATUS,将状态寄存器的值赋给sta<br />
#define FIFO_STATUS&nbsp;&nbsp;&nbsp; 0x17&nbsp; //FIFO状态寄存器;bit0,RX FIFO寄存器空标志;<br />
//bit1,RX FIFO满标志;bit2,3,保留bit4,TX FIFO空标志;bit5,TX FIFO满标志;<br />
//bit6,1,循环发送上一数据包.0,不循环;<br />
*/&nbsp;&nbsp;&nbsp; <br />
&nbsp;NRF24L01_Write_Reg(WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志<br />
/*<br />
要写入的值是sta,“WRITE_REG+STATUS”是要写入的值的地址,<br />
“WRITE_REG”:#define WRITE_REG&nbsp;&nbsp;&nbsp; 0x20&nbsp; //写配置寄存器,低5位为寄存器地址<br />
如果发生了中断,则STATUS寄存器的TX_DS或MAX_RT位会置1,再次向STATUS寄存器的TX_DS或MAX_RT位写1<br />
会使IRQ恢复为高电平即清除中断<br />
*/<br />
&nbsp;if(sta&amp;MAX_TX)//达到最大重发次数,本程序头文件将MAX_TX定义为0x10,如果达到最大重发次数,硬件会自动将MAX_RT位置1<br />
&nbsp;{&nbsp; //“0001 0000”与STATUS寄存器的bit4(MAX_RT位)做与运算,如果MAX_RT位为1说明没有产生中断,即没有达到最大重发次数,<br />
&nbsp;&nbsp;NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器 <br />
&nbsp;&nbsp;return MAX_TX;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //没有达到最大重发次数<br />
&nbsp;}<br />
&nbsp;if(sta&amp;TX_OK)&nbsp;&nbsp;&nbsp; //头文件将TX_OK定义为0x20,对应STATUS的bit5位即TX_DS,若数据发送完成且收到应答信号后,硬件会自动将TX_DS位置1,<br />
&nbsp;{//根据说明书如果TX_DS为高电平,说明数据发送完成。数据发送完成则会产生中断向该位写1清除中断。<br />
&nbsp;&nbsp;return TX_OK;//数据发送完成!<br />
&nbsp;}<br />
&nbsp;return 0xff;//其他原因发送失败<br />
}
手艺人要内外兼修。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-11-14 10:11:02 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 18:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表