建议先看的文档: 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、初始化串口用于调试、观察。 串口驱动的配置参看下图,Nordic已经帮我们写好了(路径:C:Program Files(x86)KeilARMDeviceNordicnrf51822Sourcesimple_uartsimple_uart.c)将该文件添加到keil中,编译~通过。 Nordic提供了很好的帮助文档(上述第3条的文档)如下图: 根据帮助文档中的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(也就是函数入口)这样我们写的代码就能跑了~。 那么相应回调函数在哪里呢? 参看如下函数入口,在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工程示例到此结束。
|