架構/記憶體/低功耗三者俱全 藍牙Mesh硬體平台挑選有撇步

2018-09-11
藍牙技術聯盟(SIG)公布藍牙Mesh網狀網路規格(Bluetooth Mesh Specifications)已經有一陣子了,在這段期間,許多相關的展覽、活動和研討會陸續舉行,包括在深圳舉辦的2017年藍牙亞洲大會(Bluetooth Asia 2017),以及在東京登場的日本先端電子資訊科技展(CEATEC Japan 2017),而眾多的開發人員與工程師都提出同樣的問題:「該如何替產品或原型(Prototype)選擇正確的藍牙Mesh硬體平台?」

市面上有幾十甚至上百款由不同模組廠商所供應的低功耗藍牙(Bluetooth Low Energy, BLE)晶片和模組,因此很容易就能向製造商或經銷商購得。而隨著藍牙會員企業逐漸採用藍牙Mesh技術,市場很快地將會出現多種多樣的藍牙Mesh硬體平台,供開發人員及工程師選擇。

第一步:選擇合適的架構

嵌入式系統設計的第一步就是選擇適合的架構,以滿足系統的需求或工程目標規格。不同的架構會有不同的優點及限制,以下將架構區分為單一架構或雙重架構兩類進行說明。

分辨單一架構及雙重架構

藍牙Mesh(包括非Mesh的低功耗藍牙解決方案)有單一和雙重晶片/模組架構兩種常見的架構可供選擇(圖1)。單一晶片/模組硬體平台仰賴單一晶片或模組來應付所有任務和系統需求。雙重晶片/模組硬體平台則使用一個主機微控制器(Host MCU),再加上一個藍牙Mesh輔助處理器。輔助處理器是專用於藍牙Mesh通訊的零件。

圖1 比較單一與雙重架構

考慮採用單一晶片/模組

如名稱所示,單一晶片代表系統的應用程式只靠單一晶片或模組來執行,無需額外的處理器來協助運算和任務排程工作,這種方式有時稱為多合一解決方案。

・硬體

至於晶片和模組,尤其是從硬體的角度來看,單一和雙重晶片/模組硬體平台兩者之間有一些設計上的差異。單一晶片通常不包含晶體振盪器(Crystal Oscillator)、開機電路、射頻(RF)耦合和天線,因此開發者必須自行設計電路,再加入客製化設計的按鈕、發光二極體(LED)等。射頻電路設計非常困難,因此設計人員應具備相關背景,最好團隊中有人是這方面的專家。採用單一模組時,廠商或可協助完成射頻電路、射頻耦合、晶片/印刷電路板/外部天線、晶體振盪器以及其他可讓模組運作的必要零組件。開發人員或工程師必須將這個模組裝在主機板上,將VCC和GND連接到相應接腳上(千萬別搞錯否則會冒煙),並且開啟電力,然後加入按鈕和LED等客製化零組,這樣就大功告成了。

・軟體/韌體

不論使用單一晶片或單一模組,都必須參與韌體設計,因為必須將應用程式建置到晶片/模組上,或者也可以選擇將韌體開發的工作委外給承包商或系統整合廠商。

・成本

理論上,單一晶片解決方案應該要比單一模組便宜,因為模組廠商會收取設計及零組件費用。不過,因為晶片和模組的品質各異,成本也大不相同。很重要的一點是,在做出決定之前請多找不同廠商提供報價,才會比出最優惠的價格。

・彈性

使用單一晶片解決方案時,不論硬體或韌體,都可以針對個別的應用程式管理所有設計,比使用模組更具彈性。舉例而言,如果天線或韌體出現Bug,由於無須等待模組廠商回應,便能夠更直接快速修復問題。

是否選擇雙重晶片/模組

這種平台分為主機微控制器和藍牙Mesh輔助處理器兩個部分,如圖2所示。

圖2 雙重晶片/模組架構

在硬體方面,對於手持、可攜式儀器或是計量表、自動控制管理系統、智慧家庭閘道器等裝置來說,整個嵌入式系統設計過程的技術需求可能會十分複雜。在這些系統設計當中,功能的需求不只包含藍牙Mesh等無線通訊,還涵蓋按鍵/按鈕掃描、液晶顯示器(LCD)驅動器、LED閃光燈、蜂鳴器脈波寬度調變(PWM)驅動器、振動器驅動器、電源管理(尤其是電池驅動設備)、感測器訊號的取得和處理,以及其他無線通訊技術支援功能。對於這樣複雜的系統,如果有獨立的藍牙Mesh功能模組,像是分離式的網路輔助處理器(藍牙Mesh輔助處理器),不但可以幫助維持模組系統,也有助於軟體/韌體除錯。

