비동기 방식으로 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-
'[2025~] Embedded > Renesas RA4M2' 카테고리의 다른 글
[ 로그 출력 함수 | C ] 시간과 함께 로그 출력 (0) | 2025.03.13 |
---|---|
[에러] PL2303HXA PHASED OUT SINCE 2012. PLEASE CONTACT YOUR SUPPLIER (0) | 2025.03.11 |