当前位置:首页 >> 信息与通信 >>

Noridc nRF51822 BLE to UART


nRF51822:BLE-UART Demo
Gandy Huang

1 Gandy.huang@avnet.com

Open

? C:\Keil\ARM\Device\Nordic\nrf51822\ Board\pca10001\s110\experimental\bl e_app_uart

/>
2

可以修改蓝牙参数

#define DEVICE_NAME “Nordic_UART” //修改蓝牙名字 #define APP_ADV_INTERVAL 64 //广播时间间隔,时间越长,广播电流越小 #define APP_ADV_TIMEOUT_IN_SECONDS 180 //广播timeout时间,广播timeout 后可以休眠,也可以重新打开广播 #define APP_TIMER_PRESCALER 0 //RTC时钟参考,不需要修改 #define APP_TIMER_MAX_TIMERS 2 //当你添加一个create timer 时,记得这里+1,最小为2 #define APP_TIMER_OP_QUEUE_SIZE 4 //timer 队列大小,一般情况6个都可以了 #define MIN_CONN_INTERVAL 16 //蓝牙连接后,通信的时间间隔,为了功耗处理,请尽量不要太小 #define MAX_CONN_INTERVAL 60 //蓝牙连接后,通信的最大时间间隔,一般手机会用这个间隔,因此也不要设 的太大,以免传输速度比较慢 #define SLAVE_LATENCY 0 //蓝牙连接后,需要等待几个时间间隔后回应 #define CONN_SUP_TIMEOUT 400 //蓝牙连接后,timeout的时间 #define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(5000, APP_TIMER_PRESCALER) //蓝牙连接后, 多久之后使用上面的时间参数 #define NEXT_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(30000, APP_TIMER_PRESCALER) #define MAX_CONN_PARAMS_UPDATE_COUNT 3 #define BUTTON_DETECTION_DELAY APP_TIMER_TICKS(50, APP_TIMER_PRESCALER) //按键的时间 //下面是bonding需要参数,无需修改 #define SEC_PARAM_TIMEOUT 30 #define SEC_PARAM_BOND 1 #define SEC_PARAM_MITM 0 #define SEC_PARAM_IO_CAPABILITIES BLE_GAP_IO_CAPS_NONE #define SEC_PARAM_OOB 0 #define SEC_PARAM_MIN_KEY_SIZE 7 #define SEC_PARAM_MAX_KEY_SIZE 16
3

修改32.768时钟源
static void ble_stack_init(void) { uint32_t err_code; // Initialize SoftDevice. //如果使用外面32.768时钟 SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM, false); //如果外面没有32.768时钟 //SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_RC_250_PPM_8000MS_CALIBRATION, false);

4

串口初始化
static void uart_init(void) { /**@snippet [UART Initialization] */ simple_uart_config(RTS_PIN_NUMBER, TX_PIN_NUMBER, CTS_PIN_NUMBER, RX_PIN_NUMBER, HWFC); //可以根据需要,设定串口对应的引脚,HWFC目前为true,使用4脚串口,为了传输数据跟稳定

int main(void) { // Initialize leds_init(); timers_init(); buttons_init(); //uart_init(); ble_stack_init(); gap_params_init(); services_init(); advertising_init(); conn_params_init(); sec_params_init();
5

//本教程不用串口,直接将BLE的数据返回

//simple_uart_putstring(START_STRING);

串口接收终端
void UART0_IRQHandler(void) //根据需求更改 { static uint8_t data_array[BLE_NUS_MAX_DATA_LEN]; static uint8_t index = 0; uint32_t err_code; /**@snippet [Handling the data received over UART] */ data_array[index] = simple_uart_get(); index++;

if ((data_array[index - 1] == '\n') || (index >= (BLE_NUS_MAX_DATA_LEN - 1))) { err_code = ble_nus_send_string(&m_nus, data_array, index + 1); if (err_code != NRF_ERROR_INVALID_STATE) { APP_ERROR_CHECK(err_code); }
index = 0; } /**@snippet [Handling the data received over UART] */ }
6

蓝牙事件
static void on_ble_evt(ble_evt_t * p_ble_evt) { switch (p_ble_evt->header.evt_id) { case BLE_GAP_EVT_CONNECTED: //蓝牙连接成功事件,可加入相关指示等 break;
case BLE_GAP_EVT_DISCONNECTED: //蓝牙失去连接事件,可加入相关指示等 break; case BLE_GAP_EVT_TIMEOUT: //蓝牙广播超时事件,可加入相关指示等 if (p_ble_evt->evt.gap_evt.params.timeout.src == BLE_GAP_TIMEOUT_SRC_ADVERTISEMENT) { // Configure buttons with sense level low as wakeup source. nrf_gpio_cfg_sense_input(WAKEUP_BUTTON_PIN, BUTTON_PULL, NRF_GPIO_PIN_SENSE_LOW); //配置IO,如果power donw后可以唤醒 // Go to system-off mode (this function will not return; wakeup will cause a reset) err_code = sd_power_system_off(); //软件默认power down,可以继续打开广播 APP_ERROR_CHECK(err_code); // advertising_start(); //如果不想powerdonw,可以继续打开广播 }
7

UUID更改
1 打开ble_nus.c 2 更改下面UUID,记得APP也需要同步修改 uint32_t ble_nus_init(ble_nus_t * p_nus, const ble_nus_init_t * p_nus_init) { uint32_t err_code; ble_uuid_t ble_uuid; ble_uuid128_t nus_base_uuid = {0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E};

8

蓝牙的接收数据传输
void nus_data_handler(ble_nus_t * p_nus, uint8_t * p_data, uint16_t length) { //接收入口

// // // // // }

uint32_t err_code = ble_nus_send_string(&m_nus, p_data, length); //发送函数 if (err_code != NRF_SUCCESS) { //如果不成功,需要安排重新发送 } for (int i = 0; i < length; i++) //默认是串口打印出来,这里更改为直接BLE数据返回 { simple_uart_put(p_data[i]); } simple_uart_put('\n');

9

烧录蓝牙协议栈

2 选择蓝牙 协议栈 4 看到蓝牙协议栈 1 先擦除 3 Program

10

打开工程

2 编译

3烧录

4 如果烧录不成功,打开属性

1 选择对应的IC

11

设置Jlink

1 选择 Debug

2 选择jlink系列号

3 选择Sw

4 看到设备,如果 没有设备,请看看 接口和电源

12

设置Jlink

1 选择Flash download 2 添加nrf51xxx

13

打开master controlpannel
2 重新烧录

1 如果无看到一个版本号

14

打开master controlpannel

2 点击start 3 选择设备

4selec

1 升级完成看到版本号

15

打开master controlpannel
1 service 2 enable service

5看到接收数据 3 点击RX

4输入数据,按回车

16

谢谢

17


相关文章:
Nrf51系列蓝牙4.0通讯学习基础知识
There are onboard peripherals like UART, SPI, ...For specific data on the nRF51822, look at the...If you want to create non-standard custom BLE ...
更多相关标签:
nrf51822 uart | nrf51822 uart例程 | nrf51822 ble | 51822 uart | nrf51822 | nrf51822中文手册 | nrf51822论坛 | nrf51822程序开发详解 |