如圖2所示,主機微處理器裡有個介面可以和藍牙Mesh模組進行通訊。這個介面可以是通用非同步收發器(Universal Asynchronous Receiver/Transmitter, UART)或串列周邊介面(Serial Peripheral Interface, SPI)等其他串列通訊協定。這個介面能用於控制指令的互動,還有藍牙Mesh輔助處理器和主機微控制器之間的資料流。主機微控制器能透過這個介面,將指令傳送到輔助處理器,藉此控制輔助處理器在網路中的行為,像是初始配置(Provisioning)、組態、傳送訊息、檢查網路狀態和網路資訊等。同時,輔助處理器也可透過一些非同步事件來通知主機微處理器,例如收到訊息和網路重要更新。

在韌體部分,對於雙重晶片/模組來說,主機微控制器上的應用程式屬於客製化性質,因此主機微控制器上的韌體必須由開發人員與工程師設計。舉例來說,不同的儀器有不同的振動頻率,LED閃光持續的時間長短也不一。可以轉移並重複使用其他設計的開放原始碼。例如,利用某些開放原始碼儲存庫的LCD驅動程式原始碼,但市場上很難找到具有相同的功能性、且可以滿足主機微控制器需求的技術成熟既有硬體平台。請注意,主機微控制器應如圖2所示建置串列協定,因為主機微控制器需要利用這種協定才能和藍牙Mesh輔助處理器通訊。換句話說,必須在主機微控制器上寫入程式碼。

在彈性方面,藍牙Mesh輔助處理器則更具彈性,可提供具備藍牙Mesh功能的藍牙晶片/模組,且技術成熟的模組。選擇具備藍牙Mesh功能的藍牙晶片/模組,就可以定義主機微處理器和輔助處理器之間串列通訊的串列協定。串列協定的指令集可以是AT指令集,或任何想使用的私用指令,然後再遵照選擇或定義的串列協定撰寫韌體程式。看起來很複雜,但優點是可以控制並管理所有軟體/韌體;如果輔助處理器有任何異常現象,很容易就能夠追蹤並進行除錯。

具備藍牙Mesh功能的藍牙晶片/模組適合複雜的嵌入式系統設計,可以自行定義私用的串列協定供主機微處理器和Mesh輔助處理器通訊之用。

有了技術成熟的模組,就能利用模組廠商提供完整的解決方案;不只包含模組,也有能在模組中整合串列協定的韌體。主機微控制器的韌體設計將會需要一份串列協定使用者指南或應用註解,以便與模組進行互動,讓藍牙Mesh輔助處理器依照想要的規格執行任務。有了技術成熟的模組,還要注意主機微控制器的韌體部分。相關程式設計比使用具備藍牙Mesh功能的藍牙晶片/模組負擔更小,但若輔助處理器出現Bug,在廠商發表修正程式之前可能無法解決問題。因此如果選擇這種做法,就必須謹慎評估使用的模組。

第二步:預估記憶體消耗量

評估藍牙Mesh硬體平台的選項時,很重要的是要預估網路組態的記憶體消耗量會帶來多大影響。

微控制器(MCU)主要的功能之一就是資料資訊的處理。為了處理資料,微控制器需要一些容器來儲存這些資料,而這些容器就是記憶體。特定的嵌入式系統設計,例如藍牙Mesh,就是遵循這種原則,但還是有一些特殊案例。

從Friend節點推算RAM配置

在微控制器中,隨機存取記憶體(RAM)主要用來儲存各式各樣的輸入/輸出資料、計算的中間結果、總體變數和陣列、傳遞到函數的C函數參數,以及堆疊(Stack)/堆積(Heap),它的儲存單元可以根據特定需求讀取或重新寫入。不過,RAM只能用來暫時儲存程式和資料,一旦電源關閉或停電,RAM裡面的資料就會遺失。

RAM對於微控制器來說十分重要,對於靠微控制器運作的藍牙Mesh來說尤其重要。在藍牙Mesh的嵌入式設計當中,可能影響RAM的因素之一就是低功耗節點間的關係(Friendship)。

