nRF5 SDK介紹

1. 概述

Nordic為其藍(lán)牙芯片提供了完整的開發(fā)庫。庫文件主要包含:芯片基本庫、擴(kuò)展庫、功能例程。

nRF SDK文件目錄

開發(fā)時,刻參考例程代碼,選擇一個與需求功能接近的例程進(jìn)行開發(fā)。


2. nRF Log

nRF SDK 例程中的Log支持兩種形式:UART、RTT。具體選擇哪一種,可在 sdk_config.h 文件中進(jìn)行配置。配置使能宏定義如下所示。

//==========================================================
// <e> NRF_LOG_BACKEND_RTT_ENABLED - nrf_log_backend_rtt - Log RTT backend
//==========================================================
#ifndef NRF_LOG_BACKEND_RTT_ENABLED
#define NRF_LOG_BACKEND_RTT_ENABLED 1
#endif

    ......

//==========================================================
// <e> NRF_LOG_BACKEND_UART_ENABLED - nrf_log_backend_uart - Log UART backend
//==========================================================
#ifndef NRF_LOG_BACKEND_UART_ENABLED
#define NRF_LOG_BACKEND_UART_ENABLED 0
#endif

    ......

//==========================================================
// <e> NRF_LOG_ENABLED - nrf_log - Logger
//==========================================================
#ifndef NRF_LOG_ENABLED
#define NRF_LOG_ENABLED 1
#endif

在使用UART打印日志時,還要根據(jù)實際硬件,修改串口輸出引腳。

nRF Log代碼模塊化較好,僅需包含頭文件,初始化就可以使用了。

// Step1. Include header file. sdk\components\libraries\log
#include "nrf_log.h"

// Step2. Log init.
void log_init ( void )
{
    uint32_t err_code = NRF_LOG_INIT ( NULL );
    APP_ERROR_CHECK ( err_code );

    NRF_LOG_DEFAULT_BACKENDS_INIT();
}

// Step3. Printing with api functions.
NRF_LOG_INFO("tmp value is %02X.", tmp);    // Log打印
NRF_LOG_HEXDUMP_INFO(array, 8);             // 數(shù)據(jù)打印


3. GPIO

nrf52832共有32個GPIO,P0.0 …… P0.31。nrf52840有48個GPIO,比nrf52832多了P1.0 …… P1.15引腳。每個引腳對應(yīng)一個pin_num,分別為0,1,……,31,32,……,47。

?應(yīng)用時,引腳常被配置為輸入,輸出。如下所示,引腳的配置和使用比較簡單,包含對應(yīng)的頭文件,配置輸入/出模式后就可以使用了。

#include "nrf_gpio.h"

/***  輸出引腳配置  ***/
nrf_gpio_cfg_output(15);    // 配置引腳15(P0.15)為輸出模式
nrf_gpio_pin_set(15);       // 引腳置高
nrf_gpio_pin_clear(15);     // 引腳置低
nrf_gpio_pin_toggle(15);    // 引腳翻轉(zhuǎn) 

/***  輸入引腳配置  ***/
nrf_gpio_cfg_input(42, NRF_GPIO_PIN_NOPULL);    // 配置引腳為42(P1.10),無上下拉
nrf_gpio_pin_read(42);                          // 讀取引腳狀態(tài)


4. timer


5. Long Range

Long Range是BLE 5.0 新增加的特性,能夠增加藍(lán)牙的通信距離。nRF52系列中,52840支持Long Range,52832不支持。一般工程增加Long Range支持需要做如下修改。

設(shè)置 掃描/廣播 功率為8 dBm
設(shè)置 掃描/廣播 PHY為BLE_GAP_PHY_CODED

因為Long Range的廣播與普通BLE廣播不兼容,所以廣播、掃描雙方必須都設(shè)置為Long Range。

5.1 BLE Central

下面整理了主機(jī)支持Long Range的代碼修改點。

  1. 在 scan_init() 函數(shù)中,增加對 phy 的設(shè)置
#ifdef BLE_LONG_RANGE
    static ble_gap_scan_params_t m_scan_param =
    {
        .active        = 0x01,
        .extended      = 0x01,    // Must be set 1, when in long range.
        .interval      = 160,
        .window        = 160,
        .timeout       = 0x0000,  // No timeout.
        .scan_phys     = BLE_GAP_PHY_CODED,  // Set phy.
        .filter_policy = BLE_GAP_SCAN_FP_ACCEPT_ALL,
    };
    
    init_scan.p_scan_param = &m_scan_param;
