본문 바로가기

WCH/CH32V20x

CH32V208 SSM - BLE UART 테스트중 문제점 발생

CH32V208 은 28핀 QFN 패키지에 BLE 5.3이 내장되어 있어 소형의 IOT 장비 설계에 사용하면 좋을것 같다.

 

CH32V208 BLE 예제를 구동해 보자.

가장 많이 사용하는 BLE UART 예제를 테스트 해보자.

 

CH32V208 SSM 보드를 제작할 당시는 표준 핀맵을 따르고 이더넷을 지원하는 소형모듈로 제작하기 위해 BLE를 중점으로 고려하지 않았는데... 뒷면에 소형 BLE 안테나 공간이 있어 그냥 배치 해 두었다. 공간제약으로 BLE 감도가 좋지 않을것으로 예상했는데 의외로 -57dBm으로 나쁘지 않다.


기본 예제 구동해 보면 인식도 잘하고 데이터 송수도 잘된다.

 

서비스도 잘 올라 온다.

 

코드를 좀 수정해서 테스트 해 보자.

CH32V208의 경쟁 제품이라 생각되는 ESP32-C3에서 기존에 테스트 했던 BLE UART 앱으로 테스트 하면 좋을것 같다.

https://nexp.tistory.com/3753

 

ESP32-C3 - BLE5 UART 테스트

ESP32-C3를 이용하여 BLE UART를 테스트 해보자 기본 펌웨어 다운로드 하고 장치 검색하면 설정한 장치로 인식이 된다 // Create the BLE Device BLEDevice::init("ECPC3 UART"); BLE UART 초기화 #define SERVICE_UUID "6E400001

nexp.tistory.com

 

BLE 스캔시 RSP  데이터 등록 

static uint8_t scanRspData[] = {
    // complete name
    13, // length of this data
    GAP_ADTYPE_LOCAL_NAME_COMPLETE,
    'w', 'c', 'h',  '_', 'b', 'l', 'e', '_', 'u', 'a', 'r', 't',
    // connection interval range
    0x05, // length of this data
    GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,
    LO_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL), // 100ms
    HI_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL),
    LO_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL), // 1s
    HI_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL),

    // Tx power level
    0x02, // length of this data
    GAP_ADTYPE_POWER_LEVEL,
    0 // 0dBm
};

 

 

BLE UART 수신 처리 함수 수정

void app_uart_process(void)
{
#if 0
    uint8_t data;
    __disable_irq();
    if(uart_rx_flag)
    {
        tmos_start_task(Peripheral_TaskID, UART_TO_BLE_SEND_EVT, 2);
        uart_rx_flag = false;
    }
    __enable_irq();


    while(app_drv_fifo_length(&app_uart_tx_fifo))
    {
        app_drv_fifo_read_to_same_addr(&app_uart_tx_fifo, (uint8_t *)&data, 1);
        USART_SendData(USART3, data);
        while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET) /* waiting for sending finish */
        {
        }
    }
#endif

//ble uart service callback handler
void on_bleuartServiceEvt(uint16_t connection_handle, ble_uart_evt_t *p_evt)
{
    switch(p_evt->type)
    {
        case BLE_UART_EVT_TX_NOTI_DISABLED:
            PRINT("%02x:bleuart_EVT_TX_NOTI_DISABLED\r\n", connection_handle);
            break;
        case BLE_UART_EVT_TX_NOTI_ENABLED:
            PRINT("%02x:bleuart_EVT_TX_NOTI_ENABLED\r\n", connection_handle);
            break;
        case BLE_UART_EVT_BLE_DATA_RECIEVED:
            PRINT("BLE RX DATA len:%d\r\n", p_evt->data.length);

            //for notify back test
            //to ble
            /*
            uint16_t to_write_length = p_evt->data.length;
            app_drv_fifo_write(&app_uart_rx_fifo, (uint8_t *)p_evt->data.p_data, &to_write_length);
            tmos_start_task(Peripheral_TaskID, UART_TO_BLE_SEND_EVT, 2);
            //end of nofify back test
            */

            //ble to uart
            app_uart_tx_data((uint8_t *)p_evt->data.p_data, p_evt->data.length);

            /*
            for(int i=0;i<p_evt->data.length;i++)
            {
                PRINT("%02x ", p_evt->data.p_data[i]);
            }*/

            break;
        default:
            break;
    }
}

 

 

#문제 발생

테스트 결과 기존 앱에서 인식이 되 않는다.
기존 앱과 비교해 보면 16비트 UUID라 기존 사용했던 APP에서 인식을 못하는것 같다.

 

ble 접속해서 자세히 보기를 하면 Incomplete List of 16-bit Service UUID 가 0x9ECA로 나온다

 

 

잘 동작하는 ESP32-C3는 Complete list of 128-bit Service 로 나온다
이것이 문제 일것 같다. 

 

128BIT UUID로 바꿔 볼까?
간단하지가 않네…

16비트 UUID예제를 128비트로 바꾸려 해도 쉽지가 않다.
서비스 등록 에러가 발생한다.

CH32V20x_BLE_LIB_V1.20
Add ble uart service failed!
Initialized..
Advertising..

 

아 역시... 또 문제가 발생 하는구나.

ble_uart_service.c 파일 내용을 ble_uart_service_16bit.c에  적용하하고 코드 좀 수정하니 정상 동작 한다. 

하지만 좀더 테스트가 필요할것 같다. 다시 한번 느끼지만 중국산 칩을 프로젝트에 적용하려면 많은 테스트가 필요할것 같다.

 

 

UUID 128비트로 코드 수정

static uint8_t advertData[] = {
    // Flags; this sets the device to use limited discoverable
    // mode (advertises for 30 seconds at a time) instead of general
    // discoverable mode (advertises indefinitely)
    0x02, // length of this data
    GAP_ADTYPE_FLAGS,
    //DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
    DEFAULT_DISCOVERABLE_MODE|GAP_ADTYPE_FLAGS_GENERAL,

    // service UUID, to notify central devices what services are included
    // in this peripheral
    0x03,                  // length of this data
    //GAP_ADTYPE_128BIT_COMPLETE,
    GAP_ADTYPE_16BIT_MORE, // some of the UUID's, but not all
    LO_UINT16(SIMPLEPROFILE_SERV_UUID),
    HI_UINT16(SIMPLEPROFILE_SERV_UUID)
};

 

 

이제 CH32V208으로도 16bit UUID로 인식되고 서비스가 등록된것을 확인 할 수 있다.



BLE UART 앱으로 가장 유명한 Thermal 프로그램으로도 확인 해 보자

BLE 디바이스 검색 하면 wch_ble_uart로  잘 인식이 된다.

 

 

동작 테스트 하면 BLE UART로 loopback 되는것을 확인 할 수 있다.

 

 

 

결론

아직은 출시되지 얼마되지 않는 칩이라 제공 되는 예제나 서비스에 문제가 있는것은 맞는것 같다. 중국산 칩을 프로젝트에 적용하려면 많은 테스트가 필요할것 같다. 하지만 특정 분야헤 충분한 테스트를 한다면 저렴하고 컴팩트한 칩으로 사용하기 좋을것 같다.

반응형