cc2530串口通信流程


//串口發送接收流程

main:  //主函數
    ->osal_init_system();  //操作系統初始化
       ->osalInitTasks();    //任務初始化     
          -->ZDApp_Init(taskID++); //該函數初始化后,協調器建立網絡、終端將加入網絡
              -->ZDOInitDevice(0);  //設備初始化
                 -->ZDAPP_NetworkInit(extendedDelay); //網絡初始化
                    -->osal_start_timeEx(....,ZDO_NETWORK_INIT,..) //發送消息
                    -->ZDApp_event_loop()  //事件
                        -->ZDO_StartDevice((uint8)ZDO_Config.............) //開始設備
                            -->NLME_NetworkDiscoveryRequest() 建立網絡
                            -->ZDO_NetworkFormationConfirmCB()  //給予ZDO層發聵信息
 
                                -->osal_set_event(..,ZDO_NETWORK_START)啟動網絡事件   協調器
                                   -->ZDApp_NetworkStartEvt();  //處理網絡啟動事件
                                       -->osal_set_event(....,ZDO_STATE_CHANGE_EVT); //設置網絡狀態改變事件
                                       -->ZDAPP_event_loop();  //網絡改變事件函數
                            
                                -->ZDApp_SendMsg(....,ZDO_NWK_DISC_CNF,...);  //終端、路由器,
                                   -->ZDApp_ProcessOSALMsg()  //請求加入
                                   -->ZDO_JoinConfirmCB()  //終端設備加入網絡
                                       -->ZDApp_SendMsg(...,ZDO_NWK_JOIN_IND,..); 將ZDO_NWK_JOIN_IND事件發生給ZDO層
                                       -->ZDApp_ProcessOSALMsg()
                                           -->ZDApp_ProcessNetworkJoin();  //設備加入網絡
                                              -->osal_set_event(...,ZDO_STATE_CHANGE_EVT);  //終端設備
                                              -->NLME_StartRouteRequest(0,0,false);  //路由器  
                                              -->osal_set_event(...,ZDO_ROUTER_START);
                                          

    ->osal_start_system();  //此時開始執行操作系統,不斷檢測操作系統是否有事件發生,有則跳去執行


zigbee中afIncomingMSGPacket_t結構體描述的是什么?
typedef struct
{
  osal_event_hdr_t hdr;     /* OSAL Message header *///OSAL消息頭
  uint16 groupId;           /* Message's group ID - 0 if not set *///消息組ID
  uint16 clusterId;         /* Message's cluster ID *///消息族ID
  afAddrType_t srcAddr;     /* Source Address, if endpoint is STUBAPS_INTER_PAN_EP,
                               it's an InterPAN message *///源地址類型
  uint16 macDestAddr;       /* MAC header destination short address *///MAC物理地址
  uint8 endPoint;           /* destination endpoint */ //目的端點
  uint8 wasBroadcast;       /* TRUE if network destination was a broadcast address *///廣播地址
  uint8 LinkQuality;        /* The link quality of the received data frame */ //接收數據幀的鏈路質量
  uint8 correlation;        /* The raw correlation value of the received data frame *///接收數據幀的未加工相關值。
  int8  rssi;               /* The received RF power in units dBm *///接收的射頻功率。
  uint8 SecurityUse;        /* deprecated *///棄用
  uint32 timestamp;         /* receipt timestamp from MAC *///收到時間標記。
  afMSGCommandFormat_t cmd; /* Application Data */應用程序數據
} afIncomingMSGPacket_t;    //無線數據包格式結構體

typedef struct
{
  uint8  event;
  uint8  status;
} osal_event_hdr_t;

// Generalized MSG Command Format
typedef struct
{
  uint8   TransSeqNumber;
  uint16  DataLength;              // Number of bytes in TransData
  uint8  *Data;
} afMSGCommandFormat_t;

HalLedBlink(HAL_LED_1, 0, 50, 500);  //0是閃爍次數,但是0表示的是一直閃,不是不閃,50是百分之五十,就是亮滅各一半。500是周期,就是0.5s。



建立網絡、加入網絡流程分析

   協調器節點:在1-10  實驗8 網絡通信實驗2 組播通信中

 while(MSGpkt)  
   {  
     switch(MSGpkt->hdr.event)  
    {  
    case ZDO_STATE_CHANGE:  //建立網絡后,設置事件     
      GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//???????  
      if(GenericApp_NwkState==DEV_ZB_COORD)//把該節點已初始化為協調器,則執行下面的  
      {  
       HalLedBlink(HAL_LED_2,0,50,500);    //LED2 閃爍   
       aps_AddGroup(GENERICAPP_ENDPOINT,&GenericApp_Group);  //建立網路后,加入組。  
       osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,5000);  
      }  
  路由器節點: 在1-10  實驗8 網絡通信實驗2 組播通信中
 while(MSGpkt)  
    {  
      switch(MSGpkt->hdr.event)  
      { 
    case ZDO_STATE_CHANGE:   //加入網絡后,加入族中  
      GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//讀取節點的設備類型   
      if(GenericApp_NwkState==DEV_ROUTER)  
      {  
        aps_AddGroup(GENERICAPP_ENDPOINT,&GenericApp_Group); //加入組中  
      }  
      break;  
終端節點:1-5   實驗4   串口通信2
    while(MSGpkt)  
    {  
      switch(MSGpkt->hdr.event)  
      {  
    case ZDO_STATE_CHANGE:  
      GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//讀取節點的設備類型  
      if(GenericApp_NwkState==DEV_END_DEVICE)  
      {  
        //當中斷節點加入網絡后使用osal_set_envent()函數設置SEND_DATA_EVENT事件,當事件發生時,執行事件處理函數  
        osal_set_event(GenericApp_TaskID,SEND_DATA_EVENT);//??????????????????????????  
      }  
      break; 

而上面的 GenericApp_NwkState是devStates_t GenericApp_NwkState;這樣定義的,用於//保存節點狀態   


[cpp] view plain copy
typedef enum  
{  
  DEV_HOLD,               // Initialized - not started automatically  
  DEV_INIT,               // Initialized - not connected to anything  
  DEV_NWK_DISC,           // Discovering PAN's to join  
  DEV_NWK_JOINING,        // Joining a PAN  
  DEV_NWK_REJOIN,         // ReJoining a PAN, only for end devices  
  DEV_END_DEVICE_UNAUTH,  // Joined but not yet authenticated by trust center  
  DEV_END_DEVICE,         // Started as device after authentication  
  DEV_ROUTER,             // Device joined, authenticated and is a router  
  DEV_COORD_STARTING,     // Started as Zigbee Coordinator  
  DEV_ZB_COORD,           // Started as Zigbee Coordinator  
  DEV_NWK_ORPHAN          // Device has lost information about its parent..  
} devStates_t;  
剛開始時,都是在GenericApp_Init()函數中將GenericApp_NwkState=DEV_INIT。然后再通過哪幾步轉到為上面三種情況DEV_ZB_COORD、DEV_ROUTER、DEV_END_DEVICE中的一種。
TI協議棧是半開源的,網絡層代碼並不開源。運行於端口0的ZDO負責應用層用戶程序和網絡層之間的通信。

網絡層的建立過程是由ZDO來實現的。網絡建立后應用層會接受到ZDO_STATE_CHANGE消息。使用下面語句就可以讀取當前網絡的狀態。

GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//讀取節點的設備類型  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM