비동기 방식으로 UART Receive(데이터 수신)을 시도하던 중,

 

UART_EVENT_RX_CHAR and UART_EVENT_RX_COMPLETE

events are not fired when data comes. 

 

디버깅 시, 위 데이터 수신 이벤트들이 case문에 걸리지 않는 문제를 마주하였다.

 

void uart_callback(uart_callback_args_t *p_args){
    switch(p_args->event){
        // Transmit
        case UART_EVENT_TX_COMPLETE:
        {
            g_uart_tx_complete = true; 
            break;
        }
        // Receive
        case UART_EVENT_RX_CHAR:
        {
            g_rx_buffer[g_rx_index++] = (uint8_t)p_args->data;
            if ((uint8_t)p_args->data == END_CHARACTER || g_rx_index >= UART_RX_BUF_SIZE) {
                g_rx_buffer[g_rx_index] = '\0'; 
                g_rx_index = 0; 
                g_uart_rx_complete = true;
            }
            break;
        }
        // this event is fired when rx buffer is full
        case UART_EVENT_RX_COMPLETE:
            g_uart_rx_complete = true;
            break;
    }
}

UART 콜백함수는 위와 같다.

 

이벤트가 트리거되지 않는 이유를 확인하기 위해 여러 방법을 시도해 보았는데,

 

  • PC와 MCU를 연결하는 케이블에서 신호가 오실로스코프로 수신되는지 확인하기. 신호는 수신되었다.

 

 

  • 동기화 메서드가 기능하는지 확인했고, 정상적으로 작동하고 있었다.

동기 방식으로 작동하는지 확인하기 위해

콜백 함수에서 Receive 관련 코드를 작성하지 않고

hal_entry()의 while(1)문 내부에서 반복적으로 호출해보았다.

 

 

 

결과는 첫 번째 R_SCI_UART_Read() 호출은 성공

이후 반복적 호출에서는 8번 오류 발생

 

FSP_ERR_IN_USE = 8, ///< Channel/peripheral is running/busy

첫 번째 R_SCI_UART_Read() 호출에서 수신 완료 이벤트 발생하지 않아서

채널 또는 주변장치가 사용되고 있다는 에러가 발생한 것이다.

 

그럼 R_SCI_UART_Read() 호출은 정상작동한다는 것이다.

 

 

  • Tera Term 설정과 FSP 설정이 동일한지 확인했다. (속도, 데이터, 패리티, 스톱 비트, 플로우 컨트롤 등)

동일함을 확인했고, 플로우 컨트롤은 none으로 지정하였다.

 

  • 마지막으로 uart_callback() 함수에서 코드가 디버그 포인트에 멈추는지, 그리고 해당 사례를 디버깅했다.

UART_EVENT_RX_COMPLETE, UART_EVENT_RX_CHAR 

이벤트가 발생하지 않았다.

 

이전에 오실로스코프로 확인한 결과

PC와 MCU를 연결해주는 케이블에서 

한 글자를 Tera Term에 입력할 때마다, 신호가 가는 것은 확인했기 때문에

 

HW문제(핀 문제)인지 의심하게 되었다.

 

 

[해결책] 그런 다음 UART 핀을 100, 101에서 410, 411로 변경했는데 (FSP Configuration도 함께 변경함)

UART_EVENT_RX_COMPLETE, UART_EVENT_RX_CHAR   이벤트가 잘 fire되었다.

 

 

 

결론은, 모든 방법으로도 확인 불가하면

핀 문제인지 의심해보길.

 

-Joo-

+ Recent posts