IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > AT86RF231zigbee的使用一
AT86RF231zigbee的使用一
時間:2016-12-14作者:華清遠見

電路如圖所示:

其中控制芯片使用SAM3S4B,通過SPI格式(單一的SAM3S4B為主端,AT86RE231為從端)與AT86RF231進行通訊,AT86RF231是一款工業級,低電壓供電,超低功耗,方便操作,遵循IEEE802.15.4-2006 硬件標準。AT86RF231將控制信號轉換為zigbee模式的差分對信號,通過2.45Ghz的諧波濾波器2450FB15L0001濾波后接入天線與其余zigbee端點進行通訊,2450FB15L0001主要是對接受到得zigbee信號進行濾波。

Zigbee框架下編譯程序,需要進行些簡單的設置,

因為處與zigbee協議棧框架中,部分源碼被atmel,封裝起來,在man函數中,SYS_sysinit();系統初始化給出.h文件,而沒有具體的C代碼。這意味ZIGBEE的具體結構核心部分不是開源的。實際中SYS_sysinit()在libBc_All_At91sam3s4c_Rf231_Iar.a中,該文件被封裝起來。

其中,對bitcloud編譯生成的是libHAL_Sam3sEkRf2xx_At91sam3s4c_64Mhz_Iar.a。 這里面即便被封住,我們可以進入bitcloud源碼內,解讀代碼,如WTD操作,HAL_InstallInterruptVector(),TimeTick_Configure()還是可以進行代碼解讀的。那對zigbee格式下的函數應該怎樣跟蹤解析代碼:例如pio.h中,PIO_Configure();無法看到C代碼的實現過程。可以鼠標右擊pio.h文件(見下圖1),open containing folder,打開文件夾,找到include中的pio.h文件,可以推測出點C文件如果有,應該存在于source中。進行代碼解讀。


圖1

在下面歷程中,給出協調器和節點的實現。

協調器部分程序:

int main(void)
        {
                //初始化,相關系統配置
                SYS_SysInit();
                ..
                ..
                for(;;)
                {
                        //數據處理
                        ..
                        ..
                        SYS_RunTask();
                }
        }

SYS_SysInit();函數是系統的函數,用來初始化系統的硬件;

SYS_RunTask();是調用zigbee的入口函數,會調用BitCloud協議棧中的用戶應用程序,即APL_TaskHandler();

voidAPL_TaskHandler(void)
        {
                switch (appState)
                {
                        case APP_INITIAL_STATE:
                        initHardware();
                        initNetwork();
                        break;
                        case APP_JOINING_STATE:
                        startNetwork();
                        break;
                        case APP_JOINED_STATE:
                        break;
                        default:
                        break;
                }
        }

APL_TaskHandler();這個函數類似個有限狀態機,是zigbee所處狀態的處理,程序在初始化時static AppState_tappState = APP_INITIAL_STATE;

如果沒有添加入網絡,或者從網絡中斷掉,在主程序每次循環的時候,會添加入網絡,如果是已將處于zigbee網絡中,則處于APP_JOINED_STATE狀態,直接退出APL_TaskHandler()函數。

我們可以看下具體狀態下的子函數;

硬件初始化只是配置個LED,當zigbee網絡正常工作時,led1常亮狀態,否認閃亮。

static void initHardware(void)
        {
                LED_Configure(APP_LED_0);
                LED_Configure(APP_LED_1);
        }

而對協調器的配置是zigbee配置的關鍵部分,下面一段代碼將本身配置為協調器,并在網絡中定義兩個節點。

static void initNetwork(void)
        {
                DeviceType_tdeviceType = DEVICE_TYPE_COORDINATOR; //配置成協調器
                CS_WriteParameter(CS_DEVICE_TYPE_ID, &deviceType);
                boolpredefPANID = true;
                uint16_tnwkPANID = 0x1000;
                CS_WriteParameter(CS_NWK_PREDEFINED_PANID_ID, &predefPANID);
                CS_WriteParameter(CS_NWK_PANID_ID, &nwkPANID);//add by jacky

                // 定義數據節點0
                apsDataReq.dstAddrMode = APS_SHORT_ADDRESS;
                apsDataReq.dstAddress.shortAddress = 0;
                apsDataReq.profileId = APP_PROFILE_ID;
                apsDataReq.dstEndpoint = APP_DATA_ENDPOINT;//0X20
                apsDataReq.clusterId = APP_CLUSTER_ID;
                apsDataReq.srcEndpoint = APP_DATA_ENDPOINT;//0X20
                apsDataReq.asdu = (uint8_t *)sensor_buf;
                apsDataReq.asduLength = sizeof(execute_buf);//傳輸數據
                apsDataReq.txOptions.acknowledgedTransmission = 0;
                apsDataReq.radius = 0;
                apsDataReq.APS_DataConf = apsDataReqConf;

                // 定義數據節點1
                apsDataReq1.dstAddrMode = APS_SHORT_ADDRESS;
                apsDataReq1.dstAddress.shortAddress = 0;
                apsDataReq1.profileId = APP_PROFILE_ID;
                apsDataReq1.dstEndpoint = 0x40;
                apsDataReq1.clusterId = APP_CLUSTER_ID;
                apsDataReq1.srcEndpoint = 0x40;
                apsDataReq1.asdu = (uint8_t *)execute_buf;
                apsDataReq1.asduLength = sizeof(execute_buf);//傳輸數據
                apsDataReq1.txOptions.acknowledgedTransmission = 0;
                apsDataReq1.radius = 0;
                apsDataReq1.APS_DataConf = apsDataReqConf1;

                appState = APP_JOINING_STATE;
                SYS_PostTask(APL_TASK_ID);
        }

