SDK和Softdevice的區別是什么?怎么選擇SDK和softdevice版本?芯片,SDK和softdevice有沒有版本兼容問題?怎么理解SDK目錄結構?SDK幫助文檔在哪里?Softdevice幫助文檔在哪里?如何選擇某個SDK例子 (example) 以開始我們的BLE開發之旅?本文將對以上問題進行解答。
Nordic目前有2套完全獨立的SDK:nRF5 SDK和nRF Connect SDK。一般來說,開發nRF51/52產品推薦使用nRF5 SDK,開發nRF91/nRF53等新產品推薦使用nRF connect SDK。本文將對nRF5 SDK進行介紹,從形式上來說,nRF5 SDK其實就是一個產品壓縮包,如下所示,其官網下載地址為:https://www.nordicsemi.com/Software-and-Tools/Software/nRF5-SDK/Download#infotabs。
除了nRF5 SDK,Nordic還針對某些特殊應用領域推出了一些專門的SDK,這些SDK和nRF5 SDK采用了相同的軟件架構,相同的驅動和庫,以及相同的編碼風格。對開發者來說,只要熟悉了nRF5 SDK,這些特殊SDK上手也會比較快。Nordic提供了如下種類的特殊SDK:
- nRF5 SDK for Mesh,用於開發藍牙Mesh應用
- nRF5 SDK for Thread and ZigBee,用於開發ZigBee應用或者Thread應用
- nRF SDK HK,用於開發蘋果homekit應用
- Thingy SDK,用於開發Nordic Thingy傳感器套件
- nRFready Smart Remote 3,用於開發藍牙語音電視機遙控器
- nRFready Desktop 2,用於開發藍牙或者2.4G的無線鍵盤和鼠標
如果你的應用是上面6種垂直應用,那么建議你選擇上面的SDK,否則一律推薦使用nRF5 SDK。下面將對nRF5 SDK進行闡述。
1. nRF5 SDK和Softdevice概述
1) nRF5 SDK是Nordic nRF51/52系列產品軟件開發環境,Softdevice是Nordic藍牙協議棧的名稱,為了方便用戶的使用,每一個版本的SDK都包含了該版本支持的所有softdevice,請到SDK根目錄\components\softdevice目錄查看具體支持的softdevice類別和版本。SDK官網下載地址為:https://www.nordicsemi.com/Software-and-Tools/Software/nRF5-SDK/Download#infotabs。
2) nRF5 SDK版本編號,nRF51 SDK v9.0.0,nRF51 SDK v10.0.0,nRF5 SDK v11.0.0, nRF5 SDK v12.0.0 …目前最新版是nRF5 SDK v16.0.0。SDK9/10只支持nRF51系列芯片,SDK11/12同時支持nRF51和nRF52系列芯片,而SDK13/14/15/16只支持nRF52系列芯片。這里順帶提一下,如果你需要使用多個版本nRF5 SDK,那么就會同時用到多個device family pack(nRF MDK),請按照低版本先裝高版本后裝的順序來安裝(如果SDK例程報device family pack錯誤,請先完全卸載之前的device family pack,再按照由低到高的順序重裝一遍所有的pack)
3) Nordic一般推薦使用最新版的SDK來開發你的應用,因為其功能最強大,考慮最周全,可靠性最好。比如nRF51系列,推薦使用SDK12.3.0(12.3.0已經是nRF51能支持的最高版本SDK了),nRF52系列推薦使用SDK16.0.0。但是最新版的SDK占用的Flash資源和RAM資源比較多,而且新版SDK為了兼容各種情況設計得也比較復雜。為了節省資源或者讓應用看起來簡潔,客戶也可以使用某些老版本的SDK。對於老用戶來說,要不要升級SDK,是一個老生常談的問題,我的建議是:測試為王,只要你的應用測試下來沒有任何問題,你的SDK就是穩定和可靠的,就不需要升級SDK。當然,如果你要加入新SDK的功能和特性,那么就需要升級SDK了。請打開SDK根目錄\documentation\release_notes.txt以查看最新版SDK的新功能和新特性。
4) Softdevice命名規則一。Softdevice包括兩種底層協議棧:BLE和ANT,BLE包括兩種角色:central(又稱master)和peripheral(又稱slave),為此需要給這些不同類型的協議棧進行命名區分。協議棧命名格式為Sxyz,其中
- x – 表示協議棧的類型,1表示BLE協議棧,2表示ANT協議棧,3表示同時支持BLE和ANT
- y – 表示BLE角色,1表示從設備,2表示主設備,3表示同時支持主設備和從設備
- z – 表示芯片類型,0表示nRF51系列,2表示nRF52系列
- 比如S110,表示只支持從設備模式的nRF51 BLE協議棧
- 比如S130,表示既支持從設備模式又支持主設備模式的nRF51 BLE協議棧
- 比如S132,表示既支持從設備模式又支持主設備模式的nRF52 BLE協議棧
- 比如S212,表示nRF52 ANT協議棧
- 比如S332,表示nRF52既支持BLE協議棧又支持ANT協議棧,而且BLE協議棧既支持從設備模式又支持主設備模式
5) Softdevice命名規則二。大體上跟命名規則1相同,但是協議棧編號最后2位跟芯片型號一樣,比如S140,代表這個協議棧專門用於nRF52840。由於52840 Flash空間很大,沒有必要做各種細分的協議棧,S140協議棧是一個大而全的協議棧,包含藍牙所有功能。
6) Softdevice版本編號,從1.0.0開始編號,然后2.0.0,3.0.0,…S110最新版本是8.0.0,S130最新版本是2.0.1,S132/S140/S112最新版本是7.0.0。
7) SDK和softdevice兼容性問題。不要查看兼容性表格,直接打開SDK,直接使用SDK里面的softdevice,肯定沒有問題。比如S132 在SDK如下文件夾中:
有時候你在Nordic官網下載SDK的時候,比如SDK15.2.0,官網會自動綁定一個比SDK安裝目錄里面自帶的協議棧版本更高版本的協議棧,如下圖所示:
那么這個時候推薦使用該綁定的高版本協議棧,原因如下:
再完美的協議棧難免也會有bug,此時Nordic會把bug修復的協議棧單獨發布出來,比如nRF5 SDK 15.2.0自帶的S140協議棧版本為6.1.0,一般來說,直接用這個版本的協議棧就可以了,但是這個版本的協議棧的主機模式有一個小bug,為此Nordic單獨發布了6.1.1版S140協議棧,此時用戶就需要去官網單獨下載這個最新版的協議棧了。記住,大家只需要下載版本號數字最后一位有變化的即可,比如6.1.1相比6.1.0,最后一個數字有升級,那么推薦大家直接下載下來,然后覆蓋原來老的協議棧即可。如果版本號第1個數字就有變化,意味着兩個版本的協議棧是不兼容的,此時一般SDK也會跟着升級的,比如7.0.0相比6.1.0,這個就屬於大升級了,此時建議直接使用與之配套的最新版本SDK來進行開發,而不是把協議棧進行簡單覆蓋。(當然,你也可以自己把7.0.0的協議棧移植到老SDK中,這個稍微麻煩一些,不過Nordic也有相關移植文檔供大家參考)。如下列出了常用協議棧的發布頁面:
- S140協議棧最新版本查詢頁面:https://www.nordicsemi.com/Software-and-Tools/Software/S140/Download#infotabs
- S132協議棧最新版本查詢頁面:https://www.nordicsemi.com/Software-and-Tools/Software/S132/Download#infotabs
- 其他類型協議棧,比如S130, S112,S110等,請按照上述方式自己去尋找相應下載頁面。
8) 芯片版本和SDK版本兼容性問題。如果你使用的是Nordic最新版芯片,就沒有這個所謂的兼容性問題,直接下載最新版本的SDK即可。如果你不幸還有Nordic老版本芯片庫存,那么只能使用某些老版本的SDK,具體請參考兼容性表格。
- nRF52840兼容性表格:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcomp_matrix_nrf52840%2FCOMP%2Fnrf52840%2FnRF52840_ic_rev_sdk_sd_comp_matrix.html&cp=4_0_3_2
- nRF52832兼容性表格:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcomp_matrix_nrf52832%2FCOMP%2Fnrf52832%2Fic_rev_sdk_sd_comp_matrix.html&cp=4_2_2_2
- nRF52810兼容性表格:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcomp_matrix_nrf52810%2FCOMP%2Fnrf52810%2FnRF52810_ic_rev_sdk_sd_comp_matrix.html&cp=3_3_2_2
- nRF52811兼容性表格:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcomp_matrix_nrf52811%2FCOMP%2Fnrf52811%2Fnrf52811_ic_rev_sdk_sd_comp_matrix.html&cp=3_2_2_2
之所以會有這個兼容性問題,是因為新版本SDK是為新版本芯片服務的,也就是說新版本SDK默認芯片以前的bug已經修復了,所以新版本SDK不會包含老版本芯片的workaround(補丁),導致老版本芯片運行在最新版本SDK上會有一些問題。
2. nRF5 SDK目錄結構解讀
欲下載nRF5 SDK,請參考“Nordic nRF51/nRF52開發環境搭建”
以SDK12.3.0為例,nRF5 SDK目錄結構如下所示:
-components. 該目錄包含了Nordic自己開發的SDK源代碼,切記:在產品開發過程中,不要去修改該目錄下的任何文件!components目錄結構如下所示:
這里特別說明一下,Nordic現在有2套芯片外設驅動,SDK14及以前版本SDK使用nrf_drv老版本外設驅動(又稱legacy),SDK15使用nrfx新版本外設驅動(nrfx驅動同時兼容nRF5 SDK和nRF Connect SDK),在SDK15中,nrfx驅動源代碼在如下目錄:
-examples. 該目錄包含了豐富的應用示例,不僅包含BLE應用示例,也包含每個外設如何使用的示例,還包含bootloader示例代碼。一般來說,開發過程中碰到的大部分問題,都可以在這個目錄找到示例。examples目錄結構如下所示:
客戶用得最多的兩個目錄是:\ble_peripheral和\peripheral。\ble_peripheral目錄包含了BLE作為從模式的應用示例,而\peripheral包含了所有外設應用示例。\ble_peripheral目錄結構如下所示:
\peripheral目錄結構如下所示:
在Nordic SDK中,經常會碰到deprecated和experimental目錄,他們的作用如下:
\deprecated,該目錄的內容已被舍棄,並有新版本來替代他們。但為了兼容老產品,SDK還是將其保留下來,比如如下目錄:components\drivers_nrf\twi_master\deprecated,如果你是新用戶,切記不要使用\deprecated目錄下的API。
\experimental 。SDK不斷的有new feature/new example出現,有些new feature/new example推出來不久,還沒有經過市場大規模驗證,對此Nordic會在這些new feature/new example前面加一個前綴:experimental,比如:examples\ble_peripheral\experimental_ble_app_buttonless_dfu,碰到experimental一定要小心,里面有可能有bug,希望用戶自己進行充分測試,以保證產品的質量。
3. nRF5 SDK和softdevice幫助文檔
1) 不管是SDK還是softdevice自有 API,建議首先查看SDK自帶的API說明,記住:API說明一般都放在頭文件中,而不是.c文件中,里面有該API詳細說明和使用注意事項。比如softdevice_enable() API相關說明在頭文件softdevice_handler.h中:
再比如sd_ble_gatts_hvx API說明文檔在頭文件ble_gatts.h中:
再比如ble_advertising_init API說明文檔在ble_advertising.h中:
2) Softdevice還有一份專門的spec,來闡述softdevice工作原理,資源占用情況,性能參數,使用注意事項等,建議大家一定要閱讀該份spec:
- S140 spec:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsds_s140%2FSDS%2Fs1xx%2Fs140.html&cp=3_4_2_0
- S132 spec:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsds_s132%2FSDS%2Fs1xx%2Fs130.html&cp=3_4_1_0
- S112 spec:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsds_s112%2FSDS%2Fs1xx%2Fs112.html&cp=3_4_0_0
- S130 spec:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.s130.sds%2Fdita%2Fsoftdevices%2Fs130%2Fs130sds.html&cp=4_7_2_0
3) SDK還有在線幫助文檔和離線幫助文檔,兩者一模一樣,離線幫助文檔就是通過在線幫助文檔生成的,以方便網絡不好的用戶使用。你可以根據自己的情況選擇其中一份幫助文檔即可,幫助文檔鏈接:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.3.0%2Fexamples.html&cp=5_1_4
以SDK15.3.0在線幫助文檔為例,其主界面如下所示。展開幫助文檔左邊的目錄,你會發現:幫助文檔目錄層級跟SDK目錄層級是一一對應的。
因此對SDK有任何疑問,可以直接去查對應的幫助文檔說明,比如如果你想了解nRF5_SDK安裝目錄\examples\peripheral\spi這個例子是干什么的,直接找到幫助文檔對應的條目:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.3.0%2Fspi_master_example.html&cp=5_1_4_6_37,你就會明白這是一個告訴你如何使用SPI master的例子。再比如你想知道nRF5_SDK_15.2.0_9412b96\examples\dtm\direct_test_mode這個例子是不是講如何進行DTM測試的,找到幫助文檔相關條目說明:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.3.0%2Fble_sdk_app_dtm_serial.html&cp=5_1_4_5,你就會知道自己的猜測是對的。
4. 選擇一個SDK 例子(example)以開始你的BLE開發之旅
Nordic nRF5 SDK包含了豐富的應用實例,一般來說,我們的開發都是基於其中某一個例子來開始的 。所有example都包含在SDK根目錄\examples目錄下,
其在線幫助文檔鏈接為:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.3.0%2Fexamples.html&cp=5_1_4,
比如你想了解” nRF5_SDK安裝目錄\examples\ble_peripheral\ble_app_gls”這個例子是干什么的,找到該例子對應的幫助文檔說明:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.3.0%2Fble_sdk_app_gls.html&cp=5_1_4_2_2_11,通過查看例子說明,你會發現這是一個標准的血糖儀例子,里面使用了bonding,而且bonding的時候,需要輸入PIN碼,並支持LESC模式。看完這個例子說明,你就大概明白這個例子跟你的應用接不接近,如果你也需要使用帶PIN碼的bonding,那么就可以選擇該例子作為基礎來開始你的開發。
再比如nRF5_SDK安裝目錄\examples\ble_peripheral\ble_app_uart,例子說明鏈接為:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.3.0%2Fble_sdk_app_nus_eval.html&cp=5_1_4_2_2_24,
通過查看說明文檔,我們知道這個例子是把藍牙作為透傳來使用的,如果你的應用就是把藍牙作為一個透傳模塊來使用,那么你可以以這個例子為基礎來開始你的開發。
通過一個一個例子的查看,相信你馬上可以找到你需要的例子,然后在此基礎上,開始你的BLE開發之旅。