nRF52

nRF52840을 활용한 NFC 이해 및 구현

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

1. NFC란?

NFC(근거리 통신, Near Field Communication)는 약 4cm 내외의 짧은 거리에서 무선으로 통신할 수 있는 기술입니다. RFID(라디오 주파수 식별) 기술을 기반으로 하며, 주로 스마트폰, 태블릿, 스마트 카드와 같은 장치 간에 데이터를 손쉽게 교환하는 데 사용됩니다. NFC는 13.56MHz 대역에서 작동하며, 모바일 결제, 파일 전송, 기기 간 연결과 같은 다양한 용도로 활용됩니다.

NFC는 크게 세 가지 모드로 나뉩니다:

  1. 카드 에뮬레이션 모드: NFC 디바이스가 RFID 카드처럼 동작하며, 주로 모바일 결제나 출입 카드로 활용됩니다.
  2. 리더/라이터 모드: NFC 디바이스가 태그를 읽거나 쓰는 방식으로 동작합니다.
  3. 피어 투 피어(P2P) 모드: 두 장치 간 데이터를 주고받을 수 있는 방식으로, 주로 파일 전송에 사용됩니다.

2. NFC의 주요 활용

NFC는 다음과 같은 다양한 상황에서 사용할 수 있습니다:

  1. 모바일 결제: NFC 기반 결제 시스템은 스마트폰을 이용해 물리적 카드 없이도 편리하게 결제를 처리할 수 있습니다. 애플 페이(Apple Pay)와 구글 페이(Google Pay) 같은 서비스가 대표적입니다.
  2. 데이터 전송: NFC는 스마트폰 간에 사진, 비디오, 연락처 등의 파일을 전송할 수 있는 기능을 제공합니다.
  3. 교통카드 및 출입카드: NFC는 교통카드, 전자 티켓 및 출입 인증 카드로도 사용됩니다. 지하철, 버스, 도서관 출입 등을 편리하게 처리할 수 있습니다.
  4. 기기 간 연결: NFC는 스마트폰과 무선 이어폰, 스피커 등의 연결 설정을 빠르게 할 수 있게 도와줍니다. NFC로 두 기기를 가까이 대면 자동으로 블루투스 페어링이 이루어지는 방식입니다.

3. NFC 기술의 특징

NFC는 다음과 같은 주요 특징을 가지고 있습니다:

  1. 짧은 통신 거리: NFC는 보통 4cm 이내의 매우 짧은 거리에서 통신이 이루어지기 때문에, 비교적 높은 보안성을 제공합니다.
  2. 비접촉 통신: NFC는 물리적인 접촉이 필요하지 않으며, 케이블이나 복잡한 설정 없이도 통신이 가능합니다.
  3. 양방향 통신: NFC는 단방향 통신이 아닌, 양방향 데이터 전송이 가능합니다. 즉, 데이터를 읽고 쓰는 작업을 모두 지원합니다.
  4. 간단한 설정: 두 장치를 가까이 대기만 하면 자동으로 연결되며, 설정 과정이 매우 간편합니다. 예를 들어, 두 스마트폰을 NFC로 연결하여 블루투스를 자동 설정할 수 있습니다.

4. nRF52 NFC 특징

nRF52 시리즈는 노르딕 세미컨덕터(Nordic Semiconductor)에서 제공하는 무선 통신용 SoC(System on Chip)로, BLE(Bluetooth Low Energy)와 NFC를 지원하는 저전력 제품입니다. nRF52 시리즈의 NFC 기능은 아래와 같은 특징을 가지고 있습니다:

  1. 다양한 NFC 타입 지원: nRF52는 NFC-A, NFC-B, NFC-F의 세 가지 타입을 지원하여 다양한 NFC 기기와의 통신을 제공합니다.
  2. 데이터 읽기/쓰기: nRF52는 NFC 통신을 통해 데이터를 읽거나 쓸 수 있으며, 스마트폰과 상호 작용하여 데이터 전송 및 저장이 가능합니다.
  3. NFC 태그 역할 수행: nRF52는 NFC 태그처럼 동작할 수 있으며, 다른 NFC 판독기 또는 NFC 지원 기기에 응답할 수 있습니다.
  4. 보안 기능: NFC 통신 중에 데이터의 기밀성과 안전성을 확보할 수 있는 다양한 보안 기능을 제공합니다.
  5. 저전력 설계: NFC 통신 시에도 저전력 모드로 작동하여, 배터리 수명을 최적화할 수 있습니다.

5. nRF52에서 NFC 설정

nRF52에서 NFC를 설정하려면 몇 가지 초기화 작업이 필요합니다. 이를 위해 sdk_config.h 파일에서 필요한 설정을 활성화해야 합니다.

#define NRFX_NFCT_ENABLED 1
#define NRFX_TIMER_ENABLED 1
#define NRFX_TIMER4_ENABLED 1
#define TIMER_ENABLED 1
#define NFC_PLATFORM_ENABLED 1