#endif
  1. 在 scan_start() 函數(shù)中,增大信號發(fā)送功率。
#define RADIO_TX_POWER              8            /**< Radio TX power in dBm. Default to 8dBm, see product spec for valid range */

    ret_code_t err_code;

    err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_SCAN_INIT, BLE_CONN_HANDLE_INVALID, RADIO_TX_POWER);
    APP_ERROR_CHECK(err_code);
  1. 連接成功后,增大信號發(fā)射功率。
    增大信號發(fā)射功率函數(shù) sd_ble_gap_tx_power_set ,可設(shè)置三種狀態(tài)的發(fā)射功率:廣播狀態(tài)、掃描狀態(tài)、連接狀態(tài)。所以連接后,主從機(jī)都需調(diào)用函數(shù),增大信號發(fā)射功率。
    藍(lán)牙連接事件,在 ble_evt_handler() 回調(diào)函數(shù),BLE_GAP_EVT_CONNECTED事件。
    ret_code_t err_code;

    err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_CONN, BLE_CONN_HANDLE_INVALID, RADIO_TX_POWER);
    APP_ERROR_CHECK(err_code);
  1. 設(shè)置NRF_BLE_SCAN_BUFFER 大小
// <o> NRF_BLE_SCAN_BUFFER - Data length for an advertising set. 
#ifndef NRF_BLE_SCAN_BUFFER
#define NRF_BLE_SCAN_BUFFER BLE_GAP_SCAN_BUFFER_EXTENDED_MIN
#endif

5.2 BLE Peripherial

對從機(jī)的修改點進(jìn)行梳理。

  1. advertising_init() 中初始化設(shè)置phy
#ifdef BLE_LONG_RANGE
    ble_gap_adv_params_t adv_params =
    {
        .properties    =
        {
          .type = BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED,  // Long Range
        },
        .p_peer_addr   = NULL,
        .filter_policy = BLE_GAP_ADV_FP_ANY,
        .interval      = APP_ADV_INTERVAL,
        .duration      = 0,

        .primary_phy   = BLE_GAP_PHY_CODED, // Must be changed to connect in long range. (BLE_GAP_PHY_CODED)
        .secondary_phy = BLE_GAP_PHY_CODED,
        .scan_req_notification = 1,
    };
#endif
  1. advertising_start() 函數(shù)中,增大發(fā)射功率。
#define RADIO_TX_POWER              8            /**< Radio TX power in dBm. Default to 8dBm, see product spec for valid range */

    ret_code_t           err_code;

    err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, m_adv_handle, RADIO_TX_POWER);
    APP_ERROR_CHECK(err_code);
  1. 連接成功后,設(shè)置連接發(fā)射功率。
    ret_code_t err_code;

    err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_CONN, BLE_CONN_HANDLE_INVALID, RADIO_TX_POWER);
    APP_ERROR_CHECK(err_code);
  1. 其他設(shè)置
    測試時,使用官方SDK ble_app_blinky 例程。參考開發(fā)者論壇資料,清除 .scan_srp_data 初始值。
static ble_gap_adv_data_t m_adv_data =
{
    .adv_data =
    {
        .p_data = m_enc_advdata,
        .len    = BLE_GAP_ADV_SET_DATA_SIZE_MAX
    },
    .scan_rsp_data =
    {
        .p_data = NULL, //m_enc_scan_response_data,    // long range
        .len    = 0 // BLE_GAP_ADV_SET_DATA_SIZE_MAX  // long range
    }

};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Guide to BluetoothSecurity原文 本出版物可免費(fèi)從以下網(wǎng)址獲得:https://doi.o...
    公子小水閱讀 8,796評論 0 6
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 6,009評論 0 9
  • 得有那么一件事,你熱愛,你堅持,你的人生有奔頭,生活因此而緊湊。當(dāng)趣味塞滿你生活的角落,你也無暇去孤獨。所以,如果...
    春風(fēng)小院閱讀 987評論 1 19
  • 一、記錄的價值 (一)年終總結(jié)想省力,平時就要系統(tǒng)化記錄你的工作 年終總結(jié),就是系統(tǒng)總結(jié)自己一年的工作。 很多人一...
    愛吃的十六閱讀 783評論 0 3
  • 胸小肌在胸大肌深面,為三角形扁肌。 起點:3~5肋骨的前面及肋間肌表面的筋膜, 止點:肩胛骨的喙突。 胸小肌拉肩胛...
    木子的瑜伽世界閱讀 1,636評論 0 0

友情鏈接更多精彩內(nèi)容