1. STM32 bxCAN/FDCAN 디버깅 및 분석 도구 개요 (작성 배경 및 취지)
자동차 및 산업용 현장에서 STM32 마이크로컨트롤러(MCU) 기반 CAN(Controller Area Network) 통신을 구현할 때 데이터 송수신 실패, Bus-Off 상태 전환, 프레임 유실 등의 문제가 자주 발생합니다. STM32의 bxCAN(Basic Extended CAN) 및 FDCAN 외장 트랜시버 회로 구성 문제, Baud Rate mismatch, 종단 저항 미설치 등은 물리 계층과 프로토콜 계층 전반에 걸쳐 예외를 유발합니다.
이 가이드는 STM32 개발 환경(STM32CubeIDE, HAL Library)에서 발생할 수 있는 CAN 통신 오류를 신속하게 추적하기 위해 작성되었습니다. PCAN-View, Vector CANalyzer, BusMaster와 같은 하드웨어 분석기와 리눅스 기반 SocketCAN 및 Wireshark 패킷 분석 도구를 통합 활용하여 신호 왜곡 및 에러 프레임을 분석하는 실무 기법을 다룹니다.
2. STM32 CAN 버스 분석 핵심 요약 (핵심 요약)
- CAN 물리 계층 검증: CAN_H와 CAN_L 양단 사이의 종단 저항(Termination Resistor)이 $120\ \Omega$ 병렬 결합되어 총 $60\ \Omega$을 유지하는지 멀티미터로 측정합니다.
- STM32 HAL 타이밍 설정: APB1 클록 분주비 및 Bit Timing Register(CAN_BTR / FDCAN_CCCR)의 Prescaler, BS1, BS2 값을 정확히 산출하여 Baud Rate 오차를 0%로 맞춥니다.
- 패킷 분석 및 필터링: 리눅스 환경에서 candump 명령어 및 Wireshark can.id == 0x123 필터를 사용하여 에러 프레임과 실시간 패킷을 디버깅합니다.
3. STM32 bxCAN/FDCAN 분석기 및 Wireshark 활용법 (상세 분석 및 구현)
3.1 상용 및 오픈소스 CAN 분석기 비교
STM32 디바이스와 통신하는 대상 노드의 패킷 분석을 위해 사용하는 주요 도구의 특징은 다음과 같습니다.
| 분석 도구 (Tool) | 인터페이스 (Interface) | 주요 기능 (Key Features) | 추천 사용 환경 (Use Case) |
|---|---|---|---|
| Vector CANalyzer | Vector VN1600 계열 | CAN/CAN-FD, LIN, Ethernet 종합 분석 및 CAPL 스크립팅 | 전장 부품 정밀 진단 및 OEM 표준 테스트 |
| PCAN-View | PEAK PCAN-USB | 실시간 데이터 캡처, 주기적 프레임 송신, 에러 카운터 모니터링 | STM32 하드웨어 초기 보드 펌웨어 검증 |
| BusMaster | Kvaser, PEAK, Vector 등 | 오픈소스, C/Python 스크립트 기반 자동화 테스트 | 비용 효율적인 프로토타입 자동화 검증 |
| Wireshark | SocketCAN (vcan/can) | PDU 패킷 디코딩, 상위 프로토콜(J1939, CANopen) 분석 | 리눅스 게이트웨이 및 임베디드 OS 연동 테스트 |
3.2 PCAN-View 및 BusMaster를 통한 STM32 모니터링
PEAK-System의 PCAN-USB 모듈을 STM32 개발 보드의 CAN 트랜시버(SN65HVD230 또는 TJA1050)에 연결합니다.
[STM32 MCU] ---> (Tx/Rx) ---> [CAN Transceiver] ---> (CAN_H/CAN_L Bus) ---> [PCAN-USB Adapter] ---> (USB) ---> [PC/PCAN-View]
- Baud Rate 동기화: STM32의 hcan.Init.Prescaler, SyncJumpWidth, TimeSeg1, TimeSeg2 설정으로 계산된 Baud Rate(예: 500 Kbps)를 PCAN-View의 Bitrate 설정과 일치시킵니다.
- Error Frame 모니터링: PCAN-View 하단의 Status 탭에서 Rx Error Counter(REC) 및 Tx Error Counter(TEC)의 상승 여부를 관찰합니다.
3.3 STM32 HAL Library CAN 송수신 및 필터 설정 코드 분석
STM32Cube Framework 기반의 bxCAN 모듈 초기화 및 송수신 구현 예제입니다.
#include "stm32f4xx_hal.h"
CAN_HandleTypeDef hcan1;
// Initialize STM32 bxCAN Peripheral
void MX_CAN1_Init(void)
{
hcan1.Instance = CAN1;
hcan1.Init.Prescaler = 6; // APB1 Clock 42MHz -> 42/6 = 7MHz
hcan1.Init.Mode = CAN_MODE_NORMAL;
hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan1.Init.TimeSeg1 = CAN_BS1_11TQ; // Nominal Bit Time = 1 + 11 + 2 = 14 TQ
hcan1.Init.TimeSeg2 = CAN_BS2_2TQ; // Bit Rate = 7MHz / 14 = 500 Kbps
hcan1.Init.TimeTriggeredMode = DISABLE;
hcan1.Init.AutoBusOff = ENABLE; // Automatic Bus-Off recovery
hcan1.Init.AutoWakeUp = DISABLE;
hcan1.Init.AutoRetransmission = ENABLE;
hcan1.Init.ReceiveFifoLocked = DISABLE;
hcan1.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan1) != HAL_OK)
{
// Initialization Error Handling
Error_Handler();
}
// Configure CAN Acceptance Filter
CAN_FilterTypeDef sFilterConfig;
sFilterConfig.FilterBank = 0;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = 0x123 << 5; // Target CAN ID: 0x123
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0xFFE0; // Mask for exact match
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.SlaveStartFilterBank = 14;
if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
{
// Filter Configuration Error
Error_Handler();
}
// Start CAN Peripheral and Activate Interrupt
HAL_CAN_Start(&hcan1);
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_ERROR_WARNING | CAN_IT_BUSOFF);
}
// Transmit CAN Frame From STM32
uint32_t Send_CAN_Message(uint32_t stdId, uint8_t* pData, uint8_t length)
{
CAN_TxHeaderTypeDef TxHeader;
uint32_t TxMailbox;
TxHeader.StdId = stdId;
TxHeader.ExtId = 0x01;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.IDE = CAN_ID_STD;
TxHeader.DLC = length;
TxHeader.TransmitGlobalTime = DISABLE;
if (HAL_CAN_AddTxMessage(&hcan1, &TxHeader, pData, &TxMailbox) != HAL_OK)
{
// Transmission Request Error
return 0;
}
return TxMailbox;
}
3.4 Wireshark 및 Linux SocketCAN을 이용한 패킷 분석
리눅스 호스트 시스템(Raspberry Pi 또는 PC)과 USB-to-CAN 어댑터를 연결하여 STM32의 데이터를 Wireshark로 분석합니다.
- SocketCAN 인터페이스 활성화 (Terminal):
# Set CAN interface baud rate to 500Kbps and bring it up sudo ip link set can0 type can bitrate 500000 sudo ip link set up can0- Wireshark 패킷 캡처 및 Display Filter 설정:
- Wireshark 실행 후 can0 인터페이스 선택.
- 특정 CAN ID 매칭: can.id == 0x123
- 데이터 길이 필터링: can.len == 8
- 에러 프레임만 표시: can.flags.error == 1
4. STM32 CAN 실무 디버깅 및 도구 활용 팁 (개발을 위한 팁)
- STM32CubeMX Bit Timing 계산: CAN_BTR 계산 시 APB1 외장 클록(PCLK1) 명세를 반드시 확인해야 합니다. Clock Tree에서 PCLK1 frequency를 명확히 파악하고 Prescaler와 TQ(Time Quanta) 합을 조정하여 정확한 Bit Rate를 도출합니다.
- 오실로스코프를 이용한 차동 신호 검증: 통신 불량 시 CAN_H와 CAN_L의 차동 전압(Dominant: $V_{diff} \approx 2.0\text{V}$, Recessive: $V_{diff} \approx 0\text{V}$)을 확인하여 트랜시버 파손 및 노이즈 간섭 여부를 물리 계층에서 직접 측정합니다.
- Linux can-utils CLI 도구 활용:
# Display real-time CAN traffic with timestamps and bit errors candump -tz -cae can0,0:0,#FFFFFFFF # Send periodic frame to STM32 for stress test cansend can0 123#1122334455667788
5. STM32 CAN 통신 주요 에러 원인 및 대응법 (흔히 하는 실수)
| 에러 유형 (Error Type) | 하드웨어/소프트웨어 원인 (Root Cause) | 해결 프로세스 (Resolution) |
|---|---|---|
| ACK Error | 버스 상에 STM32 외에 메시지를 수신/응답(ACK)할 노드가 없음 | 최소 2개 이상의 정상 동작 노드를 버스에 연결하거나 CAN 분석기의 ACK 생성 기능 활성화. |
| Bit Stuff Error | STM32와 분석기 간 Baud Rate 불일치로 인한 스태핑 비트 위치 오류 발생 | STM32 Prescaler, BS1, BS2 레지스터 값 재계산 및 분석기 Baud Rate 재설정. |
| Bus-Off State | 연속적인 Tx/Rx 오류로 TEC > 255 도달하여 STM32 CAN 컨트롤러 비활성화 | hcan.Init.AutoBusOff = ENABLE 설정으로 자동 복구를 활성화하거나 HAL_CAN_ResetError() 호출. |
| Form/CRC Error | CAN_H, CAN_L 배선 반대 연결 또는 $120\ \Omega$ 종단 저항 누락으로 인한 신호 반사 및 노이즈 | CAN 버스 양 끝단에 $120\ \Omega$ 종단 저항(총 $60\ \Omega$) 추가 및 꼬임선(Twisted Pair) 사용. |
6. STM32 CAN 시스템 디버깅 요약 (마무리)
STM32 시스템의 CAN 통신 문제를 해결하기 위해서는 물리 계층의 종단 저항 및 차동 전압 확인부터 MCU의 Bit Timing 레지스터 설정까지 단계별 검증이 필요합니다. PCAN-View 및 Wireshark와 같은 패킷 분석기를 결합하여 에러 프레임을 수집하고, STM32 HAL Library의 필터 및 Auto Bus-Off 설정을 올바르게 구현함으로써 안정적인 임베디드 CAN 네트워크 시스템을 구축할 수 있습니다.
'Industrial Communication > CAN Bus: Protocol & Physical Layer' 카테고리의 다른 글
| STM32 CANopen vs SAE J1939 프로토콜 비교 및 STM32CubeHAL 구현 방법 (0) | 2025.03.02 |
|---|---|
| STM32 CAN FD 프로토콜 동작 원리 및 FDCAN HAL 드라이버 구현 가이드 (0) | 2025.03.01 |
| STM32 bxCAN HAL 드라이버 기반 다중 노드 CAN 통신 구현 및 Bus-Off 에러 분석 가이드 (0) | 2025.02.27 |
| STM32 SPI 기반 MCP2515 CAN 컨트롤러 인터페이스 구현 및 HAL 드라이버 개발 (0) | 2025.02.26 |
| STM32 bxCAN HAL 드라이버 구현: Bit Timing 계산부터 Filter Bank 설정 및 Bus-Off 예외 처리까지 (0) | 2025.02.25 |