项目介绍
主控:NXP JN5169
计量:采用贝岭计量芯片
功能介绍
既然是zigbee计量插座,要具备zigbee的无线属性,而且有计量的功能。
所以简单地说,要可以接入到网关,网关控制设备开、关。
计量值可以配置 为定时上报,另外手动触发设备开关时,可以自动上报状态到网关。
开发环境:
BeyondStudio for NXP
SDK代码结构:
在官方示例基础上进行修改 基于JN-AN-1217 示例
代码编译基于Makefile,引用外部SDK。安装开发环境时,默认是在系统C盘,目录大概如下:
C:/NXP/bstudio_nxp
configuration
features
jre
msys
p2
plugins
readme
sdk
tools
workspace
bstudio_nxp.exe
上面最重要的是sdk,存放nxp zigbee sdk
workspace 存放我们的工程代码,workspace中工程依赖SDK中代码。该项目采用的是 JN-SW-4170
项目编译
BeyondStudio是基于Eclipse 做的修改,所以操作上类似。
在工程上右键 Clean Project -清理项目 Build Project 编译项目
清理后编译项目比较慢,Java的IDE就这样
项目代码结构
IDE展开视角
JN-AN-1217-Zigbee-3-0-Plug
Includes
Common
JN-SW-4170
Router
Build
Source
工程目录视角
Common
Doc
EndDevice
JN516x
NCI
NFC
NTAG
Router
Includes、Common、JN-SW-4170 都是类似于快捷方式,文件组织目录在JN516x下的.project
<linkedResources>
<link>
<name>Common</name>
<type>2</type>
<location>C:/NXP/bstudio_nxp/workspace/JN-AN-1217-Zigbee-3-0-Plug/Common</location>
</link>
<link>
<name>JN-SW-4170</name>
<type>2</type>
<location>C:/NXP/bstudio_nxp/sdk/JN-SW-4170</location>
</link>
<link>
<name>Router</name>
<type>2</type>
<location>C:/NXP/bstudio_nxp/workspace/JN-AN-1217-Zigbee-3-0-Plug/Router</location>
</link>
</linkedResources>
代码解读
- Makefile
跟常规Makefile一样,需要关注Source目录,Include目录,编译宏选项
板型选择
ifeq ($(JENNIC_CHIP_FAMILY), JN516x)
JENNIC_SDK = JN-SW-4170
ZNCLKCMD = AppBuildZBPro.ld
JENNIC_PCB = DEVKIT4
ENDIAN = BIG_ENDIAN
endif
生成目标
ifeq ($(TARGET),Router)
ifeq ($(OTA_ENCRYPTED),0)
OTA_DEVICE_ID = 0x0101
OTA_STRING = $(OTA_HW)$(OTA_HW_VARIANT)-$(JENNIC_CHIP)00000000000000
else
OTA_DEVICE_ID = 0x1101
OTA_STRING = $(OTA_HW)$(OTA_HW_VARIANT)-$(JENNIC_CHIP)--ENCRYPTED000
endif
endif
编译宏选项
#CFLAGS += -DDEBUG_APP_METERING
CFLAGS += -DDEBUG_APP_SYSTIME
CFLAGS += -DDEBUG_APP
CFLAGS += -DDEBUG_APP_OTA
CFLAGS += -DTRACE_OTA_DEBUG
CFLAGS += -DDEBUG_APP_BDB
CFLAGS += -DDEBUG_APP_EVENT
应用代码路径
APPSRC += pdum_gen.c
APPSRC += pdum_apdu.S
APPSRC += zps_gen.c
APPSRC += app_start.c
APPSRC += app_router_node.c
APPSRC += app_zcl_task.c
APPSRC += app_buttons.c
APPSRC += app_led.c
include 目录
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/ZCL/Include
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/ZCIF/Include
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/Xcv/Include/
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/Recal/Include/
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/MicroSpecific/Include
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/HardwareAPI/Include
- C code
入口函数:
app_start.c -> vAppMain()
/* idle task commences here */
DBG_vPrintf(TRUE,"\n");
DBG_vPrintf(TRUE, "***********************************************\n");
DBG_vPrintf(TRUE, "* SMART PLUG RESET *\n");
DBG_vPrintf(TRUE, "***********************************************\n");
DBG_vPrintf(TRACE_APP, "APP: Entering APP_vSetUpHardware()\n");
APP_vSetUpHardware();
//vAHI_TickTimerRegisterCallback(tick_callback_func);
DBG_vPrintf(TRACE_APP, "APP: Entering APP_vInitResources()\n");
APP_vInitResources();
DBG_vPrintf(TRACE_APP, "APP: Entering APP_vInitialise()\n");
APP_vInitialise();
#if (defined APP_NTAG_ICODE) || (defined APP_NTAG_AES)
DBG_vPrintf(TRACE_APP, "\nAPP: Entering APP_vNtagPdmLoad()");
/* Didn't start BDB using PDM data ? */
if (FALSE == APP_bNtagPdmLoad())
#endif
{
DBG_vPrintf(TRACE_APP, "APP: Entering BDB_vStart()\n");
BDB_vStart();
}
DBG_vPrintf(TRACE_APP, "APP: Entering APP_vMainLoop()\n");
APP_vMainLoop();
时钟初始化、协议栈初始化、设备硬件初始化等。整体的架构还是基于定时器做的,单片机没有多线程的概念,只能不停的轮转任务。
测试方法
测试计量其实需要精度很高的专用设备,由于之前公司没有此类设备,合作工厂也只有一个精度不高的设备,测个大概。一般的测量设备、大功率下温度升高,设备功率就不稳定,所以要想精度高,测试设备也有较高要求
结论
一个基本的模型,精度以及zigbee部分还有很多待优化。之前测试的小米计量插座精度很高。简单做个总结