Friendship具備協助支援低功耗節點有效運作的能力;而支援Friend功能且允許該功能運轉的節點,稱為Friend節點。Friend節點能儲存以低功耗節點(LPN)為目的地的訊息,且只在低功耗節點輪詢Friend節點時才傳送這些訊息。Friend節點和低功耗節點之間的關係,就稱為Friendship。

Friend節點會為了它的低功耗節點,將訊息儲存在RAM當中。Friend節點必須配置RAM內的一區來儲存訊息。這時有三項因素會影響RAM的消耗量,包括低功耗節點數量(Friend節點支援的多少低功耗節點數量)、緩衝區數量(針對每個低功耗節點,Friend節點能為它緩衝多少個訊息),以及緩衝區長度(每個訊息應配置多少位元組)。有了這三個關鍵因素,很容易就能算出Friendship關係中某個Friend節點消耗多少位元的RAM(公式1)。

RAM消耗量=低功耗節點數量×緩衝區數量×緩衝區長度 .............................公式1

算出這裡的消耗量,再加上藍牙Mesh堆疊和客製化應用程式所消耗的RAM,開發人員就能估計RAM的大小。

以快閃記憶體做為程式記憶體

程式記憶體包含燒入後寫入的程式,相較於唯讀記憶體(ROM)等其他程式記憶體媒介,目前大部分微處理器都利用快閃(Flash)記憶體做為程式記憶體媒介。快閃記憶體的優點是即使沒電,除了可以留存內容,內容也能加以重寫。現在大部分藍牙功能微處理器都以快閃記憶體做為程式記憶體。

在選擇適當的嵌入式硬體平台的過程中,通常快閃記憶體的大小都在數十個千位元組(KB)到1~2個百萬位元組(MB)之間。在藍牙Mesh應用中,快閃記憶體程式記憶體的功能類似於一般功用的嵌入式應用。藍牙Mesh的差異在於,它能提供無線更新軟體技術(Over-the-Air, OTA)來進行韌體更新。

OTA常用於通用屬性協定(GATT)的低功耗藍牙應用,可能有一種客製化服務和幾種客製化特性是專為OTA所設。在這種情況下,可透過智慧型手機、平板或手持式裝置的低功耗藍牙連線,一個封包接一個封包將韌體影像傳送到需要升級的裝置。因為網路裡可能有數千個節點,這一點對藍牙Mesh來說更為重要。

當廠商或製造商必須推出新版本韌體以修復Bug、新增功能或提升效能,OTA是進行韌體升級的最佳途徑。OTA通常採用以下兩種方法來進行:

第一種方法是,如圖3第一步驟所示,微處理器必須進入開機引導程式(Bootloader)。開機引導程式內含可以與智慧型手機、平板、或手持式裝置功能之類的對等裝置互動的功能。韌體影像分段進入封包,以符合封包的長度限制,並透過低功耗藍牙連線將它們傳送到標的裝置。

圖3 透過開機引導程式,經由OTA提供記憶體影像。

在第二、第三和第四步驟中,開機引導程式接收到一個封包接一個封包的分段式影像,並寫入快閃記憶體的應用程式區。影像下載完畢並通過完整性檢查後,微控制器就能執行快閃記憶體應用程式區裡的程式。到了第五步驟,整個OTA流程就完成了。

第二個方法則如圖4所示,無須觸動微控制器進入開機引導程式(第一步驟),程式可留在應用程式裡,微控制器可繼續運作,擔任藍牙Mesh裡的一個節點。與此同時,微控制器能透過低功耗藍牙連線的GATT介面,與智慧型手機、平板、或其他手持式裝置建立連結,下載新的韌體影像並將該影像儲存在新韌體儲存區(第二至第四步驟)。

圖4 透過應用程式,經由OTA提供記憶體影像。

下載完成後,必須讓微控制器進入開機引導程式,以便檢查影像完整性。成功通過完整性檢查後,開機引導程式就能將新的韌體複製到應用程式區,並將新韌體儲存區刪除。到了最後一個步驟(第六步驟),必須讓微控制器執行新的韌體。

當要選擇使用藍牙Mesh嵌入式硬體平台的零組件,必須決定OTA的方式。接下來,還必須評估微處理器需要多少容量的快閃記憶體。

比較方法一和方法二後會發現,如果使用方法一,程式必須停留在開機引導程式中一段時間。在這段期間,這個節點在藍牙Mesh裡處於離線狀態,但程式記憶體的消耗量就比方法二更為餘裕。

