CAN/CAN Open

CANOpen SDO/PDO 통신 실습 (STM32F429)

임베디드 친구 2025. 8. 8. 20:41
728x90
반응형

CANOpen SDO/PDO 통신 실습 (STM32F429)

개요

SDO (Service Data Object)와 PDO (Process Data Object)는 CANOpen 프로토콜에서 가장 중요한 데이터 전송 메커니즘입니다. SDO는 노드 간 설정 값을 읽거나 변경하는 데 사용되며, PDO는 실시간 데이터 교환을 위해 설계되었습니다. 본 장에서는 STM32F429와 CANOpen 스택을 이용하여 SDO 및 PDO 통신을 설정하고 실습하는 방법을 설명합니다.

실습 환경 설정

SDO/PDO 통신을 실습하기 위해 다음과 같은 개발 환경이 필요합니다.

  • 하드웨어

    • STM32F429 개발 보드
    • CAN 트랜시버 (MCP2551 또는 TJA1050 등)
    • CAN 통신을 위한 USB-CAN 인터페이스 (PEAK-System PCAN 또는 Lawicel CANUSB 등)
    • 120Ω 터미네이션 저항
  • 소프트웨어

    • STM32CubeIDE
    • STM32CubeMX
    • CANopenNode 또는 CANFestival 라이브러리
    • CAN 분석 소프트웨어 (PCAN-View, BusMaster 등)

SDO (Service Data Object) 개념 및 실습

SDO 개념

SDO는 노드 간 데이터를 읽거나 변경하는 데 사용되는 프로토콜로, Master-Slave 방식으로 동작합니다.

  • 클라이언트 (Master): 데이터 요청을 보내는 노드
  • 서버 (Slave): 데이터를 제공하거나 변경하는 노드

SDO 프레임 구조는 다음과 같이 구성됩니다.

Byte 내용
0 명령 (Command Specifier)
1-3 인덱스 및 서브 인덱스
4-7 데이터 값

SDO 실습

SDO를 이용하여 STM32F429 노드의 특정 객체를 읽고 쓰는 실습을 진행합니다.

  1. SDO 서버 설정

    • Object Dictionary에서 특정 변수를 정의합니다.
    • 예제: 0x2000 인덱스의 32비트 변수를 생성
    uint32_t myVariable = 0x12345678;
  2. SDO 읽기 요청 처리

    • SDO 클라이언트가 0x2000 인덱스 데이터를 요청할 경우, 해당 값을 응답
    uint32_t handleSDORead(uint16_t index) {
        if (index == 0x2000) {
            return myVariable;
        }
        return 0;
    }
  3. SDO 쓰기 요청 처리

    • 클라이언트가 새로운 값을 보내면 해당 변수를 업데이트
    void handleSDOWrite(uint16_t index, uint32_t value) {
        if (index == 0x2000) {
            myVariable = value;
        }
    }

PDO (Process Data Object) 개념 및 실습

PDO 개념

PDO는 실시간 데이터를 전송하는 프로토콜로, SDO와 달리 데이터를 빠르게 송수신할 수 있도록 설계되었습니다.

  • TPDO (Transmit PDO): 노드가 데이터를 전송하는 경우
  • RPDO (Receive PDO): 노드가 데이터를 수신하는 경우

PDO는 사전 정의된 매핑 테이블을 사용하여 데이터를 송수신합니다.

PDO 실습

STM32F429에서 PDO를 설정하고 데이터를 송수신하는 실습을 진행합니다.

  1. PDO 매핑 설정

    • TPDO 및 RPDO에 사용할 변수를 정의
    uint16_t sensorData = 0x1234;
    uint16_t controlCommand = 0x0000;
  2. TPDO 전송 설정

    • 주기적으로 센서 데이터를 TPDO로 전송
    void sendTPDO(void) {
        CAN_TxHeaderTypeDef txHeader;
        uint8_t data[2];
    
        txHeader.StdId = 0x180 + NODE_ID;
        txHeader.DLC = 2;
        data[0] = sensorData & 0xFF;
        data[1] = (sensorData >> 8) & 0xFF;
    
        HAL_CAN_AddTxMessage(&hcan, &txHeader, data, &txMailbox);
    }
  3. RPDO 수신 설정

    • 수신된 제어 명령을 변수에 저장
    void receiveRPDO(uint8_t *data) {
        controlCommand = data[0] | (data[1] << 8);
    }
  4. PDO 활성화 및 주기적 전송

    • 타이머 인터럽트를 이용하여 주기적으로 TPDO를 전송
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
        if (htim->Instance == TIM2) {
            sendTPDO();
        }
    }

테스트 및 검증

SDO 및 PDO 설정이 완료되면, CAN 분석기를 사용하여 통신을 검증합니다.

  1. SDO 검증

    • CAN 분석 소프트웨어에서 특정 SDO 요청을 보내고 응답을 확인
  2. PDO 검증

    • TPDO 데이터가 주기적으로 전송되는지 확인
    • RPDO 데이터를 수신하여 변수 업데이트 여부 확인

결론

이번 실습에서는 STM32F429와 CANOpen을 이용하여 SDO/PDO 통신을 설정하고 테스트하였습니다. SDO를 통해 설정 데이터를 읽고 변경하는 방법을 익혔으며, 실시간 데이터 전송을 위해 PDO를 구성하고 송수신하는 방법을 실습하였습니다. 이를 기반으로 보다 복잡한 CANOpen 네트워크를 구성할 수 있습니다.

728x90
반응형