周立功教授新書《面向AMetal框架與接口的編程(上)》,對(duì)AMetal框架進(jìn)行了詳細(xì)介紹,通過(guò)閱讀這本書,你可以學(xué)到高度復(fù)用的軟件設(shè)計(jì)原則和面向接口編程的開(kāi)發(fā)思想,聚焦自己的“核心域”,改變自己的編程思維,實(shí)現(xiàn)企業(yè)和個(gè)人的共同進(jìn)步。經(jīng)周立功教授授權(quán),即日起,致遠(yuǎn)電子公眾號(hào)將對(duì)該書內(nèi)容進(jìn)行連載,愿共勉之。
第九章為BLE&zigbee 無(wú)線模塊,本文內(nèi)容為9.2 zigbee 核心板。
9.2 zigbee 核心板
AW824P2EF 是由廣州致遠(yuǎn)電子有限公司開(kāi)發(fā)的,基于LPC824+JN5161 組合而成的支持Fastzigbee 組網(wǎng)協(xié)議和用戶二次開(kāi)發(fā)的核心板,JN5161 是NXP 半導(dǎo)體公司提供的zigbee 芯片,其支持的頻段為IEEE802.15.4 標(biāo)準(zhǔn)ISM(2.4-2.5GHz)。該模塊最大的特點(diǎn)是具備完整的軟硬件生態(tài)鏈,因此可快速應(yīng)用于工業(yè)控制、數(shù)據(jù)采集、農(nóng)業(yè)控制、礦區(qū)人員定位、智能家居和智能遙控器等場(chǎng)合。
>>> 9.2.1 產(chǎn)品簡(jiǎn)介
AW824P2EF 核心板的特性如下:
-
工作電壓2.1V~3.6V;
-
最大發(fā)射功率20dbm;
-
最大接收靈敏度-95dbm;
-
內(nèi)置zigbee 串口透?jìng)鳎?/p>
-
ARM Cotex-M0+處理器,內(nèi)置8 KB SRAM 和32KB Flash,支持12 位ADC、SPI、I2C 和UART。
AW824P2EF 核心板將無(wú)線產(chǎn)品極其復(fù)雜的通訊協(xié)議集成到內(nèi)置的MCU 中,極大地大幅簡(jiǎn)化了無(wú)線產(chǎn)品復(fù)雜的開(kāi)發(fā)過(guò)程,用戶只需通過(guò)串口就可以對(duì)核心板進(jìn)行配置和透明收發(fā)數(shù)據(jù)。AW824P2EF 核心板共計(jì)35 個(gè)引腳,引腳分布詳見(jiàn)圖9.6,引腳功能描述詳見(jiàn)表9.6。
表9.6 AW824P2EF 核心板引腳功能描述
圖9.6 AW824P2EF 引腳分布圖
為了便于快速開(kāi)發(fā),在AW824P2EF 內(nèi)部已經(jīng)將LPC824 的串口1(PIO0_26 和PIO0_27)與內(nèi)置的zigbee 芯片的串口相連,并將PIO0_28 連接到了ZM5161 的復(fù)位引腳, 示意圖詳見(jiàn)圖9.7 。當(dāng)使用對(duì)AW824P2EF 進(jìn)行二次開(kāi)發(fā)時(shí),需要將LPC824 的PIO0_26配置為串口RX 功能,PIO0_27 配置為串口TX 功能。
圖9.7 硬件連接示意圖
ZB_RST 是ZM5161 的復(fù)位引腳,當(dāng)通過(guò)PIO0_28 管腳輸出大于1us 的低電平信號(hào)時(shí),可以讓核心板可靠地復(fù)位。
在AW824P2EF 中,zigbee 核心板默認(rèn)運(yùn)行的是廣州致遠(yuǎn)電子有限公司結(jié)合多年的行業(yè)應(yīng)用經(jīng)驗(yàn),自主研發(fā)的適合各種工業(yè)領(lǐng)域應(yīng)用的zigbee 協(xié)議棧:Fastzigbee。為與原始芯片JN5161 進(jìn)行區(qū)分,將該zigbee 模塊命名為ZM5161。
>>> 9.2.2 組網(wǎng)應(yīng)用
ZM516x 系列模塊除支持Fastzigbee 協(xié)議外,還可以支持其它多行業(yè)的無(wú)線協(xié)議棧,比如,zigbee Pro、zigbee Pro Home Automation、zigbee Pro Smart Energy、zigbee Pro Light Link、zigbee RF4CE、JenNet-IP 等。AW824P2EF zigbee 模塊默認(rèn)運(yùn)行的是Fastzigbee 協(xié)議棧。Fastzigbee 具有以下特點(diǎn):
-
設(shè)備啟動(dòng)速度、響應(yīng)速度、數(shù)據(jù)傳輸效率出眾;
-
網(wǎng)絡(luò)容量終端節(jié)點(diǎn)數(shù)真正達(dá)到65535 個(gè);
-
終端節(jié)點(diǎn)功耗低至100nA,低于目前100%的zigbee 模塊;
-
支持多級(jí)中繼功能,網(wǎng)絡(luò)具備自調(diào)整、自修復(fù)等特性;
-
支持多路遠(yuǎn)程I/O 和遠(yuǎn)程ADC,支持短地址功能,可隨用戶應(yīng)用自由修改;
-
具有更大的鏈路預(yù)算。
使用ZM516X 模塊搭載的健壯的Fastzigbee 組網(wǎng)透?jìng)鲄f(xié)議網(wǎng)絡(luò),可構(gòu)建多種型態(tài)的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),其最大的特點(diǎn)是實(shí)用性極強(qiáng)、傳輸效率高、性能可靠穩(wěn)定、二次開(kāi)發(fā)簡(jiǎn)單、工程布網(wǎng)靈活,F(xiàn)astzigbee 的網(wǎng)絡(luò)拓?fù)鋱D詳見(jiàn)圖9.8。
圖9.8 Fastzigbee 網(wǎng)絡(luò)拓?fù)鋱D
Fastzigbee 的終端節(jié)點(diǎn)負(fù)責(zé)傳感設(shè)備的數(shù)據(jù)采集,一般是使用電池供電間歇工作,要求設(shè)備功耗很低;Fastzigbee 的路由節(jié)點(diǎn)負(fù)責(zé)信號(hào)的中繼,當(dāng)終端節(jié)點(diǎn)信號(hào)不能直接到達(dá)網(wǎng)關(guān)節(jié)點(diǎn)時(shí),由路由節(jié)點(diǎn)負(fù)責(zé)終端節(jié)點(diǎn)信號(hào)的中繼,路由節(jié)點(diǎn)還有一個(gè)功能是給終端節(jié)點(diǎn)提供多條信號(hào)路徑,保證信號(hào)傳遞的健壯性,路由節(jié)點(diǎn)不能休眠;Fastzigbee 網(wǎng)關(guān)節(jié)點(diǎn)負(fù)責(zé)把終端節(jié)點(diǎn)采集的數(shù)據(jù)上傳到云端服務(wù)器,網(wǎng)關(guān)節(jié)點(diǎn)可使用有線的以太網(wǎng)絡(luò)或無(wú)線3/4G 網(wǎng)絡(luò)傳輸采集數(shù)據(jù)到云端服務(wù)器。組建Fastzigbee 網(wǎng)絡(luò)需配置幾個(gè)重要的參數(shù)。
1. 通道號(hào)
通道號(hào)決定了zigbee 網(wǎng)絡(luò)使用哪個(gè)無(wú)線頻率工作,zigbee 可工作在2.4GHz(全球流行)、868MHz(歐洲流行)、915MHz(美國(guó)流行)3 個(gè)頻段上。2.4GHz 頻段的zigbee 網(wǎng)絡(luò)使用的頻率范圍從2405MHz~2480MHz,共分為16 個(gè)通道,通道號(hào)從11~26,每個(gè)通道的中心頻率間隔是5MHz。同一個(gè)zigbee 網(wǎng)絡(luò)的所有節(jié)點(diǎn)必須工作在同一個(gè)通道,通過(guò)把兩個(gè)不同的zigbee 網(wǎng)絡(luò)分配在不同的通道上,可以把兩個(gè)不同的網(wǎng)絡(luò)物理上隔離,杜絕了兩個(gè)不同網(wǎng)絡(luò)的無(wú)線干擾。
2. 節(jié)點(diǎn)類型
Fastzigbee 網(wǎng)絡(luò)把zigbee 節(jié)點(diǎn)分為兩種類型:終端節(jié)點(diǎn)和路由節(jié)點(diǎn)。終端節(jié)點(diǎn)是負(fù)責(zé)執(zhí)行具體功能的節(jié)點(diǎn),該節(jié)點(diǎn)需要休眠;路由節(jié)點(diǎn)是負(fù)責(zé)信號(hào)的中繼,當(dāng)終端節(jié)點(diǎn)間信號(hào)不可達(dá)時(shí),可通過(guò)加裝路由節(jié)點(diǎn)實(shí)現(xiàn)信號(hào)的中繼,增加無(wú)線的傳輸距離。Fastzigbee 網(wǎng)絡(luò)是一個(gè)對(duì)等網(wǎng)路,所有終端節(jié)點(diǎn)和路由節(jié)點(diǎn)都是對(duì)等的,都能相互收發(fā)數(shù)據(jù),不需要像傳統(tǒng)的zigbee網(wǎng)絡(luò)一樣需要有一個(gè)協(xié)調(diào)器建立網(wǎng)絡(luò),對(duì)等網(wǎng)絡(luò)使網(wǎng)絡(luò)組建更加簡(jiǎn)單、穩(wěn)定可靠。
3. PanID
PanID 為zigbee 的網(wǎng)絡(luò)ID 號(hào),通過(guò)PanID 可以把兩個(gè)不同的zigbee 網(wǎng)絡(luò)區(qū)分開(kāi)來(lái),跟通道號(hào)不同的是,PanID 只是邏輯上把兩個(gè)網(wǎng)絡(luò)區(qū)分開(kāi)來(lái),如果兩個(gè)不同PanID 的網(wǎng)絡(luò)工作在同一個(gè)通道下,也會(huì)造成相互的無(wú)線干擾。
4. 網(wǎng)絡(luò)地址
同一個(gè)zigbee 網(wǎng)絡(luò)下的所有節(jié)點(diǎn)都有一個(gè)唯一的16 位地址,通過(guò)這個(gè)地址標(biāo)識(shí)每個(gè)節(jié)點(diǎn)和進(jìn)行數(shù)據(jù)收發(fā)的尋址。
5. 數(shù)據(jù)發(fā)送模式
zigbee 數(shù)據(jù)發(fā)送模式分為單播和廣播兩種方式。單播是發(fā)送數(shù)據(jù)時(shí)需要指定一個(gè)目標(biāo)網(wǎng)絡(luò)地址,只有這個(gè)目標(biāo)網(wǎng)絡(luò)地址的節(jié)點(diǎn)能接收這個(gè)數(shù)據(jù),廣播是一個(gè)節(jié)點(diǎn)發(fā)送數(shù)據(jù),在同一網(wǎng)絡(luò)下其他所有節(jié)點(diǎn)都能接收這個(gè)數(shù)據(jù)。
>>> 9.2.3 zigbee 初始化
AMetal 平臺(tái)已經(jīng)支持ZM516X 模塊,可以直接使用相應(yīng)的API 完成相關(guān)網(wǎng)絡(luò)參數(shù)的配置與收發(fā)數(shù)據(jù),用戶無(wú)需關(guān)心底層的通信協(xié)議。在使用各個(gè)功能函數(shù)前必須先完成初始化,其函數(shù)原型(am_zm516x.h)為:
該函數(shù)意在獲取ZM516X 模塊的實(shí)例句柄,其中,p_dev 為指向am_zm516x_dev_t 類型實(shí)例的指針,p_devinfo 為指向am_zm516x_devinfo_t 類型實(shí)例信息的指針,uart_handle為與zigbee 模塊通信使用的串口句柄。
-
實(shí)例
定義am_zm516x_dev_t 類型(am_zm516x.h)實(shí)例如下:
其中,g_zm516x_dev 為用戶自定義的實(shí)例,其地址作為p_dev 的實(shí)參傳遞。
-
實(shí)例信息
實(shí)例信息主要描述了與zigbee 模塊相關(guān)的信息,其類型am_zm516x_devinfo_t 的定義(am_zm516x.h)如下:
其中,rst_pin 表示模塊的復(fù)位引腳,以便程序在需要復(fù)位模塊時(shí),通過(guò)該引腳復(fù)位zigbee模塊。在AW824P2EF 中,zigbee 的復(fù)位引腳ZB_RST 與LPC824 的PIO0_28 相連接,因此rst_pin 的值應(yīng)該賦值為PIO0_28。
為了提高數(shù)據(jù)處理的效率和確保接收數(shù)據(jù)不會(huì)因?yàn)檎谔幚硎聞?wù)而丟失,zigbee 模塊的數(shù)據(jù)發(fā)送和接收都需要一個(gè)用于緩存數(shù)據(jù)的緩沖區(qū),緩沖區(qū)的實(shí)際大小由用戶根據(jù)實(shí)際情況指定,建議在256 字節(jié)以上,一般設(shè)置為256 字節(jié)。p_txbuf 和txbuf_size 描述了發(fā)送緩沖區(qū)的首地址和大小,p_rxbuf 和rxbuf_size 描述了接收緩沖區(qū)的首地址和大小。比如,分別定義其大小為256 字節(jié)的緩沖區(qū)供發(fā)送和接收使用:
其中,g_zm516x_txbuf[128]為用戶自定義的數(shù)組空間,供發(fā)送使用,充當(dāng)發(fā)送緩沖區(qū),其地址(數(shù)組名g_zm516x_txbuf 或首元素地址&g_zm516x_txbuf[0])作為實(shí)例信息中p_txbuf成員的值,數(shù)組大小作為實(shí)例信息中txbuf_size 成員的值。同理,g_zm516x_rxbuf[256]充當(dāng)接收緩沖區(qū),其地址作為實(shí)例信息中p_rxbuf 成員的值,數(shù)組大小作為實(shí)例信息中rxbuf_size成員的值。基于以上信息,實(shí)例信息可以定義如下:
其中,g_zm516x_devinfo 為用戶自定義的實(shí)例信息,其地址作為p_devinfo 的實(shí)參傳遞。
-
UART 句柄uart_handle
若使用LPC824 的USART2 與ZM516x 通信,則通過(guò)LPC82x 的USART2 實(shí)例初始化函數(shù)am_lpc82x_usart2_inst_init()獲得UART 句柄作為uart_handle 的實(shí)參傳遞。即:
-
實(shí)例句柄
ZM516X 初始化函數(shù)am_zm516x_init ()的返回值即為ZM516X 實(shí)例的句柄,該句柄將作為其它功能接口函數(shù)的zm516x_handle 參數(shù)的實(shí)參。
其類型am_zm516x_handle_t 類型(am_zm516x.h)定義如下:
若返回值為NULL,說(shuō)明初始化失敗;若返回值不為NULL,說(shuō)明返回了一個(gè)有效的handle。基于模塊化編程思想,將初始化相關(guān)的實(shí)例、實(shí)例信息等的定義存放到ZM516X 的配置文件(am_hwconf_zm516x.c)中,通過(guò)頭文件(am_hwconf_zm516x.h)引出實(shí)例初始化函數(shù)接口,源文件和頭文件的程序范例分別詳見(jiàn)程序清單9.34 和程序清單9.35。
程序清單9.34 ZM516X 實(shí)例初始化函數(shù)實(shí)現(xiàn)(am_hwconf_zm516x.c)
程序清單9.35 ZM516X 實(shí)例初始化函數(shù)聲明(am_hwconf_zm516x.h)
后續(xù)只需要使用無(wú)參數(shù)的實(shí)例初始化函數(shù)即可獲取到ZM516X 的實(shí)例句柄。即:
>>> 9.2.4 zigbee 配置接口
AMetal 提供了10 個(gè)ZM516X 模塊配置相關(guān)的接口函數(shù),用戶可以直接使用這些接口函數(shù)完成zigbee 模塊的配置,詳見(jiàn)表9.7。
表9.7 ZM516X 模塊配置接口函數(shù)
1. 讀取本地配置
該函數(shù)用于讀取當(dāng)前永久配置參數(shù)的信息,其函數(shù)原型為:
其中,p_info 是用于獲取配置信息的指針,am_zm516x_cfg_info_t 為配置信息結(jié)構(gòu)體的類型,包含了ZM516X 模塊所有的永久配置參數(shù)的信息,其定義詳見(jiàn)程序清單9.36。
程序清單9.36 ZM516X 永久配置信息結(jié)構(gòu)
各參數(shù)的詳細(xì)描述詳見(jiàn)表9.8。
表9.8 ZM516X 模塊永久配置參數(shù)描述
讀取 ZM516X 本地配置的范例程序詳見(jiàn)程序清單 9.37。
程序清單9.37 讀取ZM516X 本地配置范例程序
2. 修改本地配置
該函數(shù)用于修改當(dāng)前永久配置參數(shù)的信息,修改后的配置信息在掉電后不會(huì)丟失,其函數(shù)原型為:
其中,p_info 是指向配置信息的指針。在函數(shù)執(zhí)行完畢后,如果要想配置參數(shù)生效,需要執(zhí)行模塊復(fù)位函數(shù)去復(fù)位模塊,讓模塊重新加載新的配置參數(shù)運(yùn)行,修改本地配置的范例程序詳見(jiàn)程序清單9.38。
程序清單9.38 修改ZM516X 本地配置范例程序
3. 模塊復(fù)位
該函數(shù)用于控制ZM516X 模塊產(chǎn)生硬件復(fù)位,其函數(shù)原型為:
復(fù)位函數(shù)讓用戶可以對(duì)模塊執(zhí)行復(fù)位操作,如用戶使用am_zm516x_cfg_info_set()函數(shù)修改配置后,需要執(zhí)行模塊復(fù)位函數(shù),讓模塊復(fù)位后重新加載新的參數(shù)運(yùn)行。模塊復(fù)位的范例程序詳見(jiàn)程序清單9.39。
程序清單9.39 模塊復(fù)位范例程序
4. 恢復(fù)出廠設(shè)置
該函數(shù)用于將ZM516X 模塊的永久參數(shù)恢復(fù)為出廠的默認(rèn)參數(shù),其函數(shù)原型為:
模塊恢復(fù)出廠設(shè)置的范例程序詳見(jiàn)程序清單9.40。
程序清單9.40 恢復(fù)出廠設(shè)置范例程序
5. 設(shè)置通道號(hào)
該函數(shù)用于在系統(tǒng)運(yùn)行過(guò)程中臨時(shí)改變ZM516X 模塊的通道號(hào),其函數(shù)原型為:
該函數(shù)設(shè)置的通道號(hào)僅臨時(shí)有效,模塊重新啟動(dòng)(掉電重啟或軟件復(fù)位)后,該設(shè)置將丟失,模塊會(huì)重新使用永久參數(shù)配置信息中的通道號(hào)。設(shè)置模塊通道號(hào)的范例程序詳見(jiàn)程序清單9.41。
程序清單9.41 設(shè)置模塊通道號(hào)范例程序
6. 設(shè)置目的地址
該函數(shù)用于在系統(tǒng)運(yùn)行過(guò)程中臨時(shí)改變ZM516X 模塊的目的地址,其函數(shù)原型為:
其中,p_zb_addr 是指向目標(biāo)節(jié)點(diǎn)的zigbee 模塊地址的指針,am_zm516x_addr_t 類型定義如下(am_zm516x.h):
其中,p_addr 指向按字節(jié)存放的網(wǎng)絡(luò)地址的緩沖區(qū),addr_size 指定地址的長(zhǎng)度。如目標(biāo)地址為0x2002,則其zigbee 模塊地址可以定義如下:
該函數(shù)設(shè)置的目的地址僅臨時(shí)有效,模塊重新啟動(dòng)后,該設(shè)置將丟失,模塊會(huì)重新使用永久參數(shù)配置信息中的目的地址。設(shè)置模塊目的地址的范例程序詳見(jiàn)程序清單9.42。
程序清單9.42 設(shè)置模塊目的地址范例程序
7. 設(shè)置包頭顯示
ZM516X 模塊提供的是透明的數(shù)據(jù)傳輸通道,如果只有兩個(gè)模塊進(jìn)行通信,就不用關(guān)心接收到的數(shù)據(jù)是從哪個(gè)模塊發(fā)送過(guò)來(lái)的,但如果是接收多個(gè)模塊的數(shù)據(jù),用戶想知道當(dāng)前接收到的數(shù)據(jù)到底是從哪個(gè)模塊發(fā)過(guò)來(lái)的,就可以使用該函數(shù)設(shè)置顯示接收數(shù)據(jù)的來(lái)源,其函數(shù)原型為:
其中,flag 為包頭顯示標(biāo)志,當(dāng)其值為TRUE 時(shí),表示當(dāng)模塊收到一幀數(shù)據(jù)時(shí),數(shù)據(jù)包的前2 個(gè)字節(jié)為數(shù)據(jù)包源節(jié)點(diǎn)的網(wǎng)絡(luò)地址,用戶就可以區(qū)分當(dāng)前接收到的數(shù)據(jù)是從哪個(gè)模塊發(fā)送過(guò)來(lái)的;反之,若值為FLASE,則不會(huì)增加前2 個(gè)字節(jié)來(lái)表示數(shù)據(jù)包源節(jié)點(diǎn)的網(wǎng)絡(luò)地址。該設(shè)置僅臨時(shí)有效,模塊重新啟動(dòng)后,設(shè)置的信息將丟失。設(shè)置模塊包頭顯示的范例程序詳見(jiàn)程序清單9.43。
程序清單9.43 設(shè)置模塊包頭顯示范例程序
8. 進(jìn)入休眠
該函數(shù)用于使ZM516X 模塊進(jìn)入休眠以降低功耗,其函數(shù)原型為:
模塊進(jìn)入休眠后不保存臨時(shí)的參數(shù)配置,通過(guò)復(fù)位模塊函數(shù)可以喚醒模塊。使模塊進(jìn)入休眠的范例程序詳見(jiàn)程序清單9.44。
程序清單9.44 使模塊進(jìn)入休眠范例程序
9. 設(shè)置通訊模式
ZM516X 模塊支持單播(默認(rèn))和廣播兩種通訊模式,使用該函數(shù)可以改變使用的通訊模式,其函數(shù)原型為:
其中,mode 表示通信模式,其類型am_zm516x_comm_mode_t 是枚舉類型,枚舉了所有可能的取值,am_zm516x_comm_mode_t 定義如下:
該函數(shù)設(shè)置的通訊模式僅臨時(shí)有效,模塊重新啟動(dòng)后,該設(shè)置將丟失。設(shè)置模塊通訊方式的范例程序詳見(jiàn)程序清單9.45。
程序清單9.45 設(shè)置模塊通訊方式范例程序
10. 讀取信號(hào)強(qiáng)度
該函數(shù)用于讀取指定地址的節(jié)點(diǎn)與本地節(jié)點(diǎn)之間的信號(hào)強(qiáng)度,用于評(píng)估兩個(gè)節(jié)點(diǎn)間鏈路的質(zhì)量,其函數(shù)原型為:
其中,*p_zb_addr 是指向目標(biāo)節(jié)點(diǎn)的zigbee 模塊地址的指針,p_signal 用于得到信號(hào)強(qiáng)度。讀取模塊信號(hào)強(qiáng)度的范例程序詳見(jiàn)程序清單9.46。
程序清單9.46 讀取模塊信號(hào)強(qiáng)度范例程序
>>> 9.2.5 zigbee 數(shù)據(jù)傳輸接口
數(shù)據(jù)傳輸接口實(shí)現(xiàn)了數(shù)據(jù)的透?jìng)鳎瑪?shù)據(jù)傳輸包含數(shù)據(jù)的發(fā)送與接收,其接口詳見(jiàn)表9.9。
表9.9 ZM516X 數(shù)據(jù)傳輸接口函數(shù)(am_zm516x.h)
3. 發(fā)送數(shù)據(jù)
ZM516X 模塊在參數(shù)配置好后提供給用戶是一個(gè)透明的通道,用戶只需往ZM516X 模塊的串口發(fā)送數(shù)據(jù),模塊就會(huì)把數(shù)據(jù)發(fā)送到配置好的目的地址,AMetal 提供了專門的發(fā)送數(shù)據(jù)接口函數(shù),用戶只需調(diào)用該接口即可完成用戶數(shù)據(jù)的發(fā)送,該函數(shù)原型為:
ZM516X 模塊發(fā)送函數(shù)調(diào)用的是帶有環(huán)形隊(duì)列的串口發(fā)送函數(shù),環(huán)形隊(duì)列的長(zhǎng)度在驅(qū)動(dòng)初始化函數(shù)里定義。發(fā)送的數(shù)據(jù)指針定義為void *,用戶可發(fā)送指定長(zhǎng)度的任意類型的數(shù)據(jù)。
發(fā)送數(shù)據(jù)的范例程序詳見(jiàn)程序清單9.47。
程序清單9.47 發(fā)送數(shù)據(jù)范例程序
4. 接收數(shù)據(jù)
AMetal 也提供了專門的接收數(shù)據(jù)接口函數(shù),用戶只需調(diào)用該接口函數(shù)即可完成用戶數(shù)據(jù)的接收,該函數(shù)原型為:
接收函數(shù)調(diào)用的是帶有環(huán)形隊(duì)列的串口接收函數(shù),用戶需根據(jù)系統(tǒng)的需要在驅(qū)動(dòng)初始化函數(shù)里定義環(huán)形隊(duì)列的長(zhǎng)度。接收函數(shù)存放數(shù)據(jù)的指針定義為void *,可將接收的數(shù)據(jù)放在任意類型的數(shù)據(jù)緩存里。接收數(shù)據(jù)的范例程序詳見(jiàn)程序清單9.48。
程序清單9.48 接收數(shù)據(jù)范例程序
其中一個(gè)模塊配置本地網(wǎng)絡(luò)地址為0x2001,目標(biāo)網(wǎng)絡(luò)地址為0x2002,另一個(gè)模塊配置本地網(wǎng)絡(luò)地址為0x2002,目標(biāo)網(wǎng)絡(luò)地址為0x2001,兩個(gè)模塊間隔1s 發(fā)送一次數(shù)據(jù),然后接收對(duì)方的數(shù)據(jù),將接收到的數(shù)據(jù)打印出來(lái),詳見(jiàn)程序清單9.49。
程序清單9.49 兩個(gè)模塊相互收發(fā)數(shù)據(jù)范例程序
程序中ZM516X 模塊的數(shù)據(jù)接收函數(shù)接收超時(shí)時(shí)間為10ms,snd_tick 累加到100 后,既時(shí)間累加到1s 后調(diào)用一次數(shù)據(jù)發(fā)送函數(shù),向目標(biāo)節(jié)點(diǎn)發(fā)送一次數(shù)據(jù)。
上述應(yīng)用程序?qū)⒈镜鼐W(wǎng)絡(luò)地址配置為0x2001,目標(biāo)網(wǎng)絡(luò)地址配置為0x2002。而另一個(gè)模塊的地址恰恰是相反的,因此另一模塊的程序需要修改程序清單9.49(20 ~ 23)如下:
>>> 9.2.6 應(yīng)用案例
AM824ZB 是廣州致遠(yuǎn)電子有限公司基于AW824P2EF 開(kāi)發(fā)的zigbee 二次開(kāi)發(fā)評(píng)估板。評(píng)估板集成了多種實(shí)驗(yàn)用的電路,如看門狗、蜂鳴器、數(shù)字溫度傳感器、熱敏電阻、按鍵等,方便用戶使用zigbee 進(jìn)行無(wú)線通訊的交互實(shí)驗(yàn)。
AM824ZB 開(kāi)發(fā)套件包括兩塊AM824ZB 開(kāi)發(fā)板、MiniCK100 仿真器和兩根天線用于遠(yuǎn)距離組網(wǎng)應(yīng)用。AM824ZB 開(kāi)發(fā)板的示意圖詳見(jiàn)圖9.9,主控核心為AW824P2EF,詳見(jiàn)廣州致遠(yuǎn)電子有限公司網(wǎng)站(www.zlg.cn)。
圖9.9 AM824ZB 開(kāi)發(fā)板接口分布
其完整資料詳見(jiàn)www.zlg.cn(廣州致遠(yuǎn)電子有限公司)和www.zlgmcu.com(廣州周立功單片機(jī)科技有限公司)網(wǎng)站,索取樣品請(qǐng)聯(lián)系各地辦事處。
基于開(kāi)發(fā)套件中的兩塊AM824ZB 開(kāi)發(fā)板,可以做一個(gè)簡(jiǎn)單的應(yīng)用:通過(guò)獨(dú)立按鍵控制對(duì)方LED0 燈狀態(tài)的翻轉(zhuǎn),每次按鍵按下,對(duì)方LED0 的狀態(tài)就發(fā)生變化(由點(diǎn)亮變?yōu)橄纾蛴上缱優(yōu)辄c(diǎn)亮)。
1. 應(yīng)用程序編寫
為了實(shí)現(xiàn)該應(yīng)用案例,作為簡(jiǎn)單的示例,我們定義,當(dāng)按鍵按下時(shí),發(fā)送一個(gè)字符串“key_pressed”到目標(biāo)節(jié)點(diǎn),當(dāng)目標(biāo)節(jié)點(diǎn)收到“key_pressed”字符串時(shí),翻轉(zhuǎn)LED0。
對(duì)于兩塊模塊來(lái)講,雖然應(yīng)用程序的邏輯是完全一樣的,但是在組網(wǎng)應(yīng)用中,必須為各個(gè)節(jié)點(diǎn)分配不同的網(wǎng)絡(luò)地址,比如,它們的地址分別設(shè)定為0x2001 和0x2002。為此,需要編寫一個(gè)通用的函數(shù),實(shí)現(xiàn)核心的應(yīng)用邏輯,不同之處(比如,本地地址和目標(biāo)地址),通過(guò)參數(shù)指定,詳見(jiàn)程序清單9.50。
程序清單9.50 使用zigbee 實(shí)現(xiàn)LED 控制的應(yīng)用程序范例(app_led_control.c)
在這里,首先根據(jù)參數(shù),完成本地地址和通信目標(biāo)地址的配置,配置完成后,通過(guò)模塊復(fù)位使設(shè)置生效,然后在while(1)主循環(huán)中檢測(cè)是否有按鍵按下,按鍵按下時(shí),則發(fā)送字符串“key_pressed”,接著接收數(shù)據(jù),若接收到“key_pressed”,則翻轉(zhuǎn)本地LED0 的狀態(tài)。
為了便于主程序使用,將其接口聲明到app_led_control.h 文件中,詳見(jiàn)程序清單9.51。
程序清單9.51 應(yīng)用程序接口聲明(app_led_control.h)
2. 主程序編寫
為了便于區(qū)分,特將兩塊板分別稱為A 板和B 板。其中,A 板的網(wǎng)絡(luò)地址為0x2001,目標(biāo)地址為0x2002,詳見(jiàn)程序清單9.52。
程序清單9.52 A 板(網(wǎng)絡(luò)地址為0x2001)主程序
B 板的網(wǎng)絡(luò)地址為0x2002,目標(biāo)地址為0x2001,詳見(jiàn)程序清單9.53。
程序清單9.53 B 板(網(wǎng)絡(luò)地址為0x2002)主程序
-
ZigBee
+關(guān)注
關(guān)注
158文章
2270瀏覽量
242881 -
周立功
+關(guān)注
關(guān)注
38文章
130瀏覽量
37656 -
智能藍(lán)牙
+關(guān)注
關(guān)注
9文章
130瀏覽量
32780
原文標(biāo)題:周立功:zigbee 核心板的應(yīng)用
文章出處:【微信號(hào):ZLG_zhiyuan,微信公眾號(hào):ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論