Industrial Communication/CAN Bus: Protocol & Physical Layer

STM32 CAN 통신 디버깅 및 분석 가이드: SocketCAN, Wireshark, PCAN-View 및 Error Frame 분석

임베디드 친구 2025. 2. 28. 08:53
반응형

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]
  1. Baud Rate 동기화: STM32의 hcan.Init.Prescaler, SyncJumpWidth, TimeSeg1, TimeSeg2 설정으로 계산된 Baud Rate(예: 500 Kbps)를 PCAN-View의 Bitrate 설정과 일치시킵니다.
  2. 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로 분석합니다.

  1. SocketCAN 인터페이스 활성화 (Terminal):
  2. # 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
  3. 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 네트워크 시스템을 구축할 수 있습니다.


STM32도 함께 공부하세요.

반응형