이후 필요한 드라이버와 라이브러리를 프로젝트에 추가합니다.

  • nRF 드라이버 추가
./modules/nrfx/drivers/src/nrfx_nfct.c
./modules/nrfx/drivers/src/nrfx_timer.c
  • nRF 라이브러리 추가
./components/nfc/t4t_lib/nfc_t4t_lib_gcc.a
./components/nfc/platform/nfc_platform.c

이 설정들은 NFC 모듈이 정상적으로 동작할 수 있도록 하는 기본 설정입니다.

6. nRF52에서 NFC 초기화

nRF52 SDK는 두 가지 NFC 태그 타입을 지원합니다: NFC tag 2 type(T2T)과 NFC tag 4 type(T4T). 여기서는 ISO14443-4A(ISO-DEP) 프로토콜을 지원하는 T4T 라이브러리를 사용하여 NFC 태그를 구현합니다.

다음은 기본적인 NFC 초기화 코드입니다.

static void aika_nfc_callback(void* context, nfc_t4t_event_t event, const uint8_t* data, size_t dataLength, uint32_t flags){
    UNUSED_PARAMETER(context);

    switch(event){
    case NFC_T4T_EVENT_FIELD_ON:
        NRF_LOG_INFO("NFC_T4T_EVENT_FIELD_ON");
        break;

    case NFC_T4T_EVENT_FIELD_OFF:
        NRF_LOG_INFO("NFC_T4T_EVENT_FIELD_OFF");
        break;

    case NFC_T4T_EVENT_DATA_IND:
        NRF_LOG_INFO("%d %s", dataLength, NRF_LOG_PUSH((char*)data));
        check_nfc_data((uint8_t*)data, dataLength);
        break;

    default:
        break;
    }
}

int aika_nfc_init(void)
{
    ret_code_t err_code;

    /* NFC 설정 */
    err_code = nfc_t4t_setup(aika_nfc_callback, NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_INFO("NFC 시작.");

    /* NFC 필드 감지 시작 */
    err_code = nfc_t4t_emulation_start();
    APP_ERROR_CHECK(err_code);
}

위 코드에서는 aika_nfc_callback 함수를 NFC 이벤트 핸들러로 설정하고, nfc_t4t_setup 함수를 통해 NFC 모듈을 초기화합니다. 그런 다음 nfc_t4t_emulation_start 함수를 호출하여 NFC 필드 감지를 시작할 수 있습니다.

7. NFC 이벤트 처리

aika_nfc_callback 함수는 NFC 이벤트를 처리하는 역할을 합니다. 이 함수는 NFC 필드 감지, 데이터 전송 등의 다양한 이벤트에 대한 로그를 기록하며, 필요한 경우 추가 처리를 할 수 있습니다. 특히 데이터 수신 이벤트는 NFC_T4T_EVENT_DATA_IND로 처리됩니다.

8. NFC 응답 데이터 전송

nRF52는 NFC를 통해 수신한 데이터를 처리하고, 응답 데이터를 전송할 수 있습니다. 응답 데이터는 nfc_t4t_response_pdu_send 함수를 사용하여 전송됩니다.

ret_code_t nfc_send_response(uint8_t* data, uint16_t data_size){
    ret_code_t err_code;

    err_code = nfc_t4t_response_pdu_send((const uint8_t*)data, (size_t)data_size);
    if(NRF_SUCCESS != err_code)
        NRF_LOG_ERROR("%s %d", __func__, err_code);

    return err_code;
}

void check_nfc_data(uint8_t* data, uint16_t dataLength)
{
    if(0 == strncmp("android-5", (char*)data, dataLength))
    {
        nfc_send_response((uint8_t*)"last", 4);
        return;
    }

    nfc_send_response((uint8_t*)"data", 4);
}

이 코드는 NFC로 수신한 데이터를 확인한 후, 조건에 따라 적절한 응답을 전송하는 로직을 담고 있습니다. 예를 들어, 수신한 데이터가 "android-5"라는 문자열일 경우 "last"라는 데이터를 응답으로 전송합니다.

9. 결론

NFC는 간편하고 빠른 데이터 교환과 결제 서비스를 제공하여 다양한 IoT(사물인터넷) 및 무선 통신 응용 분야에서 널리 사용됩니다. 특히 nRF52 시리즈는 NFC 기능을 활용하여 BLE 장치 간 연결 설정, 인증, 데이터 전송 등의 용도로 활용할 수 있습니다. 저전력 설계로 배터리 수명도 향상시킬 수 있어 IoT 장치 개발에 매우 유용합니다.

nRF52에서 NFC를 구현하는 것은 매우 간단합니다. SDK에서 제공하는 NFC 라이브러리와 드라이버를 추가하고, 적절한 콜백 함수와 설정을 통해 빠르게 NFC 기능을 활성화할 수 있습니다. NFC는 앞으로도 다양한 분야에서 더욱 발전하고, 활용될 가능성이 높은 기술입니다.

반응형