Siliconlabs EFR32MG系列ZIGBEE终端休眠设备开发——碰到的问题


前言

SiliconLabs的ZIGBEE相关的开发,由于是插件化的所以其实各个方面做的都已经很完善了,需要我们去进行修改的不多。往往一个插件选择好了,配置好了就能够正常的使用了,我在这篇博客里面主要去记录一下自己碰到的问题。


提示:以下是本篇文章正文内容,下面案例可供参考

一、休眠不正常

1.设备入网失败后,不能成功进入休眠了?

  • 问题:

    使用 emberAfPluginNetworkSteeringStart()让设备进入配对模式,
    配对失败后设备不能正常进入休眠。
    
  • 原因:

    这是最新的SDK的一个BUG,在6.8.0.0之后就一直有这个问题,
    目前6.8.2.0的这个问题还依然存在。
    

2.休眠电流高达100ua?

  • 问题:

    我在使用Energy Profiler测试休眠电流时发现,在休眠状态下
    我的休眠电流是100ua左右,正常情况下应该就只有几个ua才对。
    
  • 原因:

    这是最新的SDK的一个BUG,在6.8.0.0之后就一直有这个问题,
    目前6.8.2.0的这个问题还依然存在。
    

3.正常入网后,设备不能进入休眠了?

  • 问题:

    在设备入网后,设备不能正常进入休眠,发现一直在打印slept for 0 ms,
    然后因为加了heartbeat的插件,所以能够看到LED灯在不停的闪烁
    (如果处于工作状态LED灯会以一定的间隔闪烁)。
    
  • 原因:

    后来通过检查发现在emberAfPluginIdleSleepTickCallback中它会去检查当前是否有任务需要执行,
    如果没有的话才会去进入休眠。这里我打印出来看到
    emberOkToNap()=	EMBER_OUTGOING_MESSAGES
    这里说明是有一些类似于上报的任务在等待着执行,然后我就去查发现是因为在下载新的固件的时候,
    之前的固件没有被我擦除掉,上一次的class 0x0006的绑定信息还依然存在。
    但是因为现在最新的固件里面没有这个class 0x0006了,所以在处理emberAfPluginReportingTickEventHandler()
    的时候去读0x0006的on/off属性,发现读不到,然后就continue去执行下一个class的信息了,
    这个时候因为没有走到最后所以有一个标志为reportableChange一直都为true。这样的话系统就会认为
    当前还有上报任务没有结束,所以设备也就不能正常进入休眠了。
    所以避免这种问题的话,在下载新的固件,特别是两个不同的固件之前首先一定要擦除了,再去下载新的固件。
    

二、外设

1.测量电压一直都是3.3v

  • 问题:

    我在使用Battery Monitor的时候,发现给设置的IO低电平,
    测量出来的电压也一直都是3.3v,这让我很奇怪。
    
  • 原因:

    后来才发现其实它这里测量的是电源电压AVDD的电压,并不是对应的GPIO的电压。
    

2.MG21休眠时使用扩展板上的按键不能进行中断唤醒。

  • 问题:

    MG21的RF-Border使用WTSK(扩展版)的时候,在休眠状态下,使用了扩展板上的Button1 Button2不能唤醒
    (已经成功初始化了的)。
    
  • 原因:

    在Serial 2系列中,不能使用GPIOC,GPIOD去唤醒,因为在EM2状态下,这两类GPIO的状态是被锁存住的。
    所以如果需要唤醒的话需要使用GPIOA,GPIOB
    文章在Section3.3:
    https://www.silabs.com/content/usergenerated/asi/cloud/attachments/siliconlabs/en/community/wireless/zigbee-and-thread/forum/jcr:content/content/primary/qna/em23_gpio_wake_up-MbVg/section_3_3_of_theefr32mg21datasheet-ZjMM/efr32mg21-datasheet.pdf
    

    在这里插入图片描述

三、其它

1.下载了.bin文件之后打印乱码

  • 问题:

  •   之前一直使用的MG13的平台,现在需要使用切换到MG21平台上面,然后就碰到了一个问题,下载代码 之前我先进行了erase,
      之后我再下载.bin文件,发现程序运行不起来,偶尔打印出来乱码。
    
  • 原因:

    这里主要是erase的时候把bootloarder给擦除掉了,EFR32所使用的FLASH,分为两种,一种是mainInfo+flash,一种是单独的flash。
    如果有mai nInfo那么bootloader在下载的时候,会下载到了mainInfo中,如果没有的话则会下载到flash的前16个字节中。
    erase的时候只是擦除了flash中的内容,在EFR32MG1x系列的设备中flash是有mainInfo的,
    所以擦除的时候并不会擦除FLASH,但是在EFR32MG2X的设备中,flash是没有mainInfo的,bootloader存在了flash中,
    所以erase的时候会擦除掉flash。
    解决方案就是去新建一个bootloader的demo(如bootloader-storage-internal-single-512k)
    然后将编译生成的*.s37结尾的文件下载到板子上面,然后再下载你的应用代码的*.hex文件,这样应用基本就跑起来了。
    

