5146|12

3416

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

【SAM R21】WSNDEMO控制个灯 [复制链接]

WSNDEMO里面包含有很多值得看的东西
特别是那个文档AVR2130_LWMesh_Developer_Guide_v1.2.1.pdf
把DEMO讲得比较详细
依靠这个,完全不懂ZigBee的楼主,用按键远程控制了一个LED
特别是第五章 Application Programming,建议能够简单看看
汉化小组依然还是很有必要存在呀
慢慢来看

1、数据结构配置
两块板之间数据的发送和接收都通过AppMessage_t这个结构体进行传递
  1. typedef struct  AppMessage_t {
  2.         uint8_t commandId;
  3.         uint8_t nodeType;
  4.         uint64_t extAddr;
  5.         uint16_t shortAddr;
  6.         uint32_t softVersion;
  7.         uint32_t channelMask;
  8.         uint16_t panId;
  9.         uint8_t workingChannel;
  10.         uint16_t parentShortAddr;
  11.         uint8_t lqi;
  12.         int8_t rssi;
  13.         uint8_t led_flag;
  14.         struct {
  15.                 uint8_t type;
  16.                 uint8_t size;
  17.                 int32_t battery;
  18.                 int32_t temperature;
  19.                 int32_t light;
  20.         } sensors;

  21.         struct {
  22.                 uint8_t type;
  23.                 uint8_t size;
  24.                 char text[APP_CAPTION_SIZE];
  25.         } caption;
  26. } AppMessage_t;
复制代码
撸主新增了一个成员uint8_t led_flag
用于记录LED的状态,其实这个状态是由Router或者End Device的按键SW0进行控制

2、COORDINATOR侧
COORDINATOR用于接收Router或者End Device的数据
所有接收的动作都在appDataInd这个函数中
  1. static bool appDataInd(NWK_DataInd_t *ind)
  2. {
  3.         AppMessage_t *msg = (AppMessage_t *)ind->data;
  4. #if (LED_COUNT > 0)
  5.         //LED_Toggle(LED_DATA);
  6. #endif
  7.         msg->lqi = ind->lqi;
  8.         msg->rssi = ind->rssi;
  9. #if APP_COORDINATOR
  10.         appUartSendMessage(ind->data, ind->size);

  11.         if (APP_CommandsPending(ind->srcAddr)) {
  12.                 NWK_SetAckControl(APP_COMMAND_PENDING);
  13.         }
  14.         if (msg->led_flag)
  15.         {
  16.                 LED_On(LED_DATA);
  17.         }
  18.         else
  19.         {
  20.                 LED_Off(LED_DATA);
  21.         }
  22.        
  23. #endif
  24.         return true;
  25. }
复制代码
楼主新增了一段根据led_flag来判断LED靓妹的代码,就是那段if else

3、Router|End Device侧
所有发送的数据都在appSendData这个函数中
  1. static void appSendData(void)
  2. {
  3. #ifdef NWK_ENABLE_ROUTING
  4.         appMsg.parentShortAddr = NWK_RouteNextHop(0, 0);
  5. #else
  6.         appMsg.parentShortAddr = 0;
  7. #endif

  8.         appMsg.sensors.battery     = rand() & 0xffff;
  9.         appMsg.sensors.temperature = rand() & 0x7f;
  10.         appMsg.sensors.light       = rand() & 0xff;
  11.         if (!Key_Detect)
  12.         {
  13.                 appMsg.led_flag = 1;
  14.                 usart_write_buffer_wait(&usart_instance, "LED ON!!\r\n", sizeof("LED ON!!\r\n"));
  15.         }
  16.         else
  17.         {
  18.                 appMsg.led_flag = 0;
  19.                 usart_write_buffer_wait(&usart_instance, "LED Off!!\r\n", sizeof("LED Off!!\r\n"));
  20.         }
  21.        

  22. #if APP_COORDINATOR
  23.         appUartSendMessage((uint8_t *)&appMsg, sizeof(appMsg));
  24.         SYS_TimerStart(&appDataSendingTimer);
  25.         appState = APP_STATE_WAIT_SEND_TIMER;
  26. #else
  27.         appNwkDataReq.dstAddr = 0;
  28.         appNwkDataReq.dstEndpoint = APP_ENDPOINT;
  29.         appNwkDataReq.srcEndpoint = APP_ENDPOINT;
  30.         appNwkDataReq.options = NWK_OPT_ACK_REQUEST | NWK_OPT_ENABLE_SECURITY;
  31.         appNwkDataReq.data = (uint8_t *)&appMsg;
  32.         appNwkDataReq.size = sizeof(appMsg);
  33.         appNwkDataReq.confirm = appDataConf;
  34. #if (LED_COUNT > 0)
  35.         LED_On(LED_DATA);
  36. #endif
  37.         NWK_DataReq(&appNwkDataReq);

  38.         appState = APP_STATE_WAIT_CONF;
  39. #endif
  40. }
复制代码
同样新增一段if else代码,来根据sw的按下与否,置位led_flag

4、主函数
demo主要运行的代码在wsndemo_main里面
这里对按键进行了初始化
  1. int wsndemo_main(void)
  2. {
  3.         struct port_config Port_con;
  4.         port_get_config_defaults(&Port_con);
  5.         Port_con.direction = SYSTEM_PINMUX_PIN_DIR_INPUT;
  6.         Port_con.input_pull = SYSTEM_PINMUX_PIN_PULL_UP;
  7.         port_pin_set_config(PIN_PA28,&Port_con);
  8.         configure_usart();
  9.         SYS_Init();
  10.        
  11. #if APP_ENDDEVICE
  12.         sm_init();
  13. #endif
  14. #if APP_COORDINATOR
  15.         sio2host_init();
  16. #endif
  17.         cpu_irq_enable();
  18.         while (1) {
  19.                 SYS_TaskHandler();
  20.                 APP_TaskHandler();
  21.         }
  22. }