若使用方法二,程式會一直停留在應用程式中,直到完整性檢查和新的韌體複製完成。這兩種作業的進展很快,可以假設OTA執行時節點仍可持續上線。問題是新的韌體儲存區需要更多快閃記憶體,這意味每一個位元組的韌體影像,就需要兩個位元組的快閃記憶體:一個位元組供程式記憶體用,一個位元組則供OTA新韌體儲存用。

有儲存需求採非揮發性記憶體

非揮發性記憶體(NVM)或非揮發性儲存,是一種微處理器記憶體,即使微處理器歷經電力循環或執行不同種類的重設,例如電壓不足(Brown-out)、看門狗(Watchdog)以及外部通用型輸入輸出(GPIO)密碼重設,也能檢索儲存起來的資訊。在藍牙Mesh應用中,可能會因為有持續儲存資料的永久性需求而採用非揮發性記憶體。

針對初始配置,若探討藍牙Mesh所使用的安全金鑰,這些金鑰是由初始配置裝置負責分送,如果已經洩密或有洩密之虞,可以更新安全金鑰。所有金鑰都應該一直儲存在晶片裡的非揮發性記憶體內,不管節點歷經電力循環或重設,甚至是韌體更新,都能載入到應用程式內,這是因為節點必須有這些金鑰才能進行網路通訊和加密。同時,在執行金鑰更新時,過程中必須有兩組金鑰存入非揮發性記憶體,以防無預警發生停電。

透過Friendship,不論Friend節點或低功耗節點重新設定,還是歷經電力循環,每個節點都應該知道彼此。Friend節點應該知道要緩衝誰的訊息,低功耗節點則要知道哪個Friend節點會把訊息輪詢回來。因此,所有與Friendship相關的資訊都應該持續儲存。另外,像單點傳播位址和模型組態資料等重要資訊,則應該儲存在非揮發性記憶體裡。

微控制器常用的非揮發性記憶體有快閃記憶體和電子抹除式可複寫唯讀記憶體(EEPROM)兩種。快閃記憶體和EEPROM的差別在於,晶載快閃記憶體(On-chip Flash)是以頁面為單位寫入/刪除,EEPROM則是以位元組為單位寫入/刪除;晶載快閃記憶體是以頁面為單位讀取,EEPROM則是以位元組為單位讀取;另外,晶載快閃記憶體的容量通常大於EEPROM。

如果想設計手持式初始配置裝置,最好使用晶載快閃記憶體,因為初始配置裝置須要為網路中每個節點儲存大量資料;如果想設計低功耗節點,EEPROM就已經足夠。

第三步:設法降低功耗

若想降低功耗,可以針對所面對的狀況,採取以下所介紹的方式來解決。

嵌入式設計的功耗

對於工程師和開發人員來說,如何降低嵌入式設計的功耗一直是很重要的議題,因為他們必須以最低功耗讓應用程式執行更久的時間,尤其是在耗電量有限制的系統。有了能開發出有效率、只需單一電池即可驅動之架構的優化平台,設計人員就能以最低成本和最高的能源效率,打造出體積更小的電池驅動裝置。

以下是降低一般嵌入式系統功耗的幾個訣竅:關閉UART、積體電路匯流排(I2C)或SPI等未使用周邊裝置的時鐘源、所有未使用接腳必須連結到某個邏輯準位、保持系統時鐘越低越好,但前提是要能符合要求。

調整網路連線參數能大幅減少同步,這種方法很適合用來降低GATT承載層的功耗。

承載層的功耗

如圖5所示,承載層很接近藍牙Mesh架構的底部。承載層是一種通訊系統或協定堆疊,可代表另一個系統或協定堆疊在端點之間傳輸資料。藍牙Mesh有兩種承載層,包括GATT承載層和廣播承載層,而兩種承載層降低功耗的方法不同。

圖5 藍牙Mesh系統架構

GATT承載層能讓不支援廣播承載層的裝置,利用代理協議(Bluetooth Specification Mesh Profile V1.0, Section 6)直接與Mesh節點通訊。至於代理節點,則負責在利用廣播承載層的節點和利用GATT承載層的節點之間轉發Mesh訊息。代理節點支援GATT承載層,能夠與只支援GATT承載層的節點建立連線。代理節點與只有GATT承載層的裝置建立連線後,代理節點就會暴露其Mesh代理服務,而且可能新增Mesh開通服務(這全部都是GATT服務)。

