前面章节中,中断相关的内容时不时提到,这节详细说一下。
因为前面有过铺垫,所以就不按部就班的啰嗦前戏了,直接进入正题吧。
因为前面有过铺垫,所以就不按部就班的啰嗦前戏了,直接进入正题吧。
nrf24l01一共3种中断: TX_DS / RX_DR / MAX_RT
- TX_DS : (TX data sent)通知本端主控,我方的数据已经发出去了。
- RX_DR : (RX data received/ready)通知本端主控,我收到了新的数据,你要不要看看?
- MAX_RT: (max for re-transmition)上节详细提过,不赘述了。
当任意一个或多个中断发生时,IRQ管脚都会被【nrf24l01主动】拉低,即IRQ管脚低电平触发。
程序知道了IRQ脚变成低电平,只能知道有中断发生了,但并不知道到底是哪个或哪些中断,所以nrf24l01通过STATUS寄存器记录了具体的中断源:
程序知道了IRQ脚变成低电平,只能知道有中断发生了,但并不知道到底是哪个或哪些中断,所以nrf24l01通过STATUS寄存器记录了具体的中断源:
如上图,标出的每个bit表示对应的中断,bit=0表示当前没有此中断,bit=1表示当前此中断已经触发。
当IRQ拉低之后,程序读取这个寄存器,就能知道到底是哪个或哪些中断被触发了。
当IRQ拉低之后,程序读取这个寄存器,就能知道到底是哪个或哪些中断被触发了。
IRQ管脚被拉低之后,即使我们程序读取了STATUS,管脚【也不会自动地】回归高电平,即nrf24l01不会主动清理中断。
清理中断的工作必须由我们的程序亲自来操作,做法是:
【往STATUS寄存器对应bit位上写1】(不要觉得奇怪,这里我没写错,就是写1而不是写0)
只有当前【所有】被触发的中断【都】被清理了,IRQ管脚才会回归高电平。
除此之外,程序可以通过配置寄存器的方式来【分别禁用/屏蔽】这些中断:
![](https://img-blog.csdnimg.cn/20200804185640858.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTc1NTk2Ng==,size_16,color_FFFFFF,t_70)
如上图,nrf24l01将中断屏蔽位整合到了CONFIG寄存器中,给bit位写1则屏蔽对应中断,写0保持开启。
个人认为,这个屏蔽设计有些轻微脑残,我实在想不出需要把中断屏蔽掉的理由。
之所以在这儿添上这些内容,是为了提醒大家不要【误操作】:
在修改CONFIG其他bit位的时候,不要将中断屏蔽位给误写了,不然程序就再也收不到对应的中断通知了。
个人认为,这个屏蔽设计有些轻微脑残,我实在想不出需要把中断屏蔽掉的理由。
之所以在这儿添上这些内容,是为了提醒大家不要【误操作】:
在修改CONFIG其他bit位的时候,不要将中断屏蔽位给误写了,不然程序就再也收不到对应的中断通知了。
本节上面的描述中,暗含了一个意思:
IRQ管脚拉低时,可能是某中断单独发生,也可能是多个中断同时发生。
在【Enha
IRQ管脚拉低时,可能是某中断单独发生,也可能是多个中断同时发生。
在【Enha