概述
1、是否宏定义了NV_RESTORE=1;NV_INIT=1;(协调器、路由器、终端都要定义)定义位置如下
2、下载模式选Erase flash,选择位置:(20201117修正:实际调试发现如果不许选择erase flash 协调器断电重连,连接成功率更高,why?)
3、ZDOInitDevice初始化时,不旁路NV;源代码有按键选择,直接改为0:
if ( 0 )//HalKeyRead() == SW_BYPASS_NV );位置:ZDApp.c 623行
搞了两天这问题;搞得脑壳痛;记录。
用的协议栈版本:
Revised: $Date: 2012-02-16 16:04:32 -0800 (Thu, 16 Feb 2012) $
Revision: $Revision: 29348 $
……………………记录于20210420……………………………………
由于之前在Z-stack 2.5.1a上进行开发遇到协调器掉电后无法恢复网络(panid+1),通过之前以上方法,实现了协调器掉电后可恢复网络。
但后来将协议栈移植到Z-stack mesh 1.0.0,用了以上同样的方法,发现,协调器组网成功后,协调器掉电(路由器不掉)再上电,协调器始终无法组网;
后来比较 z-stack 2.5.1.a:预处理宏定义方面发现了区别;
在2.5.1.a上宏定义如下:
ZIGBEEPRO
ZTOOL_P1
NV_RESTORE=1
NV_INIT=1
xMT_TASK
xMT_SYS_FUNC
xMT_ZDO_FUNC
xLCD_SUPPORTED=DEBUG
而在mesh1.0.0上,如下
ZTOOL_P1
NV_RESTORE=1
NV_INIT=1
后来我将前者宏定义复制到mesh1.0.0;协调器又掉电又可以如入网了;真实奇了个怪,前者只是多了个ZIGBEEPRO,而且我将ZIGBEEPRO注释掉(改为xZIGBEEPRO),重新编译下载协调器也是可以重新入网;两者也是一样的状态;
不知为何,但就是这样。先记录在这。
--------记录于20210526---------Z-stack mesh 1.0.0协议栈下协调器掉电重启问题又解决了
我滴个乖乖,断断续续搞这个zigbee硬是头大;
之前Z-stack mesh 1.0.0版本移植后,协调器是可以掉电重启的,但后边不知改了啥,关键时刻,掉电又无法重启,或重启不太稳定。有时候 PANID自动+1,有时候又正常,除了按照20210420方法,后边又发现,我在 hal_board_cfg.h文件下将 HAL_KEY 宏定义为了FALSE,将其改为TRUE后,其它方法按照之前的调整,协调器掉电问题解决了;如下图。
之前在简化代码时,以为没有用到协议栈提供的IO驱动,所以FALSE掉了KEY,没想到产生了一个意想不到的问题。
------------一起渔-------------
从Z-stack 协议栈在初始化看,整个过程到底发生了什么——>
1 系统上电进入 int main(void)函数,在ZMain下的ZMain.c文件中。-》
2 一系列操作后,进入 osal_init_system();操作系统初始化,在OSAL.c文件下。-》
3 随后进入 osalInitTasks();初始化系统任务,在OSAL_SampleApp.c文件下。-》
4 一系列任务初始化后,进入ZDApp_Init( taskID++ );在ZDApp.c文件下。-》
5 精彩开始了……分析ZDApp_Init(),中文为我添加的说明。
先总结:
1、在ZDAppCheckForHoldKey()中,不要让devState = DEV_HOLD了。特别时你用到了P0的6管脚;
2、在uint8 ZDOInitDevice( uint16 startDelay )中,不要让 if ( zdappHoldKeys == SW_BYPASS_NV )成真了
3、如果NLME_RestoreFromNV返回总是0,尝试下载时勾选:erase flash。
void ZDApp_Init( uint8 task_id )
{
// Save the task ID
ZDAppTaskID = task_id;
// Initialize the ZDO global device short address storage
ZDAppNwkAddr.addrMode = Addr16Bit;
ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR;
(void)NLME_GetExtAddr(); // Load the saveExtAddr pointer.
// Check for manual "Hold Auto Start"
ZDAppCheckForHoldKey();
/*进入按键检查,halGetJoyKeyInput()函数将根据
adc = HalAdcRead (HAL_KEY_JOY_CHN, HAL_ADC_RESOLUTION_8);
也就是:#define HAL_KEY_JOY_CHN HAL_ADC_CHANNEL_6,通道6,对应CC2530端口P0的第6通道的电平来返回按键信息。在应用中若P0第6通道电位没有明确,则返回值存在不确定性。
若运气不好,halGetJoyKeyInput()函数返回值被判定为HAL_KEY_UP(也就是ADC采样值2~38之间)
#define HAL_KEY_SW_1 0x01 // Joystick up
#define HAL_KEY_UP 0x01 // Joystick up
则ZDAppCheckForHoldKey()将返回devState = DEV_HOLD;
if ( zdappHoldKeys == SW_BYPASS_START ){
devState = DEV_HOLD;}
*/
// Initialize ZDO items and setup the device - type of device to create.
ZDO_Init();
// Register the endpoint description with the AF
// This task doesn't have a Simple description, but we still need
// to register the endpoint.
afRegister( (endPointDesc_t *)&ZDApp_epDesc );
#if defined( ZDO_USERDESC_RESPONSE )
ZDApp_InitUserDesc();
#endif // ZDO_USERDESC_RESPONSE
// Start the device?
if ( devState != DEV_HOLD )
{
ZDOInitDevice( 10 );
}
else
{
ZDOInitDevice( ZDO_INIT_HOLD_NWK_START );
// Blink LED to indicate HOLD_START
HalLedBlink ( HAL_LED_4, 0, 50, 500 );
}
/*
系统根据devState状态,进入ZDOInitDevice(),
uint8 ZDOInitDevice( uint16 startDelay )
{
uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;
uint16 extendedDelay = 0;
if ( devState == DEV_HOLD )
{
// Initialize the RAM items table, in case an NV item has been updated.
zgInitItems( FALSE );
}
ZDConfig_InitDescriptors();
//devtag.071807.todo - fix this temporary solution
_NIB.CapabilityFlags = ZDO_Config_Node_Descriptor.CapabilityFlags;
#if defined ( NV_RESTORE )//如果NV_RESTORE 被定义为真,则进入恢复状态
// Hold down the SW_BYPASS_NV key (defined in OnBoard.h)
// while booting to skip past NV Restore.
if (0)//此处之前时根据SW_BYPASS_NV key的值来判断是否进入,由于我们希望不旁路NV,所以将改条件屏蔽掉
{
zdappHoldKeys = 0; // Only once
networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;
}
else
{
// Determine if NV should be restored
networkStateNV = ZDApp_ReadNetworkRestoreState();
…………
注意,返回0表示下一步将读取NV,返回1下一步将重新建立网络
…………
}
if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE )
{
networkStateNV = ZDApp_RestoreNetworkState();
*****
**
# *重点来了:*
**参考:http://blog.sina.com.cn/s/blog_3fb7f7270101iccq.html
*****
}
else
{
// Wipe out the network state in NV
NLME_InitNV();
NLME_SetDefaultNV();
// clear NWK key values
ZDSecMgrClearNVKeyValues();
}
#endif
if ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE )
{
ZDAppDetermineDeviceType();
// Only delay if joining network - not restoring network state
extendedDelay = (uint16)((NWK_START_DELAY + startDelay)
+ (osal_rand() & EXTENDED_JOINING_RANDOM_MASK));
}
// Initialize the security for type of device
ZDApp_SecInit( networkStateNV );
if( ZDO_INIT_HOLD_NWK_START != startDelay )
{
devState = DEV_INIT; // Remove the Hold state
// Initialize leave control logic
ZDApp_LeaveCtrlInit();
// Check leave control reset settings
ZDApp_LeaveCtrlStartup( &devState, &startDelay );
// Leave may make the hold state come back
if ( devState == DEV_HOLD )
{
// Set the NV startup option to force a "new" join.
zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );
// Notify the applications
osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );
return ( ZDO_INITDEV_LEAVE_NOT_STARTED ); // Don't join - (one time).
}
// Trigger the network start
ZDApp_NetworkInit( extendedDelay );
}
// set broadcast address mask to support broadcast filtering
NLME_SetBroadcastFilter( ZDO_Config_Node_Descriptor.CapabilityFlags );
return ( networkStateNV );
}
*/
// Initialize the ZDO callback function pointers zdoCBFunc[]
ZDApp_InitZdoCBFunc();
ZDApp_RegisterCBs();
#if !defined ( ZDP_BIND_SKIP_VALIDATION )
#if defined ( REFLECTOR )
ZDApp_InitPendingBind();
#endif
#endif
} /* ZDApp_Init() */
先更新到这里了,过几天协调器若又抽风恢复不上,解决后再来更新。
最后
以上就是整齐蓝天为你收集整理的zigbee z-stack 协调器断电后,重新上电无法恢复的全部内容,希望文章能够帮你解决zigbee z-stack 协调器断电后,重新上电无法恢复所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复