개요

- 타겟보드 nRF52840 동글 에서 USB CDC (호스트에서 com 포트로 인식되는것) 구현 방법 정리. 


- nRF5 SDK 에서 예제로 제공되는 /example/peripheral/usb_cdc_acm (프로젝트 설명문) 의 소스코드를 참조하여 자신의 프로젝트에서 USB CDC 구현하는 방법 세부적인 과정을 보이고 최종 정상 작동하는 프로젝트 소스 다운로드 가능.


- 예제 프로그램은 usb 구현위한 핵심정보를 제공함에는 부족함이 있다. 노르딕사의 예제들의 한심한 특징 : 단일 기능 위주를 먼저 제시하는 방식이 학습자에게는 도움이 되는데 이런 저런 기능을 덕지 덕지 붙여둔 예제들이 많다. 따라서 예제만 보면 해당 특정기능의 핵심 개념이해에 별 도움되지는 않는다. 예제에서 사용되고 있는 라이브러리 설명문을 반드시 보면서 핵심개념 이해해야한다. 본 usb 예제에서 사용되는 라이브러리는 USB device library 이며 설명문은 웹에서 바로 제공된다. -> 보기 클릭.






타겟보드 : nRF52840 Dongle






프로젝트 IDE 환경 

SES(SEGGER Embedded Studio) 에서 프로젝트 템플릿 기반. 상세보기 -> https://igotit.tistory.com/2042




샘플프로젝트 참조하면서 본인 프로젝트에서 USB CDC 구현하는 전체 과정 상세

