作者:陈广
日期:2021-4-24
拿到开发板后就可以开始学习AT指令了,首先从下面链接下载AT指令助手:
http://www.iotxfd.cn/down/NB-IOT/ATHelper.zip
AT指令助手的使用请参考以下文章:
http://article.iotxfd.cn/WSN/AT-ABC
解压后打开ATHelper文件夹,然后双击ATHelper.exe文件启动AT指令助手。选择正确的串口号将电脑连至开发板。按自锁按钮启动开发板后,在AT指令助手中输入第一个命令:AT
,单击圆形绿色按钮发送指令(注意:AT指令必须以\r\n
结尾,指令助手可以自动添加,如果是其它串口工具需手动自行添加),此时发现无任何响应。请注意,这里是一个坑,我开发板买回来后试了半天才发现,起初还以为开发板出问题了,直到看硬件手册才知道开发板通电后需要给PWR_ON/OFF引脚高电平2秒才能启动开发板。有点坑,真不知道在开发板上没有主控的情况下,如何去给这个引脚2秒的高电平。请按住开发板上的【PWR】键,直到指令助手中出现如下字样后松手:
*ATREADY: 1
+CFUN: 1
+CPIN: READY
此时表明开发板已经启动。再次发送AT
指令,如果返回OK
,则说明可以正常使用开发板了。
在学习AT指令之前,首先需要掌握芯片的睡眠模式,否则在实验过程中会深受困扰。而要理解睡眠模式,首先需要理解NB-IOT的省电模式。NB-IOT与其它通信技术相比,最为重要的特点就是省电,NB-IOT节点往往要求其电池可以使用几年。NB-IoT支持三种省电模式:
我们从简单到复杂的顺序介绍这三种模式。
我们在编写串口或Socket程序的时候经常会用到while(1)
循环来不停地判断通信端口是否有数据到达,使用这种方法表明需要永不停歇地工作,自然会永不停歇地耗电。那么如果要省电,我们很自然地想到,是不是可以时不时地偷下懒呢?所以DRX模式应运而生,如下图所示:
如上图所示,终端首先判断是否有下行数据(接收数据),然后休息一小段时间,然后再接收数据再休息...。这里所说的休息在M5311给出的资料里叫浅睡眠,定义为:关闭部分外设功能,串口无响应,串口输入AT指令可唤醒浅睡眠。 而一个接收数据+休自己的周期称为DRX周期,这个周期的时间由运营商网络侧设置决定,一般为1.28秒至10.24秒。也就是说,如果核心网有下行数据,最迟10.24秒后可以接收到,有一些延时,但如果对于实时性要求不太高的业务是可以接受的。
需要注意,我们在之后的学习过程中,需要主动发送AT指令,AT指令发送完成后只要几秒钟没有动作,芯片就会进入浅睡眠状态。此时再发送AT指令往往不会有反应,多发一次就可以了。
DRX虽然已经很省电了,但省得还不够狠,有规律地拿掉部分接收数据状态(正规的称呼应当为:寻呼监听),拉长浅睡眠时间,于是产生了新模式:eDRX,如下图所示:
此时,终端只有在寻呼时间窗口(Paging Time Window,PTW)内可以接收到数据,功耗相比DRX大为降低,但无法接收到数据的时间从DRX的最长10.24秒变成了eDRX的最长2.92小时。
eDRX是不是已经足够省电了呢?当然不是,假设电表上安装NB-IOT,每天只上报一次数据,eDRX每天至少也会被唤醒8次,对于这种情况来说是有点浪费了。更重要的是,浅睡眠状态耗电1mA,有点多了,可不可以把能关的都关掉,接近关机,把耗电大幅降低呢?深度睡眠,即PSM就是为此准备的。我们看看M5311中对深度睡眠的定义:PSM 模式,外设断电、AT命令任务终止、UART无响应,触发WAKEUP_IN下降沿可唤醒深度睡眠。 PSM模式如下图所示:
上图中的TAU为Tracking Area Update(跟踪区更新)。PSM和eDRX非常类似,只是PSM在非寻呼监听状态时由浅睡眠状态变为深度睡眠状态,深度睡眠的电流很感人,为0.005mA。为电池使用个8至10年打下了坚实的基础。终端何时进入PSM状态,以及在PSM状态驻留的时长由核心网和终端协商,如果IOT设备支持PSM,在附着或TAU过程中,将向网络表明其能力,从而两者之间协商好定时器值。PSM模式的寻呼监听状态以及睡眠时长由定时器T3324(Active Timer)和T3412(Extended TAU)决定。
现在别说一天上传一次信息,大半年发一次信息都没问题。请注意,实际上先有PSM才出现eDRX的。
AM22E芯片默认使用的是PSM省电模式,下面演示如何使用AT指令查询T3324和T3412定时器的值。
连接开发板,输入AT指令:AT+CPSMS?
,结果如下所示。
注意,如果输入指令没有响应,可能处于浅睡眠状态,需再发一次指令。如果还没有响应,说明进入了深睡眠状态,此时需按下开发板上的WAKEUP键唤醒,然后再输入指令。可以先输入
ATE0
指令关闭AT指令回响。
>>>>>>>>>> AT+CPSMS?
+CPSMS: 1,,,"00100011","00100010"
OK
响应内容表明了是否启用了PSM模式以及定时器的时长,如下图所示:
定时器时长由八位二进制字串表示,其中高3位表示Timer单位,低5位表示Timer数值。
Bit8 | Bit7 | Bit6 | 含义 |
---|---|---|---|
0 | 0 | 0 | 指示Timer单位为2秒 |
0 | 0 | 1 | 指示Timer单位为1分钟 |
0 | 1 | 0 | 指示Timer单位为1/10小时 |
1 | 1 | 1 | 指示Timer不使用 |
所以,我们刚才查询到的T3324定时器值为:00100010
,其高3位值为001
,表明定时器单位为1分钟;低5位的值为00010
,转换为十进制为:2。所以最终T3324定时器时长为 1分钟*2 = 2分钟。
Bit8 | Bit7 | Bit6 | 含义 |
---|---|---|---|
0 | 0 | 0 | 指示Timer单位为10分钟 |
0 | 0 | 1 | 指示Timer单位为1小时 |
0 | 1 | 0 | 指示Timer单位为10小时 |
0 | 1 | 1 | 指示Timer单位为2秒 |
1 | 0 | 0 | 指示Timer单位为30秒 |
1 | 0 | 1 | 指示Timer单位为1分钟 |
1 | 1 | 0 | 指示Timer单位为320小时 |
1 | 1 | 1 | 指示Timer不使用 |
刚才查询到的T3412定时器值为:00100011
,其高3位值为001
,表明定时器单位为1小时;低5位为00011
,转换为十进制为:3。所以最终T3412定时器时长为 1小时*3 = 3小时。
可以通过WAKEUP_OUT引脚和STATE引脚的电平输出观察睡眠模式的动作,这两个引脚我都接了LED灯。但默认情况下,这项功能是关闭的,每次开机都需要输入AT指令才能将其打开。
AT+CMSYSCTRL=1,1
WAKEUP_OUT引脚电平与深度睡眠对应关系如下:
WAKEUP_OUT | 睡眠状态 |
---|---|
高电平(LED灯亮) | 唤醒状态 |
低电平(LED灯灭) | 深度睡眠 |
AT+CMSYSCTRL=0,1
STATE引脚电平与浅睡眠状态的对应关系如下:
STATE | 睡眠状态 |
---|---|
高电平(LED灯亮) | 浅睡眠 |
低电平(LED灯灭) | 唤醒睡眠 |
AT+CMSYSCTRL=0,1
后面的两个整数含义为:
第一个整数表示要操作的引脚:
0:选择操作STATE(Pin21)引脚
1:选择操作WAKEUP-OUT(Pin16)引脚
第二个整数表示模式,默认值为0:
0:禁止电平输出
1:启动睡眠指示功能,允许电平输出
2:第一个整数为0时才能使用。开启STATE引脚的EPS注册状态输出。
注意,WAKEUP_UP灯亮表示处于唤醒状态,而STATE灯亮表示处于浅睡眠状态,两者正好相反。进入深度睡眠状态后,两盏灯都会灭掉。
现在,可以用肉眼观察AM22E芯片默认的省电状态了。开发板断电后重新上电(注意,必须要重新上电方能观察到以下现象),长按PWR键启动开发板,输入如下命令:
*ATREADY: 1
+CFUN: 1
+CPIN: READY
>>>>>>>>>> AT
AT
OK
>>>>>>>>>> ATE0 //关闭回响
ATE0
OK
>>>>>>>>>> AT+CMSYSCTRL=0,1 //启用浅睡眠指示
OK
>>>>>>>>>> AT+CMSYSCTRL=1,1 //启用深度睡眠指示
OK
注意,>>>>>>>>>>
后面的是用户输入的命令,其它都是返回内容。
可以观察到,命令完成后,WAKEUP_UP(橙色)灯点亮,表示不处于深度睡眠状态。隔一小段时间不发送命令后,STATE(蓝色)灯开始闪烁,表示进入PTW状态,STATE灯亮表示进入IDEL状态,STATE灯灭表示进行寻呼监听状态,此时如输入AT指令,第一次不会有响应(作用为将芯片从浅睡眠状态唤醒),第二次则会有响应。2分钟后两盏灯均灭掉,表示芯片进入深度睡眠状态,这里输入任何命令都不会响应,按下WAKEUP按钮可唤醒深度睡眠,这里再输入命令就有响应了。如果停止输入AT指令,很快芯片又再次进入深度睡眠状态,这次不会再有浅睡眠过度了,再次进入PTW状态需等待3小时以后。
为了更好地观察PSM的运行,我们将T3324和T3412定时器的时长大幅缩短,T3324设置为1分钟,T3412设置为3分钟。输入如下命令:
>>>>>>>>>> AT
OK
>>>>>>>>>> ATE0
OK
>>>>>>>>>> AT+CMSYSCTRL=0,1 //浅睡眠指示
OK
>>>>>>>>>> AT+CMSYSCTRL=1,1 //深度睡眠指示
OK
>>>>>>>>>> AT+CPSMS=1,,,"10100011","00100001" //T3324:1分钟;T3412:3分钟
OK
观察指示灯,TAU时间大概在10秒左右。我使用秒表测试定时器时间,基本准确。如果再把时间缩短,则结果将不准确,甚至根本无法进入深度睡眠状态。注意,这个更改是永久性的。我设置T3324:30秒;T3412:2分钟,未重启开发板时测试不准确,但重启后又准确了,大家有兴趣的话可以自行尝试摸索出最短时间。
AM22E模组默认使用的是PSM模式,PSM的特点是找到设备需要花费很长的时间,如果NB-IOT的使用场景是共享单车,PSM肯定是不合适的,总不能开个锁需要用户等上2分钟吧!这种情况下,需要将省电模式设置为eDRX。eDRX的设置使用如下命令:
其中:
<mode>
表示终端是否启用eDRX。
<AcT-type>
指示接入技术类型。
<NW-provided_eDRX_value>
表示eDRX周期值,用一个4-bit二进制串表示,含义如下:Bit3 | Bit2 | Bit1 | Bit0 | eDRX周期(秒) |
---|---|---|---|---|
0 | 0 | 1 | 0 | 20.48 |
0 | 0 | 1 | 1 | 40.96 |
0 | 1 | 0 | 1 | 81.92 |
1 | 0 | 0 | 1 | 163.84 |
1 | 0 | 1 | 0 | 327.68 |
1 | 0 | 1 | 1 | 655.36 |
1 | 1 | 0 | 0 | 1310.72 |
1 | 1 | 0 | 1 | 2621.44 |
<Paging_time_window>
表示寻呼时间窗口的时间,用一个4-bit二进制串表示,含义如下:Bit3 | Bit2 | Bit1 | Bit0 | PTW(秒) |
---|---|---|---|---|
0 | 0 | 0 | 0 | 2.56 |
0 | 0 | 0 | 1 | 5.12 |
0 | 0 | 1 | 0 | 7.68 |
0 | 0 | 1 | 1 | 10.24 |
0 | 1 | 0 | 0 | 12.8 |
0 | 1 | 0 | 1 | 15.36 |
0 | 1 | 1 | 0 | 17.92 |
0 | 1 | 1 | 1 | 20.48 |
1 | 0 | 0 | 0 | 23.04 |
1 | 0 | 0 | 1 | 25.6 |
1 | 0 | 1 | 0 | 28.16 |
1 | 0 | 1 | 1 | 30.72 |
1 | 1 | 0 | 0 | 33.28 |
1 | 1 | 0 | 1 | 35.84 |
1 | 1 | 1 | 0 | 38.4 |
1 | 1 | 1 | 1 | 40.96 |
接下来可以设置eDRX模式了,依次输入如下命令:
>>>>>>>>>> ATE0
ATE0
OK
>>>>>>>>>> AT+CMSYSCTRL=0,1 //浅睡眠指示
OK
>>>>>>>>>> AT+CMSYSCTRL=1,1 //深度睡眠指示
OK
>>>>>>>>>> AT+CPSMS=0,,,"10100011","00100001" //关闭PSM
OK
>>>>>>>>>> AT*EDRXCFG=1,5,"0010","0011" //启用eDRX,并将eDRX周期设置为2.48秒,PTW设置为10.24秒
OK
指令完成后,观察指示灯,WAKEUP_UP(橙色)灯处于常亮状态,表明不会再进入深度睡眠状态。STATE(蓝色)灯闪烁表明模块处于PTW时间窗口内,常亮则表示不再进行寻呼监听,处于浅睡眠状态。
注意:M5311模块并不支持DRX,但可将PTW时间和eDRX周期设置为相同值,其效果与DRX相同。
之前为讲解省电模式已经简单介绍了睡眠模式,这里还是要单独拎出来做详细介绍的。
模组在以下四种情况下,若在条件成立前 10s 内无 AT 命令输入,会进入深度睡眠模式:
注意:若在模组睡眠前,输入 AT 命令,若此时即使满足睡眠条件,模组仍然会维持 10s 的唤醒状态;若持续输入间隔小于 10s 的 AT 命令,模组在发送 AT 命令期间将持续维持唤醒,直到最后一条 AT 命令输入完成后 10s,模组才能在满足睡眠条件下进入睡眠;若要实现发送完最后一条 AT 命令立即进入深/浅睡眠,可输入 AT*ENTERSLEEP。
进入深度睡眠后 AT 命令不会做应答,且输入 AT 命令无法唤醒模组,深度睡眠可以通过将WAKEUP_IN由高电平拉至低电平方式(按下WAKEUP按钮)唤醒,唤醒模组后,可保持唤醒状态的默认时间长为 10s(可通过 AT*WAKETIME 指令配置唤醒时长),期间发送 AT 有响应:
模组在以下情况下,若在条件成立前 10s 内无 AT 命令输入,会进入到浅睡眠模式:
进入浅睡眠以后,可以通过以下方式唤醒,唤醒时间默认为 10s,期间发送 AT 有响应:
AT
。关闭睡眠以后,模组将维持在唤醒状态。例如:
AT+SM=LOCK //关闭睡眠,模组维持唤醒状态,输入 AT 命令有响应。
//仅生效一次,重启或深睡眠唤醒后该设置失效。
OK
AT+SM=LOCK_FOREVER //永久关闭睡眠,模组维持唤醒状态,输入 AT 命令有响应。
//重启模组后该设置依然生效。
OK
在学习阶段,可以考虑永久关闭睡眠,可以省去很多麻烦。
打开睡眠使用如下命令:
AT+SM=UNLOCK //打开睡眠,模组会进入相应的深睡眠或浅睡眠模式。
//仅生效一次,重启或深睡眠唤醒后该设置失效。
OK
AT+SM=UNLOCK _FOREVER //永久打开睡眠,模组会进入相应的深睡眠或浅睡眠模式。
//重启模组后该设置依然生效。
OK
需要注意,永久设置命令输入完成后需按PWR按钮或RESET按钮重启开发板方能永久生效,直接给模组断电将无效,重启后又恢复原样,这个坑折腾了我半天。
关于省电模式的指令,这里并没有讲解完毕,不过这些也够了,要详细了解,请参考M5311的AT指令手册。
;