原创 nordic s110 使用分析

2016-6-2 14:09 1451 2 2 分类: MCU/ 嵌入式

有一段时间没摸过BLE了 ,忘 的差不多了 ,现在又重新复习下:

要使S110 协议栈跑起来,首先要做的事就是协议栈使能,因为S110协议栈是基于事件触发的,所以在初始化的时候 要注册事件分发处理函数, 这个事件根发处理函数需要自己实现。具体的BLE初始化步骤如下:

1.ble_static_init();协议栈初始化

a.初始化SD.
SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, false);
b.使能BLE协议栈
ble_enable_params_t ble_enable_params;//定义使能ble协议栈参数变量
memset(&ble_enable_params, 0, sizeof(ble_enable_params));//参数初始化
     ble_enable_params.gatts_enable_params.service_changed = IS_SRVC_CHANGED_CHARACT_PRESENT;//参数赋值设置
err_code = sd_ble_enable(&ble_enable_params);//BLE协议栈使能
c.注册BLE事件分发处理函数
err_code = softdevice_ble_evt_handler_set(ble_evt_dispatch);//注册BLE事件类型分配处理回调句柄

2.gap_params_init();//GAP参数初始化
a.定义GAP连接参数,GAP连接安全模式参数
ble_gap_conn_params_t   gap_conn_params;
ble_gap_conn_sec_mode_t sec_mode;
b.安全模式参数设置
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
c.设备名称设置
err_code = sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *) DEVICE_NAME, strlen(DEVICE_NAME));
APP_ERROR_CHECK(err_code);
d.GAP连接参数设置
   memset(&gap_conn_params, 0, sizeof(gap_conn_params));
   gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
   gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
   gap_conn_params.slave_latency     = SLAVE_LATENCY;
   gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
APP_ERROR_CHECK(err_code);

3.services_init();//服务初始化
具体见《二、如何在nrf51822工程中添加一个service》

4.advertising_init();//广播初始化
a.定义广播参数变量,扫描响应变量;
     ble_advdata_t advdata;
     ble_advdata_t scanrsp;
     uint8_t       flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
b.定义并初始化一个广播uuid结构体变量;
ble_uuid_t adv_uuids[] = {0x5678, BLE_UUID_TYPE_BLE};
c.初始化设置广播参数;
    memset(&advdata, 0, sizeof(advdata));
   advdata.name_type               = BLE_ADVDATA_FULL_NAME;
   advdata.include_appearance      = true;
   advdata.flags.size              = sizeof(flags);
   advdata.flags.p_data            = &flags;
d.初始化设置扫描响应参数;
memset(&scanrsp, 0, sizeof(scanrsp));
scanrsp.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]);
scanrsp.uuids_complete.p_uuids  = adv_uuids;
e.广播参数设置
err_code = ble_advdata_set(&advdata, &scanrsp);
APP_ERROR_CHECK(err_code);
5.conn_params_init();//连接参数初始化
a.定义连接参数初始化结构体变量:
ble_conn_params_init_t cp_init;
b.初始化连接参数结构体变量:
   memset(&cp_init, 0, sizeof(cp_init));
   cp_init.p_conn_params                  = NULL;
   cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
   cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
   cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
   cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
   cp_init.disconnect_on_fail             = false;
   cp_init.evt_handler                    = on_conn_params_evt;
   cp_init.error_handler                  = conn_params_error_handler;
c.连接参数初始化设置:
   err_code = ble_conn_params_init(&cp_init);
   APP_ERROR_CHECK(err_code);

6.sec_params_init();//安全参数初始化

7.advertising_start();//启动广播
a.定义并初始化广播数据;
ble_gap_adv_params_t adv_params;
     memset(&adv_params, 0, sizeof(adv_params));
     adv_params.type        = BLE_GAP_ADV_TYPE_ADV_IND;
     adv_params.p_peer_addr = NULL;
     adv_params.fp          = BLE_GAP_ADV_FP_ANY;
     adv_params.interval    = APP_ADV_INTERVAL;
     adv_params.timeout     = APP_ADV_TIMEOUT_IN_SECONDS;
b.启动广播;
err_code = sd_ble_gap_adv_start(&adv_params);
APP_ERROR_CHECK(err_code);


8.实现 ble_evt_dispatch() 事件分发函数
static void ble_evt_dispatch(ble_evt_t * p_ble_evt)
{
ble_conn_params_on_ble_evt(p_ble_evt);
    ble_nus_on_ble_evt(&m_nus, p_ble_evt);
    on_ble_evt(p_ble_evt);
ble
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /4 下一条