2.休眠设备怎么进行重入网?

参考内容:

	https://www.silabs.com/community/wireless/zigbee-and-thread/knowledge-base.entry.html/2012/06/29/how_does_the_stackm-dfHy	

	休眠设备的重入网主要是两种:
	 (1)通过emberPollForData()去轮训,如果轮训失败会尝试重入网。
	 (2)自己去判断网络状态,如果网络状态为EMBER_JOINED_NETWORK_NO_PARENT,
	  这一般就是说明设备加入了网络中,但是和父节点失联了,可以通过emberFindAndRejoinNetwork(TRUE, 0) 
	  去强制重新加入到该网络中。

3.如何进行RF测试?

我这里所说的RF测试是指进行射频的收发测试,主要是用于厂测阶段。
具体的使用方式其实很简单在文档《AN1162: Using the Manufacturing Library for EmberZNe》有详细的描述。
可参考的文档:

《AN700.1: Manufacturing Test Guidelines for the EFR32 》
《AN1162: Using the Manufacturing Library for EmberZNet》

文档其实主要描述的测试方式也就两种:

(1)下载Silicon labs提供的已经编译好的应用程序,如nodeTest的应用程序,但是这里面没有源码。
	具体文档所在路径为:
	"/Applications/Simplicity Studio.app/Contents/Eclipse/developer/sdks/gecko_sdk_suite/v3.1/protocol/zigbee/build"

(2)  官方提供了用于测试的库,可以通过调用这些库里面的API去实现相应的功能,如收/发包。
	具体参考:
	《AN1162: Using the Manufacturing Library for EmberZNe》

注意:

	在进行收发测试的时候,尽量将设备的通道设置为不常用的通道如13/17 这样的,
	观察下在发射器没有发包的情况下,接收器在接收模式下是否有收到包,如果有收到包说明周围的干扰比较大,
	这个时候尽量换一个安静点的通道,否则一些其它ZIGBEE发的杂包也会被接收器接收,容易影响判断,
	甚至可能会导致发射器发送的包,接收器收不到,从而影响测试结果和精度。

4.如何解决电池电压测量不稳定的问题?

问题:

在做终端设备的过程中,大家也许都碰到过电池电压测量不稳定以及不准确的问题。
这类问题出现的时候往往我们会在ADC采样是否正确这方面来查看,很容易
忽视电池本身的特性带来的影响。
每种电池几乎都会有一个内阻存在,当外部负载所需要的电流比较大时,流过内阻
的电流就会增大,进而导致内阻分去的电压更多,电池两端的电压变小。

解决方式:

尽量不要在大电流工作期间去测量电池电压(如射频工作期间),然后就是射频工作
完成之后一般不要立马去测量电池电压,稍微等一会,因为有些电池在大电流工作时,
内部的化学反应会导致电池的内阻增加,需要等电池自己慢慢将状态还原。

具体可参考:我的另外一篇内容《大电流对电池电压的影响》.

5.如何实现消息上报,以及消息上报失败后会自动重试吗?

这里以silicon labs协议栈中class下属性发生变化触发上报为例。

  • 1.在配置文件ZCL Clusters中找到要上报的属性,并在Reporting选项中进行勾选。然后自动生产代码后,会将要上报的属性存入表EMBER_AF_GENERATED_REPORTING_CONFIG_DEFAULTS
    在这里插入图片描述

  • 2.网关在添加设备成功后,主动和该设备要上报的属性所在的Class建立绑定关系。

  • 3.通过emberAfWriteServerAttribute()修改要上报的属性值,如果写入的值和上一次的值相同的话,是不会触发上报的。

  • 4.在reporting.c中有个emberAfPluginReportingTickEventHandler()会定时去查
    是否有满足消息上报条件的属性,如果有则通过调用

    emberAfSendCommandUnicastToBindingsWithCallback((EmberAfMessageSentFunction)(&retrySendReport));
    

    去进行消息上报,如果上报不成功则会调用retrySendReport()再进行一次单播,所以如果上报不成功的话则会自动重新上报一次。

6.如何获取设备的MAC地址?

 uint8_t data[8];
 halInternalGetMfgTokenData(data,MFG_EUI_64_LOCATION,0,8);

7.如何使用命令行清除固件?

问题:

有些时候,我们会不小心将开发版/模块的下载口的给复用,导致固件不能正常下载

解决方式:

silicon labs提供了一个commander的工具,下载该工具,并在该工具所在的路径下,
找到commander命令所在的路径。(例如:/Applications/Commander.app/Contents/MacOS)

然后执行:
commander device masserase	(擦除所有区域的FALSH)
commander device recover	(重置)

8.如何添加自定义class或属性?

解决方式:

打开下面路径所对应的文件:
[/Applications/Simplicity\ Studio.app/Contents/Eclipse/developer/sdks/gecko_sdk_suite/v3.1/app/zcl/sample-extensions.xml]

该文件里面的注释会说明如何如何进行添加

猜你喜欢

转载自blog.csdn.net/Dr_chaser/article/details/109557694