微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > CC2530做UP智能家居节点源码的分析

CC2530做UP智能家居节点源码的分析

时间:10-02 整理:3721RD 点击:

CC2530做UP智能家居节点源码的分析


数据进入到endpoint后的流向.
以OTA_CMD_GET_NWK_TOPO_REQ 为例.
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
case AF_INCOMING_MSG_CMD:  
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
case OTA_CMD_GET_NWK_TOPO_REQ:  
        HalLedBlink( HAL_LED_1, 2, 50, (1000 / 4) );  
        SampleApp_ProcessGET_NWK_TOPO_REQ();  
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
<span style="white-space:pre">      </span>/*根据gSensorType 等变量构建发送包.并调用  (如果要采集传感器(非中断型)数据可以在这里调用采集函数)  
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
SampleApp_SendNwkData(0x0000, SAMPLEAPP_OTA_NWK_CLUSTERID, data, len); 发送  
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
<span style="white-space:pre">  AF_DataRequest                              </span>*/  
              break;  
ps:温湿度sht11芯片传感器采集函数,对这个系统的osal还不太熟.下次再写一篇分析这个芯片的linux驱动:
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
if(gSensorType == (sensor_t)SENSOR_SHT11){  
  if(GetHumiAndTemp(temp) == 0){            
        data[17]  = temp[0];  
        data[18]  = temp[1];      
        data[19]  = temp[2];  
        data[20]  = temp[3];      
  }  
pss:这个芯片很多人说是i2c接口的.其实它的时序根本不符合i2c规范,它的地址是固定的,它的数据是7位的.所以它根本不能当成i2c设备注册到linux内核,厂家提供的实现驱动中只是模拟它的时序实现读写.
另外,中断型传感器的路由器支持异步发送的:
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
/* comment add by @wei  
* 发生中断则将标志位 置位
*/  
HAL_ISR_FUNCTION(halP12isr,P1INT_VECTOR){  
    if(P1IFG & 0x04)         //中断  
    {  
      gIntFlag = 0x01;  
      HalUARTWrite ( 0, "\rINT2\r", 6 );  
      if(gSensorMode==0x01)  
        osal_set_event(SampleApp_TaskID,SAMPLEAPP_SEND_SENSOR_INT_EVT); //注册中断发送事件  
      Delay(100);     
      P1IFG &= ~(0x04);   
    }  
    P1IF = 0;          //清中断标志  
}  
注册事件后,事件就会加入任务队列:
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )  
{  
    afIncomingMSGPacket_t *MSGpkt;  
    (void)task_id;  // Intentionally unreferenced parameter  
    if ( events & SYS_EVENT_MSG )  
    {  
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
//.......  
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
if ( events & SAMPLEAPP_SEND_SENSOR_INT_EVT )               //中断类型传感器节点注册中断事件后处理函数  
{   
   SampleApp_Process_SENSOR_INT();  
   return ( events ^ SAMPLEAPP_SEND_SENSOR_INT_EVT);  
}  
SampleApp_Process_SENSOR_INT  最终构建并发送了这样一个数据包:
cmd + datalen +nwkaddr +gSensorType +data
1      +1           +2                       +1                    +4
在zigbee网络事件处理中(以下是协调器的处理代码)
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
case OTA_CMD_RPT_SENSOR_STATUS:  
        HalLedBlink( HAL_LED_1, 2, 50, (1000 / 4) );  
        SampleApp_ProcessGET_SENSOR_STATUS_RSP(pkt);  
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
<span style="white-space:pre">          </span>-->SampleApp_BuildAndSendZToolResponse( NODEINFO_CMD_GET_SENSOR_STATUS_RSP, datalen, (pkt->cmd.Data)+2);  
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
break;  
最终 协调器SampleApp_BuildAndSendZToolResponse
构建了这样一个包通过串口发送回去
/*@wei
sof HI_UINT16(callbackID)  LO_UINT16(callbackID) dataLen  data[n]((pkt->cmd.Data)+2)  FCS
*/
ps:"sof" mean start of frame . fcs是某种校验算法算出来的结果.
//end 中断型传感器的路由器支持异步发送
还有一个实际使用中用得到的命令就是OTA_CMD_SET_SENSOR_STATUS_REQ 了. 原理也差不多不做分析.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top