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