nRF52

nRF ESB(무선 통신 구현)

임베디드 친구 2024. 9. 20. 13:11
반응형

ESB (Enhanced ShockBurst)는 Nordic Semiconductor의 nRF 시리즈 무선 칩에서 주로 사용되는 경량 프로토콜입니다. 이 프로토콜은 짧은 거리에서 저전력, 신뢰성 있는 무선 통신을 가능하게 하며, 리소스가 제한된 IoT (Internet of Things) 장치, 웨어러블 기기, 센서 네트워크 등에서 많이 활용됩니다. 이 글에서는 ESB의 주요 특징, 제한사항, 그리고 nRF52840와 같은 nRF 시리즈 칩을 활용한 무선 통신 구현 방법을 설명합니다.

1. ESB 소개

Enhanced ShockBurst (ESB)는 무선 데이터 전송에서 효율성과 신뢰성을 동시에 추구하는 프로토콜입니다. 주로 간단한 무선 네트워크에서 저전력으로 신속하게 데이터를 주고받아야 하는 환경에 적합합니다. Nordic의 nRF 시리즈 칩과 결합하여 사용되며, 이러한 칩은 BLE(Bluetooth Low Energy), Zigbee, Thread와 같은 복잡한 통신을 요구하지 않는 환경에서 주로 사용됩니다.

ESB의 사용 분야

ESB는 특히 다음과 같은 분야에서 유용하게 사용됩니다.

  • IoT 디바이스: 낮은 전력 소비와 짧은 통신 범위가 요구되는 환경
  • 웨어러블 기기: 심박 센서, 피트니스 트래커와 같은 기기에서 저전력으로 안정적인 통신 필요
  • 센서 네트워크: 복잡한 프로토콜 없이 실시간 데이터 전송이 필요한 센서 시스템

ESP 구성

이미지 출처 https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/protocols/esb/index.html

2. ESB의 주요 특징

ESB 프로토콜은 아래와 같은 특징을 가집니다:

  • 최대 8개의 송신기와 1개의 수신기(PRX)로 구성된 네트워크 토폴로지 지원: 이는 단순한 스타 네트워크 구조에서 데이터를 송수신하는 데 적합합니다.
  • 레거시 모드 지원: 1 ~ 32바이트의 동적 페이로드를 사용할 수 있으며, nRF5 시리즈에서는 1 ~ 125바이트의 정적 페이로드를 지원합니다.
  • 양방향 데이터 전송: 송신기(PTX)와 수신기(PRX) 간의 양방향 통신이 가능합니다.
  • 패킷 ACK 및 자동 재전송 기능: 수신 확인을 위한 Ack 패킷 전송 및 자동 재전송 기능이 내장되어 신뢰성을 확보합니다.
  • 파이프 별 TX/RX FIFO 큐 지원: 각 파이프는 개별 송수신 큐를 가집니다.
  • 레거시 nRF24Lxx ESB와의 호환성: 기존에 사용하던 nRF24Lxx 칩과의 호환성을 보장합니다.
  • 외부 전치 증폭기(front-end module) 지원: 필요 시 전송 거리를 늘리기 위해 전치 증폭기를 사용할 수 있습니다.

3. 시스템 리소스 요구 사항

ESB는 안정적인 동작을 위해 시스템에서 몇 가지 리소스를 독점적으로 사용합니다. 이를 통해 통신의 일관성을 보장합니다. 아래는 ESB가 요구하는 주요 리소스입니다

Resource type Resource Required
Radio NRF_RADIO fixed
Timer NRF_TIMER2 configurable
DPPI/PPI channels 6 channels automatically allocated
Event generator unit NRF_EGU0 events 6 - 7 fixed
Software interrupt 0 fixed

만약 애플리케이션이 위의 리소스를 변경하거나 재사용하면, ESB는 오동작을 일으킬 수 있습니다. ESB의 Radio Interrupt Handler와 Timer Interrupt Handler는 우선순위 0에서 실행되고, ESB의 콜백 함수는 우선순위 1에서 실행됩니다. 따라서, 애플리케이션에서 사용하는 다른 인터럽트는 우선순위 2 이하에서 실행되어야 충돌을 방지할 수 있습니다.

4. ESB 패킷 전송 방식

ESB는 기본적으로 송신기(PTX)에서 시작하여 수신기(PRX)로 데이터를 전송하고, 수신 확인 Ack 패킷을 받으면 전송이 완료됩니다. 만약 Ack 패킷이 수신되지 않으면, 설정된 재전송 횟수만큼 재전송을 시도합니다. 이때 재전송 지연 시간과 시도 횟수는 초기화 시 설정하거나 다음 함수로 조정할 수 있습니다

nrf_esb_set_retransmit_delay(uint16_t delay);
nrf_esb_set_retransmit_count(uint16_t count);

만약 수신된 Ack 패킷이 손실되어도, PRX는 중복된 패킷을 제거하므로 애플리케이션에서 중복 데이터를 처리할 필요가 없습니다.

5. nRF ESB 애플리케이션 작성

