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

nRF51 DK 예제 7 -Radio Receiver

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



이번 예제 역시 Radio Transmitter 예제와 함께 하는 예제입니다.


이 소스는 동글에 설치하였습니다.


사용한 제품은 nrf51 dongle로 모델명은 PCA10031입니다



소스는 앞의 Radio Transmitter와 거의 비슷합니다.


main.c


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
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);
 
    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);
    APP_ERROR_CHECK(err_code);
    err_code = bsp_init(BSP_INIT_LED, APP_TIMER_TICKS(100, APP_TIMER_PRESCALER), NULL);
    APP_ERROR_CHECK(err_code);
 
    // Set radio configuration parameters
    radio_configure();
    NRF_RADIO->PACKETPTR = (uint32_t)&packet;
 
    err_code = bsp_indication_text_set(BSP_INDICATE_USER_STATE_OFF, "Wait for first packet\n\r");
    APP_ERROR_CHECK(err_code);
 
    while (true)
    {
        uint32_t received = read_packet();
 
        err_code = bsp_indication_text_set(BSP_INDICATE_RCV_OK, "Packet was received\n\r");
        APP_ERROR_CHECK(err_code);
       
        printf("The contents of the package is %u\n\r", (unsigned int)received);
    }
}
cs


Transmitter와 차이점은 Line 32~43까지인데


Line 32~33 : Uart로 뿌리는 string만 달라졌습니다. 'Press Any button'->'Wait for first packet'로


Line 37 : 이 부분이 받은 패킷을 읽어오는 부분입니다.


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
uint32_t read_packet()
{
    uint32_t result = 0;
 
    NRF_RADIO->EVENTS_READY = 0U;
    // Enable radio and wait for ready
    NRF_RADIO->TASKS_RXEN = 1U;
 
    while (NRF_RADIO->EVENTS_READY == 0U)
    {
        // wait
    }
    NRF_RADIO->EVENTS_END = 0U;
    // Start listening and wait for address received event
    NRF_RADIO->TASKS_START = 1U;
 
    // Wait for end of packet or buttons state changed
    while (NRF_RADIO->EVENTS_END == 0U)
    {
        // wait
    }
 
    if (NRF_RADIO->CRCSTATUS == 1U)
    {
        result = packet;
    }
    NRF_RADIO->EVENTS_DISABLED = 0U;
    // Disable radio
    NRF_RADIO->TASKS_DISABLE = 1U;
 
    while (NRF_RADIO->EVENTS_DISABLED == 0U)
    {
        // wait
    }
    return result;
cs


5~12 : Radio Rx를 enable하고는 packet을 기다립니다.


13~21 : 패킷을 받고, 


23~26 : 받은 패킷의 CRC를 검사해 이상이 없으면 result에 넣습니다.


27~34 : Radio Rx를 disable 시키고, 35에서 받은 데이터를 반환합니다.



Line 39~40 : Uart로 뿌려주고, LED를 깜박입니다.


Line 42 : 받은 packet을 uart로 뿌려줍니다.


동작 diagram입니다.

실제 받은 데이터입니다.





아래는 동작영상입니다.





반응형

'Study > nRF51xxx(BLE)' 카테고리의 다른 글

nRF51 DK 예제 9 - PPI  (0) 2015.03.04
nRF51 DK 예제 8 - Pin change interrupt  (0) 2015.03.03
nRF51 DK 예제 6 -Radio Transmitter  (0) 2015.03.03
nRF51 DK 예제 5 -GPIOTE  (0) 2015.03.02
nRF51 DK 예제4 flashwrite  (0) 2015.03.02

인기글