因為採用連線的方式,有兩種連線參數對降低GATT承載層的功耗十分重要。圖6列出了這兩種參數,包括連線間隔與從屬裝置延遲。

圖6 連線間隔與從屬裝置延遲

連線間隔對低功耗藍牙應用來說是一個很重要的參數,指的是兩個對等裝置僅與對方相互傳送與接收資料的特定時間間隔。兩個對等裝置傳送與接收資料的窗口稱為連線事件。如果沒有應用程式資料需要傳送或接收,這兩個對等裝置會交換空白的鏈接層資料封包以維持連線。

從屬裝置延遲這個參數,能提供從屬裝置(鏈接層)跳過多次連線事件的權限,次數則根據連線建立時的從屬裝置延遲所定義。這種功能可提供從屬裝置彈性空間,只在必要時傳送或接收,否則從屬裝置延遲就會暫停。

調整網路連線參數能大幅減少同步,適合用來降低GATT承載的功耗;拉長連線間隔能同時降低兩個裝置的功耗,減少雙方的資料傳輸量。而當周邊裝置閒置時,增加從屬裝置延遲能降低周邊裝置的功耗。

藍牙Mesh有另一個承載層叫廣播承載層。在特定的藍牙Mesh中,這種承載層會利用藍牙通用訪問協定(GAP)廣播和掃描功能,來接收並廣播來自其他節點的訊息。由於是以GAP廣播和掃描為基礎,前面所提到用來降低GATT承載層功耗的方法並不適用於這種承載層。

低功耗功能

另一種可以降低功耗的選項,就是利用低功耗功能,這能讓裝置的接收器在藍牙Mesh內部以極低的任務週期運轉。此外,支援低功耗功能且開通相關功能的節點,稱之為低功耗節點。

低功耗節點的轉換

從圖7可以看出,必須採取幾個步驟以減少接收器的活動,讓微處理器的核心處理器進入休眠模式。在運轉期間,如果低功耗節點的任務排程處於閒置狀態,就會進入休眠模式以節省電力。接下來,低功耗節點會讓接收器進入待命模式以節省電力。

圖7 低功耗節點的運作程序

待命模式下的接收器只會消耗極少電力,但還是可以迅速喚醒。接下來,低功耗節點將會進行以下的反應,包括:在休眠模式期間,讓UART、PWM、SPI或I2C等未用周邊裝置失效;將時鐘源從高頻(例如內建鎖相迴路的外部晶體振盪器)調至低頻(例如內部RC振盪器/32KHz晶體振盪器),這樣就能讓微控制器低速運轉更加省電;開通相關的中斷功能,透過中斷事件喚醒低功耗節點;讓核心處理器進入休眠模式,這時候低功耗節點會進入節能狀態。

低功耗節點還能藉由按鍵點選、感測器讀取警示、振動偵測或間隔計時器等外部中斷事件喚醒,因為它必須傳送訊息到Friend節點,以防Friendship遭到終止。從圖7中可以看到,喚醒低功耗節點後必須採取幾個步驟。

低功耗相關考量

在為廣播承載層選擇藍牙Mesh解決方案,且必須使用低功耗功能時,應留意下列事項:哪一種休眠模式最適合自身的應用程式,因為最新的微處理器都有多種休眠模式,每種的功耗、運算功能和強制退出觸動機制都不一樣;選擇使用哪一種中斷來源來喚醒處於休眠模式的核心處理器;針對有時效性的應用程式,喚醒核心處理器和接收器會花多少時間;時鐘源從休眠模式到趨於穩定所需的等待時間;應用程式處在低功耗模式時,選擇適當的時鐘源,例如內部RC振盪器或外部32KHz晶體振盪器。

建立厚實知識基礎 透過SIG取得支援

只要選擇正確的晶片/模組,了解關鍵的編碼作業、資料保持和OTA因素,同時了解如何降低整個網路的功耗,將更清楚該選擇最適合特定需求的藍牙Mesh硬體平台。一旦選擇晶片/模組後,就可以從晶片廠商取得說明書、推薦的開發環境、原始碼樣本、參考設計以及必須處理的應用註解。如果需要任何協助,也可以聯繫藍牙技術聯盟取得協助與支援。

(本文作者為Bluetooth SIG亞太區開發者關係經理)

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!