复制代码
并定义 #define Key_Detect       port_pin_get_input_level(PIN_PA28)
LED其实在这个demo中已经初始化过
只需调用对应LED_On或者LED_Off函数即可
封装好的API就是好用啊

5、显示结果
抛开除电源以外所有的线缆,直接用锂电池供电
直接上GIF了


嗯,先到这
再慢慢试试其他demo


最新回复

AVR2130_LWMesh_Developer_Guide_v1.2.1.pdf,请问楼主这个东西在哪里呢?我下载的文件没有关于demo的讲解。。。只有API说明  详情 回复 发表于 2015-7-8 17:38
点赞 关注(1)
个人签名

So TM what......?

 

回复
举报

3416

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
本帖最后由 ljj3166 于 2015-1-19 23:38 编辑

额,漏了时间的配置了,先抢个沙发
插播 时间配置
没深入理解整个代码流程
不过目测应该是在SYS_TimerInit这个函数中,修改系统通信的时间间隔
默认的是大约1s的样子通信一次
common_tc_delay,改了
通信的时间间隔会小很多
 
个人签名

So TM what......?

 

 

回复

1万

帖子

25

TA的资源

版主

板凳
 
在config.h中,有一个宏APP_SENDING_INTERVAL,定义了发生间隔时间。默认是1S。

点评

是吗?我咋感觉common_tc_delay(SYS_TIMER_INTERVAL*MS[/backcolor])sysTimer.h中有定义[/backcolor] 回头试试config里面的[/backcolor]  详情 回复 发表于 2015-1-19 23:46
 
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

4
 
dcexpert 发表于 2015-1-19 23:43
在config.h中,有一个宏APP_SENDING_INTERVAL,定义了发生间隔时间。默认是1S。


是吗?我咋感觉是sysTimer.c在起作用啊common_tc_delay(SYS_TIMER_INTERVAL*MS
sysTimer.h中有定义
回头试试config里面的


点评

在wsndemo.c中的 APP_TaskHandler(void)函数中,当发送完成后,使用sm_sleep延时,然后通过RTC唤醒。 调用common_tc_delay的位置主要是[/backcolor]SYS_HwExpiry_Cb和SYS_TimerInit,看起来是用于超时保护和  详情 回复 发表于 2015-1-20 00:07
 
个人签名

So TM what......?

 

 

回复

1万

帖子

25

TA的资源

版主

5
 
ljj3166 发表于 2015-1-19 23:46
是吗?我咋感觉是sysTimer.c在起作用啊common_tc_delay(SYS_TIMER_INTERVAL*MS)
sysTimer.h中有定义
回头试试config里面的


在wsndemo.c中的 APP_TaskHandler(void)函数中,当发送完成后,使用sm_sleep延时,然后通过RTC唤醒。
  1. case APP_STATE_SLEEP:
  2.         {
  3.                 sm_sleep(APP_SENDING_INTERVAL / 1000);
  4.                 appState = APP_STATE_WAKEUP;
  5.         }
  6.         break;
复制代码


调用common_tc_delay的位置主要是SYS_HwExpiry_Cb和SYS_TimerInit,看起来是用于超时保护和初始化延时的。它的单位是ms。


点评

刚才看了看,还真是,谢谢提醒  详情 回复 发表于 2015-1-20 12:08

赞赏

1

查看全部赞赏

 
 
 

回复

524

帖子

0

TA的资源

一粒金砂(高级)

6
 
这图片不错,居然把视频做成图片了,

点评

Free Video to GIF Converter加微信小视频,制作很快的  详情 回复 发表于 2015-1-20 12:10
 
 
 

回复

5979

帖子

8

TA的资源

版主

7
 
gif 如何制作的 感觉还是这个方便

点评

Free Video to GIF Converter加微信小视频,短时间的展示用这种比较方便,比上传视频等待审核快捷多了不过长时间的还是得要视频  详情 回复 发表于 2015-1-20 12:11
 
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

8
 
dcexpert 发表于 2015-1-20 00:07
在wsndemo.c中的 APP_TaskHandler(void)函数中,当发送完成后,使用sm_sleep延时,然后通过RTC唤醒。

调用common_tc_delay的位置主要是SYS_HwExpiry_Cb和SYS_TimerInit,看起来是用于超时保护和初始化延时的。它的单位是ms。



  刚才看了看,还真是,谢谢提醒
 
个人签名

So TM what......?

 

 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

9
 
770781327 发表于 2015-1-20 08:31
这图片不错,居然把视频做成图片了,



Free Video to GIF Converter加微信小视频,制作很快的

点评

这个软件不错。  详情 回复 发表于 2015-1-20 17:49
 
个人签名

So TM what......?

 

 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

10
 
chenzhufly 发表于 2015-1-20 09:24
gif 如何制作的 感觉还是这个方便


  Free Video to GIF Converter加微信小视频,短时间的展示用这种比较方便,比上传视频等待审核快捷多了
不过长时间的还是得要视频

 
个人签名

So TM what......?

 

 

回复

1万

帖子

25

TA的资源

版主

11
 
ljj3166 发表于 2015-1-20 12:10
Free Video to GIF Converter加微信小视频,制作很快的



这个软件不错。
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

12
 
楼主你好,请问你有atmel sam r21的学习资料吗?有的话能否分享一下,多谢!
 
 
 

回复

16

帖子

2

TA的资源

一粒金砂(中级)

13
 
AVR2130_LWMesh_Developer_Guide_v1.2.1.pdf,请问楼主这个东西在哪里呢?我下载的文件没有关于demo的讲解。。。只有API说明
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表