之前在讲nrf24l01功耗的时候,提到过【工作模式】,为了避免过早的牵扯到很细节的内容,在那一节只是粗略归纳了一下:掉电模式/热待机模式/火力全开模式,说的其实很模糊,这一节正式的讲解一下。
先上一张nrf24l01的状态转换图:
这张图截取自官方datasheet第6章第1节(第21页),如果觉得截图不清楚,可以直接去下载PDF文档,放大了看。
- 圆环圈起来的是模块的工作状态
虚线环表示临时状态,模块在此状态下仅做短暂的停留,实线环(不管粗细)表示稳定的工作状态
- 带箭头的线(无论粗细)表示模块在两个工作状态之间进行【迁移】
- 箭头线上的文字表示【迁移条件】,即旧状态下只有满足特定条件,模块才会进行状态迁移,没有文字表示无条件迁移
- 最上面的【undefined】表示模块上电之前的状态
在各处的【迁移条件】上,我们一共看到了这么几个关键词:CE/PWR_UP/PRIM_RX/TX FIFO
- CE就是上一节提到的CE管脚;
- PWR_UP和PRIM_RX是nrf24l01内部名为CONFIG的寄存器(地址0x00)的两个bit位;
PWR_UP由0变1,则模块从掉电模式PowerDown切换为待机模式Standby-I,但需要至少1.5毫秒的转换过程;
PWR_UP由1变0,则模块不论当前正处于什么工作状态,立即转入PowerDown模式,无需等待;
PRIM_RX则控制模块在工作时是一个什么身份,即PTX还是PRX;
我们的程序可以使用上一节提到的写寄存区命令 W_REGISTER 来修改这两个bit的值,从而控制模块的工作状态/工作模式
- TX FIFO是nrf24l01内部的发送缓冲区;
- 我们的程序通过SPI接口给模块写入发送数据是很快的,但模块将数据完全发送出去却比较慢,为了缓解双方速度不对等的问题,模块内部设置了一个最大容纳96字节数据的缓冲区,每32字节为一组,共3组,以组为单位构成先入先出(FIFO)缓冲区,即是TX FIFO。
- 当我们需要发送很多数据的时候,先一次性将数据写满这3组缓冲区,操作CE管脚启动发送之后,模块再慢悠悠的将缓冲区里的数据以组为基本单元发送出去,发完一组后再取下一组,直到将缓冲区的数据全部发送。
关于缓冲区的内容这里只简单说一下,后面章节会细聊。
那么状态图中粗环粗线/细环细线是个什么意思呢? 这是官方推荐的模块工作流程。
结合上面的图,从前面描述中我们知道,通过操作【CE/PWR_UP/PRIM_RX/TX FIFO】这4项,我们可以随意控制nrf24l01的状态转换。
以最底下的【TX Mode】状态为例子,根据不同的操作条件,模块在切换工作状态的时候有4条路可走:
【路线1】TX Mode --> Standby-I (条件是一包数据发送完毕且CE管脚为低电平)
【路线2】TX Mode --> PowerDown (不管模块在TX Mode下正在干什么,只要把PWR_UP的bit值改为0,那么模块立即进入掉电模式)
【路线3】TX Mode --> TX Mode (一包数据发完之后,如果缓冲区里还有未发送的且CE管脚为高电平,那么继续呆在TX Mode发送下一包)
【路线4】TX Mode --> Standby-II (缓冲区里的数据已经全部发送完毕,但CE管脚依然是高电平,那么立即转入Standby-II状态)
从写程序的角度上说,这4条路都是可以的,nrf24l01对此并不做限制,但为什么官方偏偏推荐【路线1】?
【路线2】明显过于暴力,不多说。
【路线1】和【路线3/4】唯一的区别就是对CE管脚的操作方式不一样:
【路线1】时,触发发送仅仅是在CE管脚上制造一个10微秒宽度的高电平脉冲,之后CE要回归低电平;
【路线3/4】时,触发发送要简单,只要将CE管脚置为高电平就不管了;
这么看起来,PTX模式下CE管脚一直保持高电平在程序实现上反而更方便,因为使用【路线1】工作流程的时候,每发完一包,我们的程序还必须要主动地为CE管脚制造一个高电平脉冲才能再次触发数据发送。
既然这样为啥官方还是推荐【路线1】呢?
我认为是因为功耗的问题。(真的只是"我认为",datasheet上并没有专门解释,功耗论只是我觉得可信度比较高的理由)
从上面这个表可知,虽然同样是待机模式,但Standby-I的功耗要比Standby-II的功耗小一个数量级还多。
当然【路线1】官方只是推荐,我们在写程序的时候不一定非要按照【路线1】来搞,一个写程序更方便,一个更省电,两者各有利弊,自己权衡即可。
那么Standby-II怎么才能转入Standby-I呢?
前面那张状态图上并没有画,其实datasheet在后面章节有提到过: 直接把CE置为低电平即可。
最后,总结一下我们
写程序的时候
,能从这张状态图中可以得到哪些注意事项:
- nrf24l01上电之后,我们的程序至少要延时100毫秒,等它稳定进入PowerDown之后才能开始进行寄存器配置
- 通过修改bit位PWR_UP,让nrf24l01从PowerDown转入Standby-I
- 通过修改bit位PRIM_RX,可以使nrf24l01进入PTX模式或PRX模式
- PWR_UP和PRIM_RX在同一个寄存器里,所以可以一次性配置
- bit位PWR_UP写入1之后,程序必须至少延时1.5毫秒(建议2毫秒),模块才能稳定进入Standby-I,之后程序才能触发数据发送或数据接收
- CE管脚脉冲式触发的时候,要保证高电平至少持续10微秒(建议15微秒)
- 程序操作模块的时候,让nrf24l01尽量按照官方推荐的状态转换路线走