- 본 글에서 시작하는 프로젝트는 템플릿 프로젝트 ( 상세보기 -> https://igotit.tistory.com/2042 가장 간단한 GPIO 출력하는 기능이 전부인 텅빈 프로젝트임) 를 시작점으로 하여 만든 myProject 에서 Clock Control 구현된 상태에서 추가로 USB CDC 작업 진행한다. 


소요시간 : 1시간.

- 최종 USB CDC 기능하는 심플한 프로젝트 파일 본 글 하단에서 다운로드 가능하니 아래 동영상 과정은 참조만 하기.

- 학습 목적이라면 이 동영상의 내용대로 따라서 해보는것 도움됨.  


2020. 11. 18 추가  아래 영상에서 작업하는 개발환경은 매우 비효율적임. 신규로 프로젝트 작업 환경 구축한 https://igotit.tistory.com/2308   의 형식으로 프로젝트 환경 만는것이 훨씬 컴팩트하고 유용함. 








위 동영상에서는 컴파일 오류없이 성공적으로 빌드 되는것까지만 보이고 있으며, 위 상태로는 아직 부족하다. 추가로 처리해줘야 할 사항이 있다. 


USB CDC 정상작동 하는 코드 최종

아래 그림의 nRF5_SDK 에서 사용되는 것중 nRF_Drivers 의 nrfx_power_clock.c 필수 포함시켜야 한다. 아래 그림에서 파일중 아이콘 디스에이블(컴파일러에서 제외시킨 표시임) 된것 외에는 모두 포함시키면됨. 




sdk_config.h 에서 필수 설정되어야 할 항목 


아래 그림에서 붉은색 밑줄 쳐진것들을 enable 시켜야 한다.  그외 나머지 항목들은  활성화 하든 비활성화 하든 USB CDC 동작에는 아무런 영향 미치지 않는다. 



 위 설정에서 POWER_ENABLED 라는 설정은 MCU 의 전원부 인터럽트 처리 목적으로 활성화 시킨 것인데, USB 사용하면서 이 기능이 필요한 이유는 USB BUS 전원 검출 기능 때문이다. USB BUS 전원 검출기능 인에이블은 아래 그림의 붉은 색 박스 부분에서 설정한다. 




USB CDC 동작 시험용 룹백 코드 추가  

시험목적으로 nRF52840 에서 USB CDC Rx 로 데이터 수신된 경우 그 데이터를 모두 다시 USB CDC Tx 로 출력하는 시험용 구문을 추가하자. 아래 코드에서 파란색 부분.


 

static void cdc_acm_user_ev_handler ()

{

...


        case APP_USBD_CDC_ACM_USER_EVT_RX_DONE:
        {
            ret_code_t ret;
//            NRF_LOG_INFO("Bytes waiting: %d", app_usbd_cdc_acm_bytes_stored(p_cdc_acm));
            app_usbd_cdc_acm_bytes_stored(p_cdc_acm);
            do
            {
                /*Get amount of data transfered*/
                size_t size = app_usbd_cdc_acm_rx_size(p_cdc_acm);
//                NRF_LOG_INFO("RX: size: %lu char: %c", size, m_rx_buffer[0]);

                /* Fetch data until internal buffer is empty */
                ret = app_usbd_cdc_acm_read(&m_app_cdc_acm,
                                            m_rx_buffer,
                                            READ_SIZE);
            } while (ret == NRF_SUCCESS);

            memcpy(m_tx_buffer,m_rx_buffer,READ_SIZE);
            app_usbd_cdc_acm_write(&m_app_cdc_acm, m_tx_buffer, READ_SIZE); //

            bsp_board_led_invert(LED_CDC_ACM_RX);
            break;
        }
...

}




USB CDC 동작시험 

상기 코드를 보드에 기록하고,  PC 로 연결하여 하이퍼 터미널에서 키보드 문자를 보드로 전송하고 보드에서는 해당 키보드 문자를 다시 PC 로 보낸것을 하이퍼 터미널에서 확인. 







프로젝트 소스 다운로드

여기 까지의 프로젝트 소스 첨부.

- 본인 프로젝트에서 USB CDC 구현하기 위하여 앞의 동영상에서의 1시간 짜리 동일 노동 할 필요없이 다운로드 받아서 활용 가능.  


파일명  nRF52840_USBCDC_igotit.zip  






USB CDC 드라이버 설치 

- 앞에서 만들어진 펌웨어를 보드에 기록된 것을 PC에 연결하면  USB 인식과정 진행되면서 윈도우 10(8이상) 은 자동으로 드라이버가 설치되나 윈도우 7인 경우에는 수동으로 드라이버 설치해야 정상 인식된다. 

윈도우 7 에서 드라이버 설치법 상세보기 -> https://igotit.tistory.com/2038





USB CDC 관련 코드의 main while 문에서의 주의사항 

본 코드의 main 의 while 문 내에 지연함수가 있고, 지연시간이 500msec 정도로 길게 설정하면 USB 연결시 정상 인식되지 않는다. 지연시간이 10msec 정도에서는 정상인식함. 즉 지연이  USB 인식과정(아래 코드의 파랑 박스부분)을 방해하고 있음. 







 본 글 포함된 상위 정리글


 https://igotit.tistory.com/244 의 nRF52





첫등록 : 2019년 1월 15일

최종수정 : 2020.11.18


본 글 단축주소 : https://igotit.tistory.com/2037





Posted by 리치굿맨

댓글을 달아 주세요

  1. ojm

    안녕하세요, 본 예제를 이용해서 프로젝트를 진행해보려는 임베디드 개발을 배우고 있는 학생입니다.
    조금 질문을 드리고 싶은게 있는데 혹시 조금 대화를 할 수 있을까요...?ㅠ

    2019.10.26 00:24 [ ADDR : EDIT/ DEL : REPLY ]
    • 본 예제에서 사용되는 프로젝트 폴더 재구성(템플릿2라고 부르고 있는것)하여 USB CDC 구현예를 보이고 있는데요. 비효율적이어서 프로젝트 폴더 재구성 https://igotit.tistory.com/2308 방식을 사용해야 합니다.

      위 링크에 보면 nRF5 SDK 예제를 가져오는 설명부분과 동일하게 USB CDC 예제를 본인 프로젝트에 가져오면 됩니다.

      혹은 , 굳이 프로젝트 폴더 재구성할 필요 없는 경우엔 바로 예제 프로젝트에서 작업해도 됩니다.

      참고.
      nRF5 SDK 예제로 제공되는 프로젝트 구성 방식을 이용해도 되기 때문에 프로젝트 폴더 재구성은 필수는 아닙니다. 프로젝트 폴더 재구성은 nRF52 칩 프로젝트를 상당기간 개발해야 하는 경우엔 효율적이나, 그외 잠시 사용해 볼 때는 필수 아니예요.

      2019.10.27 13:46 신고 [ ADDR : EDIT/ DEL ]
  2. calivan

    올려주신 최종 hex 파일을 nrf connect를 통해 동글 보드에 올렸는데
    올려주신 코드를 build 시킨 hex 파일만 업로드 하면되는것인가요?
    업로드 해도 장치관리자에서 기타 장비 등으로 표시가 안되네요 ㅠ 동글에 불도 안들어오고....ㅠㅠㅠ

    2020.11.18 17:48 [ ADDR : EDIT/ DEL : REPLY ]
    • 지금 다시 보니 글 내용중 프로젝트 환경 구축하는게 초창기 작업시 사용했던 거네요.. 매우 비효율적인 구성이었습니다. 영상 상단에 2020. 11.18 일 추가 부분에 설명고 링크 추가했습니다. 이 링크 참조하여 프로젝트 개발환경 구축함이 훨씬 유용합니다.

      본 USB CDC 는 제조사에서 제공하는 샘플 그대로를 제가 선호하는 프로젝트 관리 형식에서 구현시켜 본 예입니다.

      굳이 프로젝트 개발환경을 저처럼 재구성 하지 않아도 되고요... 그냥 저는 노르딕사에서 배포된 SDK 폴더 구성이 지속 개발하는 상황에서는 관리가 번잡스러운 구조여서 관리하기 편한 형식으로 변경해서 활용하는 예일 뿐입니다.

      USB CDC 시험 작동 시켜보기 위한 가장 간단한 방법은,
      제조사에서 배포된 SDK 폴더 그대로 유지한 상태에서 샘플프로젝트를 SES 에서 빌드하여 만들어진 hex 파일을 동글에 기록하면 정상작동합니다. 그냥 하면 되어야 정상입니다.

      개발을 업으로 하는 혹은 미래 해야하는 경우라면,,,. 이런 류의 문제해결은 타인의 직접적인 도움으로 해결하는건 아무 의미도 없고 독만 됩니다.

      생업으로써의 임베디드 시스템 개발과정에서는 이런 문제들이 실제 해결대상인 경우가 펌웨어 코딩 문제 해결능력보다 더 많이 요구됩니다. ㅠㅠ

      2020.11.18 18:24 신고 [ ADDR : EDIT/ DEL ]
  3. calivan

    혹시가능하다면 카카오톡 id
    kogr2378 혹은
    이메일 kogr2378@naver.com으로 질문 자세히 여쭈어보고 싶습니다.

    2020.11.18 17:49 [ ADDR : EDIT/ DEL : REPLY ]
    • 죄송합니다. 블로그로에서만 가볍게 소통하고 있습니다. 개인 연결 경로로는 하지 않고 있어요. 양해바래요~

      2020.11.18 18:39 신고 [ ADDR : EDIT/ DEL ]