이제 nRF52840을 이용해 ESB 기반의 간단한 무선 통신 애플리케이션을 작성하는 방법을 살펴보겠습니다.

5.1 ESB 초기화

ESB 통신을 시작하기 위해서는 먼저 ESB 모듈을 초기화해야 합니다. nrf_esb_config_t 구조체를 사용해 설정을 정의한 후, nrf_esb_init() 함수를 호출하여 초기화를 완료할 수 있습니다. 또한, 송신기(PTX)와 수신기(PRX)가 동일한 주소를 사용해야 정상적인 통신이 가능합니다.

uint32_t esb_init( void )
{
    uint32_t err_code;
    uint8_t base_addr_0[4] = {0xE7, 0xE7, 0xE7, 0xE7};
    uint8_t base_addr_1[4] = {0xC2, 0xC2, 0xC2, 0xC2};
    uint8_t addr_prefix[8] = {0xE7, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8 };
    nrf_esb_config_t nrf_esb_config         = NRF_ESB_DEFAULT_CONFIG;
    nrf_esb_config.payload_length           = 8;
    nrf_esb_config.protocol                 = NRF_ESB_PROTOCOL_ESB_DPL;
    nrf_esb_config.bitrate                  = NRF_ESB_BITRATE_2MBPS;
    nrf_esb_config.mode                     = NRF_ESB_MODE_PRX; // NRF_ESB_MODE_PTX
    nrf_esb_config.event_handler            = nrf_esb_event_handler;
    nrf_esb_config.selective_auto_ack       = false;

    err_code = nrf_esb_init(&nrf_esb_config);
    VERIFY_SUCCESS(err_code);

    err_code = nrf_esb_set_base_address_0(base_addr_0);
    VERIFY_SUCCESS(err_code);

    err_code = nrf_esb_set_base_address_1(base_addr_1);
    VERIFY_SUCCESS(err_code);

    err_code = nrf_esb_set_prefixes(addr_prefix, 8);
    VERIFY_SUCCESS(err_code);

    return err_code;
}

5.2 데이터 전송

ESB 모듈을 초기화한 후, 송신기(PTX)에서 데이터를 전송할 수 있습니다. nrf_esb_write_payload() 함수를 사용하여 패킷을 전송합니다.

static nrf_esb_payload_t        tx_payload = NRF_ESB_CREATE_PAYLOAD(0, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00);

uint32_t err_code;

err_code = nrf_esb_write_payload(&tx_payload);
VERIFY_SUCCESS(err_code);

5.3 데이터 수신

수신기(PRX)에서는 이벤트 핸들러를 통해 데이터 수신을 처리합니다. 패킷이 도착하면, NRF_ESB_EVENT_RX_RECEIVED 이벤트가 발생하고, 이를 통해 데이터를 읽어옵니다.

void nrf_esb_event_handler(nrf_esb_evt_t const * p_event)
{
    switch (p_event->evt_id)
    {
        case NRF_ESB_EVENT_TX_SUCCESS:
            NRF_LOG_DEBUG("TX SUCCESS EVENT");
            break;
        case NRF_ESB_EVENT_TX_FAILED:
            NRF_LOG_DEBUG("TX FAILED EVENT");
            break;
        case NRF_ESB_EVENT_RX_RECEIVED:
            NRF_LOG_DEBUG("RX RECEIVED EVENT");
            if (nrf_esb_read_rx_payload(&rx_payload) == NRF_SUCCESS)
            {
                NRF_LOG_DEBUG("Receiving packet: %02x", rx_payload.data[1]);
            }
            break;
    }
}

6. 최적화 및 주의사항

  1. 전력 소비 최적화: IoT나 웨어러블 디바이스의 경우, 전력 소비가 중요한 이슈입니다. ESB는 필요한 데이터 전송을 최소화하고 저전력 모드를 최대한 활용하여 효율적인 전력 관리를 할 수 있습니다.
  2. 우선순위 설정: 애플리케이션에서 사용하는 인터럽트의 우선순위를 잘 관리해야 ESB의 정상적인 동작을 보장할 수 있습니다.
  3. 페이로드 크기 관리: 페이로드 크기를 최적화하여 불필요한 데이터 전송을 줄이는 것이 중요합니다.
  4. 재전송 설정: 재전송 횟수와 딜레이를 적절하게 설정해 네트워크의 신뢰성을 높일 수 있습니다. 네트워크 상태가 불안정할 경우 재전송 횟수를 늘리지만, 너무 많은 재전송은 성능 저하를 일으킬 수 있습니다.

7. 결론

Nordic의 nRF 시리즈 칩에서 제공하는 Enhanced ShockBurst (ESB)는 저전력, 고신뢰성 무선 통신을 위한 훌륭한 솔루션입니다. 특히, 복잡한 프로토콜이 필요하지 않은 환경에서 빠르고 안정적인 데이터 전송을 지원합니다. 본 글에서는 nRF52840을 기반으로 한 ESB 설정과 데이터 송수신 예제를 살펴보았으며, 이를 통해 IoT, 웨어러블 등 다양한 응용 분야에서 쉽게 활용할 수 있습니다.

반응형