初始化結束后會改變appState的狀態,appState = APP_JOINING_STATE; 進行網絡的加入操作,使用SYS_PostTask(APL_TASK_ID);來投遞任務,讓系統再次調用APL_TaskHandler() 去執行case APP_JOINING_STATE進而去執行startNetwork()函數。

startNetwork()創建一個定時器用來控制led的亮滅來表示網絡的連接狀態,在注冊一個網絡連接確認的回調函數。

static void startNetwork(void)
        {
                blinkTimer.interval = BLINK_TIMER_INTERVAL;
                blinkTimer.mode = TIMER_REPEAT_MODE;
                blinkTimer.callback = blinkTimerFired;
                HAL_StartAppTimer(&blinkTimer);
                startNetworkReq.ZDO_StartNetworkConf = ZDO_StartNetworkConf;//回調函數
                ZDO_StartNetworkReq(&startNetworkReq);
        }

回調函數中,主要是判斷zigbee網絡連接,連接成功,關閉定時器和注冊網絡節點。

static void ZDO_StartNetworkConf(ZDO_StartNetworkConf_t* conf)
        {
                HAL_StopAppTimer(&blinkTimer); //add by lht
                if (ZDO_SUCCESS_STATUS == conf->status)
                {
                        appState = APP_JOINED_STATE;
                        // 注冊網絡節點0
                        registerDataEndpointReq.simpleDescriptor = &dataEndpoint;
                        registerDataEndpointReq.APS_DataInd = APS_DataIndData;
                        APS_RegisterEndpointReq(&registerDataEndpointReq);

                        // 注冊網絡節點1
                        registerDataEndpointReq1.simpleDescriptor = &dataEndpoint1;
                        registerDataEndpointReq1.APS_DataInd = APS_DataIndData1;
                        APS_RegisterEndpointReq(&registerDataEndpointReq1);

                }
                else
                {
                        appState = APP_JOINING_STATE;
                }
                SYS_PostTask(APL_TASK_ID);
        }

zigbee數據發送函數:

static void sendDataBlock(unsigned char channel)
        {
                switch(channel)
                {
                        case Sensor:
                        APS_DataReq(&apsDataReq);
                        break;
                        case Execute:
                        APS_DataReq(&apsDataReq1);
                        break;
                        default:
                        break;
                }
        }

zigbee數據接受函數:

static void APS_DataIndData(APS_DataInd_t *ind) //data come from sensor module
        {
                zigbee_in_flag = 1;
                memcpy(&sensor_data[1],ind->asdu, 18);
                sensor_from_address = ind->srcAddress.shortAddress;
        }
        static void APS_DataIndData1(APS_DataInd_t *ind) //data come from excute module
        {
                memcpy(init_data,ind->asdu, 30);
                to_excute_address = ind->srcAddress.shortAddress;
                if(init_data[0] == 0xaa)
                {
                        enable_count = 1;
                        excute_open = 1;
                }
        }

在zigbee的節點函數APL_TaskHandler(),與協調器程序中多的狀態是:離開zigbee網絡,定義的宏是APP_LEAVE_STATE。

