前言
兄弟們,我發現一個有意思的東西,我在愛智官網翻資料的時候,發現他們終於終於把官網文件的索引優化了!有一說一,真是方便不少,終於不再是一堆文件糊在一坨了。
另外我還發現他們居然做了一個EFR32的教程 我去年就很想搞一個來玩的,但是網上資料太少了,難搞的一逼,於是簡單弄了一下後就丟一遍吃灰去了。現在終於可以回過頭把EFR32撿起來了。
配置 Simplicity Studio 可能遇到的問題
關於 Simplicity Studio 介紹和簡單教程可以看看我去年寫的《基於EFR32的Zigbee開發-自定義Cluster》 ,接下來就是跟著官方的EFR32的教程 配置一下,我跟著做了一遍,完全可以,但是有很多細節一定要注意,很容易忽略。
首先是編譯過程中出現出現各種找不到檔案,搜尋這些檔案的時候發現都是IDE目錄下的檔案,最後檢視Makefile列印的時候發現,報錯的編譯資訊的路徑都是“./xxx/xxx”開頭,看了一下這個./實際上是 workspace 資料夾所在的地址,也就是說編譯的時候它是以workspace所在的地址為根目錄去IDE裡面的檔案,也就是說必須把 workspace 和 IDE 塞一個資料夾裡面。沒見過這麼奇怪的做法。
編譯提示各種巨集缺少的時候,看看缺少的巨集是什麼巨集,看上去像各種功能相關的,那大概率是 ZCL Clusters 那邊勾選出了問題,如果看上去是各種硬體的巨集報錯,那就檢查一下硬體配置。
ZCL Clusters 這裡是配置一些命令和通道之類的東西,在下一個章節我在細說。
在這配置硬體相關的東西,注意右側紅框內的東西,比較容易被忽略,需要根據你板子實際情況選擇。
配置 ZCL Clusters
官方教程中使用了基於 ZigBee HA 修改出了自己的一個規範,也給了一個XML檔案給大家做一個參考,而這個 XLM 檔案其實就是 ZDDC 裝置端的關鍵。這裡需要我們去官方教程中複製文件最下面的 XML 程式碼 :
<configurator>
<domain name="acoinfo" />
<cluster>
<name>acoinfo_aio</name>
<domain>acoinfo</domain>
<description>Acoinfo custom cluster</description>
<code>0x000C</code>
<define>ACOINFO_ZB_AIO_CLUSTER</define>
<client init="false" tick="false">true</client>
<server init="false" tick="false">true</server>
<attribute side="server" code="0x2000" define="ACOINFO_ZB_AIO_ATTR_1"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_1</attribute>
<attribute side="server" code="0x2001" define="ACOINFO_ZB_AIO_ATTR_2"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_2</attribute>
<attribute side="server" code="0x2002" define="ACOINFO_ZB_AIO_ATTR_3"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_3</attribute>
<attribute side="server" code="0x2003" define="ACOINFO_ZB_AIO_ATTR_4"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_4</attribute>
<attribute side="server" code="0x2004" define="ACOINFO_ZB_AIO_ATTR_5"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_5</attribute>
<attribute side="server" code="0x2005" define="ACOINFO_ZB_AIO_ATTR_6"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_6</attribute>
<attribute side="server" code="0x2006" define="ACOINFO_ZB_AIO_ATTR_7"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_7</attribute>
<attribute side="server" code="0x2007" define="ACOINFO_ZB_AIO_ATTR_8"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_AIO_ATTR_8</attribute>
</cluster>
<clusterExtension code="0x0006">
<attribute side="server" code="0x2000"
define="ACOINFO_ZB_DIO_ATTR_1"
type="BOOLEAN" min="0x00" max="0x01" writable="true"
default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_1</attribute>
<attribute side="server" code="0x2001"
define="ACOINFO_ZB_DIO_ATTR_2"
type="BOOLEAN" min="0x00" max="0x01" writable="true"
default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_2</attribute>
<attribute side="server" code="0x2002"
define="ACOINFO_ZB_DIO_ATTR_3"
type="BOOLEAN" min="0x00" max="0x01" writable="true"
default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_3</attribute>
<attribute side="server" code="0x2003"
define="ACOINFO_ZB_DIO_ATTR_4"
type="BOOLEAN" min="0x00" max="0x01" writable="true"
default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_4</attribute>
<attribute side="server" code="0x2004"
define="ACOINFO_ZB_DIO_ATTR_5"
type="BOOLEAN" min="0x00" max="0x01" writable="true"
default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_5</attribute>
<attribute side="server" code="0x2005"
define="ACOINFO_ZB_DIO_ATTR_6"
type="BOOLEAN" min="0x00" max="0x01" writable="true"
default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_6</attribute>
<attribute side="server" code="0x2006"
define="ACOINFO_ZB_DIO_ATTR_7"
type="BOOLEAN" min="0x00" max="0x01" writable="true"
default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_7</attribute>
<attribute side="server" code="0x2007"
define="ACOINFO_ZB_DIO_ATTR_8"
type="BOOLEAN" min="0x00" max="0x01" writable="true"
default="0x00" optional="true">ACOINFO_ZB_DIO_ATTR_8</attribute>
</clusterExtension>
<clusterExtension code="0x0300">
<attribute side="server" code="0x2000" define="ACOINFO_ZB_DIO_ACTIVE_T_ATTR"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_DIO_ACTIVE_ATTR</attribute>
<attribute side="server" code="0x2001" define="ACOINFO_ZB_DIO_WRITE_T_ATTR"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_DIO_WRITE_ATTR</attribute>
<attribute side="server" code="0x2002" define="ACOINFO_ZB_AIO_ACTIVE_T_ATTR"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_AIO_ACTIVE_ATTR</attribute>
<attribute side="server" code="0x2003" define="ACOINFO_ZB_AIO_WRITE_T_ATTR"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_AIO_WRITE_ATTR</attribute>
<attribute side="server" code="0x2004" define="ACOINFO_ZB_MEM_ACTIVE_T_ATTR"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_MEM_ACTIVE_ATTR</attribute>
<attribute side="server" code="0x2005" define="ACOINFO_ZB_MEM_WRITE_T_ATTR"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_MEM_WRITE_ATTR</attribute>
</clusterExtension>
<clusterExtension code="0x0500">
<attribute side="server" code="0x2000"
define="ACOINFO_ZB_MEM_ATTR_1"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_1</attribute>
<attribute side="server" code="0x2001"
define="ACOINFO_ZB_MEM_ATTR_2"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_2</attribute>
<attribute side="server" code="0x2002"
define="ACOINFO_ZB_MEM_ATTR_3"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_3</attribute>
<attribute side="server" code="0x2003"
define="ACOINFO_ZB_MEM_ATTR_4"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_4</attribute>
<attribute side="server" code="0x2004"
define="ACOINFO_ZB_MEM_ATTR_5"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_5</attribute>
<attribute side="server" code="0x2005"
define="ACOINFO_ZB_MEM_ATTR_6"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_6</attribute>
<attribute side="server" code="0x2006"
define="ACOINFO_ZB_MEM_ATTR_7"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_7</attribute>
<attribute side="server" code="0x2007"
define="ACOINFO_ZB_MEM_ATTR_8"
type="INT32U" min="0x00000000" max="0xFFFFFFFF" writable="true"
default="0x00000000" optional="true">ACOINFO_ZB_MEM_ATTR_8</attribute>
</clusterExtension>
</configurator>
然後儲存到一個空的文件中並另存為 XML 格式,然後將這個這個XML檔案放入:
\v4\developer\sdks\gecko_sdk_suite\v2.7\app\zcl
資料夾下,在 ZigBee Stack 中新增 XML 檔案後就能發現 ZCL Clusters 中多了一些東西。
這裡是設定模型 ID 和製造商名字什麼的。
這裡設定了對應的通道是什麼功能,截圖中的的意思就是,DIO通道1和DIO通道2分配為燈的開關。
這是最蛋疼也是最有欺騙性的地方 官方設定 :
Cluster ID :0x0300 為本規範定義的通用屬性,Attribute ID 0x2000-0x2005 為 6 個屬性,型別為
uint32,只讀
而原本的 0x0300 是被佔用了的,官方這麼玩的話,這個通用屬性就會跑到顏色那一欄去,而這個通用屬性,實際上是管理通道有效性的,上圖代表:通道 1 和通道 2 有效並且可讀可寫。
這次的程式碼我用的就是官方的程式碼,他們說得很詳細了,我就不重複一遍了。
總結
配置完成將程式碼燒入 EFR32 開發板 ,通過我們新的嗅探器傳送 dio0/1 :true/false 就可以控制我們的LED:PC0/PC1了。