이번 예제는 무선으로 패킷을 주고받는 예제입니다.
이 예제를 하기위해서는 보드가 2개가 필요한데, 동글을 이용하여도 됩니다.
nrf51 DK(PCA 10028)은 transmitter로 dongle(PCA 10031)은 receiver로 설정합니다.
main
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | int main(void) { uint32_t err_code = NRF_SUCCESS; clock_initialization(); APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_MAX_TIMERS, APP_TIMER_OP_QUEUE_SIZE, false); APP_GPIOTE_INIT(1); const app_uart_comm_params_t comm_params = { RX_PIN_NUMBER, TX_PIN_NUMBER, RTS_PIN_NUMBER, CTS_PIN_NUMBER, APP_UART_FLOW_CONTROL_ENABLED, false, UART_BAUDRATE_BAUDRATE_Baud38400 }; APP_UART_FIFO_INIT(&comm_params, UART_RX_BUF_SIZE, UART_TX_BUF_SIZE, uart_error_handle, APP_IRQ_PRIORITY_LOW, err_code); err_code = bsp_init(BSP_INIT_LED | BSP_INIT_BUTTONS, APP_TIMER_TICKS(100, APP_TIMER_PRESCALER), bsp_evt_handler); APP_ERROR_CHECK(err_code); // Set radio configuration parameters radio_configure(); // Set payload pointer NRF_RADIO->PACKETPTR = (uint32_t)&packet; err_code = bsp_indication_text_set(BSP_INDICATE_USER_STATE_OFF, "Press Any Button\n\r"); APP_ERROR_CHECK(err_code); while (true) { // no implementation needed } } | cs |
Line 5 : 클럭을 설정하는 부분입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | void clock_initialization() { /* Start 16 MHz crystal oscillator */ NRF_CLOCK->EVENTS_HFCLKSTARTED = 0; NRF_CLOCK->TASKS_HFCLKSTART = 1; /* Wait for the external oscillator to start up */ while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) { // Do nothing. } /* Start low frequency crystal oscillator for app_timer(used by bsp)*/ NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos); NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; NRF_CLOCK->TASKS_LFCLKSTART = 1; while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) { // Do nothing. } } | cs |
4~11 : 메인으로 쓸 일반적인 HFCLK이며,
14~21 : APP Timer에서 쓸 LFCLK입니다.
Line 6 : APP Timer 초기화 부분입니다.
Line 8 : GPIOTE 초기화 합니다.
Line 10~19 : UART초기화 정보입니다.
Line 21~26 : UART를 FIFO로 초기화 합니다.
Line 28~31 : bsp 초기화 합니다.
Line 34 : Radio 초기화. 이부분이 이번 예제의 핵심이네요.
radio_configure()는 radio_config.c에 define되어있습니다.
2.4GHz 대역의 블루투스를 사용하기위한 설정입니다.
Line 37 : 패킷전송시 사용할 버퍼의 포인터값을 설정합니다.
Line 39~40 : bsp를 사용하여 UART로 뿌려주는 역할을 합니다.
여기까지 다 실행이 되고난 후 버튼을 누르면, 아까 초기화한 bsp의 callback함수가 호출됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | void bsp_evt_handler(bsp_event_t evt) { uint32_t err_code = NRF_SUCCESS; switch (evt) { case BSP_EVENT_KEY_0: /* fall through */ case BSP_EVENT_KEY_1: /* fall through */ case BSP_EVENT_KEY_2: /* fall through */ case BSP_EVENT_KEY_3: /* fall through */ case BSP_EVENT_KEY_4: /* fall through */ case BSP_EVENT_KEY_5: /* fall through */ case BSP_EVENT_KEY_6: /* fall through */ case BSP_EVENT_KEY_7: // get actual button state err_code = bsp_buttons_state_get(&packet); APP_ERROR_CHECK(err_code); send_packet(); printf("The contents of the package was %u\n\r", (unsigned int)packet); break; default: // no implementation needed break; } } | cs |
22~24 : 버튼의 bit값을 packet라는 버퍼에 넣어주고 send_packet()에서 무선으로 전송합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | void send_packet() { // send the packet: NRF_RADIO->EVENTS_READY = 0U; NRF_RADIO->TASKS_TXEN = 1; while (NRF_RADIO->EVENTS_READY == 0U) { // wait } NRF_RADIO->EVENTS_END = 0U; NRF_RADIO->TASKS_START = 1U; while (NRF_RADIO->EVENTS_END == 0U) { // wait } uint32_t err_code = bsp_indication_text_set(BSP_INDICATE_SENT_OK, "The packet was sent\n\r"); APP_ERROR_CHECK(err_code); NRF_RADIO->EVENTS_DISABLED = 0U; // Disable radio NRF_RADIO->TASKS_DISABLE = 1U; while (NRF_RADIO->EVENTS_DISABLED == 0U) { // wait } } | cs |
4~17 : Tx를 enable시켜 packet을 보내고,
19~20 : UART로 보낸걸 알려주게 됩니다.
22~28 : Tx 를 disable 시킵니다.
요런식으로 동작합니다.
버튼을 누를때마다 UART에 뿌려주는 부분입니다.
'Study > nRF51xxx(BLE)' 카테고리의 다른 글
nRF51 DK 예제 8 - Pin change interrupt (0) | 2015.03.03 |
---|---|
nRF51 DK 예제 7 -Radio Receiver (0) | 2015.03.03 |
nRF51 DK 예제 5 -GPIOTE (0) | 2015.03.02 |
nRF51 DK 예제4 flashwrite (0) | 2015.03.02 |
nRF51 DK 예제3 bsp (0) | 2015.02.27 |