본문 바로가기
임베디드.일렉트로닉스/nRF52

nRF52840. USB CDC (com 포트) 구현.

by i.got.it 2020. 11. 18.



개요

- 타겟보드 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





댓글



 

비트코인




암호화폐       외환/나스닥/골드         암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)         프랍 트레이더 온라인 지원가능. MT4,MT5