Waveshare
直播中

casuallystone

12年用户 64经验值
擅长:控制/MCU
私信 关注
[经验]

【NRF51822试用体验】初窥Nordic-BLE-proximity

建议先看的文档:
1、Introduction_to_the_S110_SoftDevice_v1.0.pdf  (简单介绍SoftDevice  --- 实际可以简单理解为是它实现了BLE协议栈的东西。
2、NRF51822_PS_v2.0.pdf (了解下他有哪些外设以及内存啥的)
3、帮助文档,具体路径如下:C:Program Files(x86)KeilARMDeviceNordicDocumentationindex.html(以后所有问题还得靠它!)
下面默认你已经大致看过上述文档了。

所使用例程:
C:Program Files(x86)KeilARMDeviceNordicnrf51822Boardpca10001s110ble_app_proximityarm
(为什么会在keil安装目录下呢?安装sdk的时候默认安装到那里去了。)
在烧写该工程之前需要先烧写SoftDevice!
烧写SoftDevice 步骤:
打开nRFgo Studio,在DeviceManager中选择nRF51Programing,在右侧的选项中选择ProgramSoftDevice
点击Browse,选中正确的softdevice:s110_nrf51822_6.0.0_softdevice.hex  
然后点击Program。成功后界面如下:

1.png

1、初始化串口用于调试、观察。
串口驱动的配置参看下图,Nordic已经帮我们写好了(路径:C:Program Files(x86)KeilARMDeviceNordicnrf51822Sourcesimple_uartsimple_uart.c)将该文件添加到keil中,编译~通过。
Nordic提供了很好的帮助文档(上述第3条的文档)如下图:
2.png
根据帮助文档中的API可以知道每个函数的意思~
在main部分调用初始化代码:
simple_uart_config(RTS_PIN_NUMBER,TX_PIN_NUMBER,CTS_PIN_NUMBER,RX_PIN_NUMBER,HWFC);
Nordic中配置的引脚号跟pin上的引脚号一致,因此很容易对应起来。
下面是我关于串口的宏定义(默认在pca10001.h文件中)
#defineRX_PIN_NUMBER  11
#defineTX_PIN_NUMBER  9
#defineCTS_PIN_NUMBER 10
#defineRTS_PIN_NUMBER 8
#define HWFC           false
这样就能通过simple_uart_putstring(…)来输出字符串了,但我们的目的可不止这样~
下面是串口重定向!
1、首先点击keil的“魔术棒”进行设置在页面:Target 下的 Code Generation 下勾选 use micro LIB 。
2、在mian函数前面添加如下代码:
int fputc(intch,FILE *f)
{
simple_uart_put(ch);
returnch;
}
3、编译(理论上是成功滴~)这样就能使用printf函数了。

通过以上配置,我们的开发板会说话了!下面通过printf来让开发板告诉你它跑到哪里,当前状态。

BLE初窥:
首先看看main函数,可以发现,先是一些LED、TIMER、等等外设初始化,接下来有个ble_stack_init、bond_manager_init、advertising_init……等等,这部分是蓝牙的一些参数初始化。
再下去串口打印出了Ble on 的消息。再下去直接一个for循环~执行power_manage()。
这时候大家好奇~这接下去到底怎么跑的呢~~? (实际上我们需要预先烧写SoftDevice,实际是它在跑,当有消息时上抛给相应的Handler(也就是函数入口)这样我们写的代码就能跑了~。
3.png
那么相应回调函数在哪里呢?
参看如下函数入口,在main.c文件中,单单理解该函数的意思可以理解为,调度!
static voidble_evt_dispatch(ble_evt_t * p_ble_evt)
{
    ble_bondmngr_on_ble_evt(p_ble_evt);
    ble_conn_params_on_ble_evt(p_ble_evt);
    ble_ias_on_ble_evt(&m_ias, p_ble_evt);
    ble_lls_on_ble_evt(&m_lls, p_ble_evt);
    ble_bas_on_ble_evt(&m_bas, p_ble_evt);
    ble_ias_c_on_ble_evt(&m_ias_c,p_ble_evt);
    on_ble_evt(p_ble_evt);
}
当某个事件产生时,就会进入该函数,执行相应操作。这里拿简单的on_ble_evt(p_ble_evt)来当例子。
static voidon_ble_evt(ble_evt_t * p_ble_evt)
{
    uint32_t        err_code;
    static uint16_t m_conn_handle =BLE_CONN_HANDLE_INVALID;

    switch (p_ble_evt->header.evt_id)
    {
        case BLE_GAP_EVT_CONNECTED:
……
} 可以发现 on_ble_evt内部是 根据不同的evt_id来执行不同的函数,想验证的话可以在每个case中printf出一个消息
这样就能知道到底是不是执行了该流程。
BLE_GAP_EVT_CONNECTED 很好理解,就是当设备建立连接的时候会进入该函数~在该语句中增加Printf(“BLE_GAP_EVT_CONNECTEDRN");然后编译,debug下咯。

可能需要借助具备BLE的安卓或者苹果手机安装nRFmaster control panel
传送门:自己找,反正它不让发链接让我很生气(提交的时候把东西都删掉了!!!!)!!!!google play自己搜索安装。简单介绍下该工具:可以作为center,搜索所有的BLE设备与它们建立连接,进行服务的发现、对相应特性值进行读写操作。
假设你已经安装好了该软件~
假设你已将源码烧入开发板并全速执行了。
假设你已经打开串口调试工具来显示数据了。
那么你打开手机软件、将会搜索到Nordic_Prox的设备名,点击connect,串口将会打印出消息:BLE_GAP_EVT_CONNECTED
那么恭喜你,BLE从机端(Preipheral)的基本流程你可能稍微有点了解了。
以上简单的BLE工程示例到此结束。




回帖(2)

chenwei6991627

2016-6-20 16:02:34
一切都是在假设中。。。
举报

yangwb00

2016-6-23 09:51:00
不错
举报

更多回帖

发帖
×
20
完善资料,
赚取积分