본문 바로가기
Study/nRF51xxx(BLE)

nRF51 DK 예제 6 -Radio Transmitter

by Answer Choi 2015. 3. 3.
반응형



이번 예제는 무선으로 패킷을 주고받는 예제입니다.



이 예제를 하기위해서는 보드가 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

인기글