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的代碼修改點。
- 在 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
- 在 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);
- 連接成功后,增大信號發(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);
- 設(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)行梳理。
- 在
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
- 在
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);
- 連接成功后,設(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);
- 其他設(shè)置
測試時,使用官方SDKble_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
}
};