完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
zigbee 数据发送周期和设定的周期不一致?
最后结论: 一直以为的硬件问题很可能是软件问题,检查下程序中是否有数组操作溢出错误。 调试现象: 用zigbee组网,协调器和路由器/终端组网后,发现路由器上传到协调器的数据周期并非按照我程序的设定,代码段如下: 周期处理段: > if ( events & SAMPLEAPP_SEND_MSG2DTU_EVT ){ > LED_PIN= !LED_PIN; > SampleApp_RFElecMeter(); > // Setup to send message again in normal period (+ a little jitter) > osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_MSG2DTU_EVT,3089); > // return unprocessed events > return (events ^ SAMPLEAPP_SEND_MSG2DTU_EVT); } 发送段: > void SampleApp_RFElecMeter( void ) { > uint8 msgTable[12]; > > msgTable[0]= 0xA0; > msgTable[1]= 0x0A; > msgTable[2]= 0x0D; > msgTable[3]= 0x50; > msgTable[4]= 0x02; > msgTable[5]= gEmeterMsg.V; > msgTable[6]= gEmeterMsg.I; > msgTable[7]= gEmeterMsg.P; > msgTable[8]=> gEmeterMsg.f; > msgTable[9]= gEmeterMsg.Yita; > msgTable[10]=> gEmeterMsg.Alarm; > msgTable[11]= (uint8)(gEmeterMsg.E>>8); > msgTable[12]= (uint8)(gEmeterMsg.E); > > if ( AF_DataRequest( &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, > SAMPLEAPP_ODV_AMMETER_CLUSTERID, > 13, > msgTable, > &SampleApp_TransID, > AF_DISCV_ROUTE, > AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) > { > } > else > { > // Error occurred in request to send. > } }
原因分析: 1、硬件问题!一定是硬件问题! 于是我测试了电源质量 好家伙,这么大的纹波,再看看给CC2530模块供电的3.3V电源信号质量, 咦,我滴个乖,这不是很好吗?难道是电源纹波对模块的电磁干扰!?管他三七二一,先干了再说,磁阻,电感,电容,电阻,一切能够消减电源纹波的手段全都上了,如下图: 摸着电络铁,呛了几口松香发出老烟……………… 电源质量是改善了,但协调器收到的数据依然是密密麻麻,我t,,。 2、难道不是硬件问题,难道是软件问题?! 于是下载了另一端代码,如下: 周期处理: > if ( events & SAMPLEAPP_SEND_MSG2DTU_EVT ) { > LED_PIN=!LED_PIN; > SampleApp_RoomInfoMessage(); > // Setup to send message again in normal period (+ a little jitter) > osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_MSG2DTU_EVT, > (10000 + (osal_rand() & 0x00FF))); > > // return unprocessed events > return (events ^ SAMPLEAPP_SEND_MSG2DTU_EVT); } 数据发送: > void SampleApp_RoomInfoMessage( void ) { > uint8 msgTable[8]; > > GetRoomMsg(msgTable); > if ( AF_DataRequest( > &SampleApp_SensorGw_DstAddr, &SampleApp_epDesc, > SAMPLEAPP_ROOM_CHECK_CLUSTERID, > 8, > msgTable, > &SampleApp_TransID, > AF_SKIP_ROUTING, > AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ) > { > } > else > { > // Error occurred in request to send. > } } 可以,正常发送周期发送啊?什么情况。 3、转角处的发现: 此时身体略微有些疲软,深吸一口气再切换到原来代码、编译,突然, build框中一个“金叹号”闪过,并被我注意,如下图: 什么意思,out of range,直觉告诉我此处有鬼并且不一般;凭着我小学二年级的拼音能力,我找到了原因。 ——定义的数组溢出了! ——定义的数组溢出了! ——定义的数组溢出了! 你看到了吗? 解决问题: 经过上面一顿猛如虎的操作,我拖着略显疲惫但激动万分的心情………… 我将 uint8 msgTable[12]改为了uint8 msgTable[13]; 顿时,真个世界都有序而美好了。 真是应验了唐朝李白的一首诗,《转角遇见爱》 额外的发现。。。。 再排除硬件过程中,我本计划用RC滤波将电源高频干扰去除,结果导致CC2530模块直接无法工作,万用表测量电压也是3.3V正常,但示波器,测试电源却发现,如下现象: 原因分析:zigbee在发射时会有较大瞬时功耗,如果此时电源环路阻抗过大将导致能量供应不足进而发送失败。 解决办法就是,提高供电回路供电能力减小阻抗。 ——————在两外一个项目中我将 CH340C做和CC2530做在一起,并用供电能力只有100mA的LDO进行供电,当插入USB口后,电脑无法识别,正是由于次原因。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9000 浏览 16 评论
4051 浏览 18 评论
1109浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2302浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 13:14 , Processed in 0.845101 second(s), Total 77, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号