voidAPL_TaskHandler(void)
        {
                switch (appState)
                {
                        case APP_INITIAL_STATE:
                    &nbnbsp;   initHardware();
                        initNetwork();
                        break;
                        case APP_JOINING_STATE:
                        startNetwork();
                        break;
                        case APP_JOINED_STATE:
                        break;
                        case APP_LEAVE_STATE:
   &nbsnbsp;                    leaveNetwork();
                        break;
                        case APP_LEAVING_STATE:
                        break;
                        default:
                        break;
                }
        }

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
主站蜘蛛池模板: 联智通达_工控一体机_工业触摸一体机_工业一体机_工业触控一体机_POS机主板_工控主板_国产化主板_RK3588主板厂商-联智通达 | 思沃普智能会议预约管理系统-视频会议管理-信息发布-访客管理-会议运维-会议支持-工位管理系统 | 兰州环氧地坪,兰州防火涂料-甘肃皓天环氧地坪工程 | 江阴月子会所-江阴月子中心-江阴坐月子、月子护理哪家好-乐茵月子中心 | 陕西筱润智能科技有限公司 干部人事智能档案柜 智能密集架 智能档案柜 部队选层文件智能柜 智能枪弹柜 财务智能档案柜 边防武警智能密集架 医院智能档案柜 部队选层文件智能柜智能枪弹柜 学校医院文件柜 企事业单位公检法智能文件柜 生产厂家-筱润智能科技有限公司 RFID射频智能密集架 全自动智能选层档案柜 智能密保柜 枪柜部队营房营具床桌椅办公家具 办公用品档案盒设备货架 全自动智能选层柜生产厂家-筱润智能科技有限公司 | 磨粉设备_雷蒙磨粉机_雷蒙超细磨| 精密铸造,精密铸件,不锈钢铸造,不锈钢铸件-常州鸿雁行机械科技有限公司 | 智能化解决方案 智能家居 家庭影院 灯光音箱 会议室报告厅 剧场剧院 指挥中心 大数据中心_沈阳天哲科技有限公司 | 南京文化墙设计公司,南京包装设计制作印刷,南京PPT设计公司,导视制作公司,企业logo设计 | 途远VR+_成都VR全景制作_成都360全景漫游_成都720全景航拍_成都途远科技有限公司 | 神马影院电影网_实时更新秒播电视剧、电影、动漫的网站 _ 神马影院 | 上饶环亚电脑会计培训学校--电脑学校|上饶电脑学校|上饶电脑培训|会计培训|上饶会计培训|上饶县会计培训|广丰会计培训|玉山会计培训|横峰会计培训|上饶网店培训 上进电缆(嘉兴)股份有限公司官网 - 光伏电缆|防火电缆|电力电缆|铝合金电缆专业生产厂家 | 矿用三环链|锻打/焊接三环链|矿车万能环|三环链销子-济宁卓力工矿设备有限公司 | 涡街流量计罗茨气体涡轮厂家_衡水多元仪表有限公司 | 西安生殖医学医院_陕西省老医协生殖医学医院【官方网站】 | 液晶拼接屏_液晶监视器_液晶广告机_触摸一体机_户外广告机_中亿睿企业官网 | 全铝家居_十大全铝家具品牌_全铝衣柜橱柜——佛山欧格美铝业 | 锂电池破碎生产线|大型电池粉碎机|锂电池分离设备|电池破碎打粉设备-河南鑫恒岩重工科技有限公司 | 郑州空调维修_郑州中央空调维修_空调清洗维保-郑州大晟机电设备安装工程有限公司 | 男装加盟,男装加盟店,男装代理,男装品牌加盟,品牌男装加盟-虎豹男装品牌加盟 | 云南破碎机-制砂机-洗砂机-振动筛-昆明昆重机械厂家 | 实木中药柜,实木中药斗,木制中药柜,木制中药柜的价格,实木中草药柜,安国美佳中药柜厂家 | 水热反应釜厂家_水热反应釜价格_水热合成反应釜批发-仪贝尔仪器 - 水热釜,水热反应釜,水热反应釜厂家,水热反应釜价格,水热反应釜型号,水热反应釜内衬,水热反应釜25ml,水热反应釜50ml,水热反应釜100ml,水热合成反应釜 | 家用油烟净化机_商用餐饮油烟净化器_工业油雾废气处理设备_深圳市宝篮环保 | 亚澳农机-亚澳南阳农机股份公司,旋耕机,旋播机,旋播施肥机,免耕播种机,旋耕播草多用机,果园机械-首页 | 华帝衣柜定制_全屋家具定制_橱柜定制-华帝家居 | 桁架楼承板_钢筋桁架楼承板厂家-山东新材料科技 | 商业地产策划_商业地产代理_华锦亿爵商业地产顾问机构 | 长型材数控钻孔攻牙机-自动数控热熔钻孔机-东莞市利速数控机械有限公司 | 直流屏|青岛直流屏|直流屏电池-世界500强艾默生直流屏标准生产厂家赛里斯能源科技有限公司 | 石家庄UPS_石家庄UPS电源_石家庄广亚电子科技有限公司 | 螺杆式空压机|沈阳螺杆空压机厂家推荐选择沈阳隆瑚机械有限公司 螺带混合机|卧式螺带混合机|双动力混合机-无锡鑫海干燥粉体设备有限公司 | 湖南长沙智能实验室规划设计、整体建设、净化装修、改造施工公司-福临建设 | 吉林省新思路教育发展有限公司| 兰州物流公司_兰州货运公司_兰州物流电话上门取货_兰州立辉物流公司 | 网站建设|营销型网站|独立站搭建|外贸网站建设|wordpress独立站|小程序开发-?无双建站? | 进销存软件|仓库管理软件|库存物资出入库|ERP生产|MRP|易特软件官方网站 | 郑州井盖雨水篦子厂家-建联建材| 射频微波_微波元器件_芯片_电源模块_Raychem_立维创展 | 深圳展厅设计_产业园区展馆设计_展馆设计公司_健康产业展馆设计_展厅设计哪家好_华竣国际 | 瑞安网站建设_网站制作_做网站找瑞安联创网络:专业网页制作、手机网站、SEO百度网站关键字优化 软文营销推广-新闻稿发布-软文撰写-百科词条编辑-品牌全案策划推广网络营销传播-喜尚传媒 |