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 노드의 특정 객체를 읽고 쓰는 실습을 진행합니다.
SDO 서버 설정
- Object Dictionary에서 특정 변수를 정의합니다.
- 예제: 0x2000 인덱스의 32비트 변수를 생성
uint32_t myVariable = 0x12345678;
SDO 읽기 요청 처리
- SDO 클라이언트가 0x2000 인덱스 데이터를 요청할 경우, 해당 값을 응답
uint32_t handleSDORead(uint16_t index) { if (index == 0x2000) { return myVariable; } return 0; }
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를 설정하고 데이터를 송수신하는 실습을 진행합니다.
PDO 매핑 설정
- TPDO 및 RPDO에 사용할 변수를 정의
uint16_t sensorData = 0x1234; uint16_t controlCommand = 0x0000;
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); }
RPDO 수신 설정
- 수신된 제어 명령을 변수에 저장
void receiveRPDO(uint8_t *data) { controlCommand = data[0] | (data[1] << 8); }
PDO 활성화 및 주기적 전송
- 타이머 인터럽트를 이용하여 주기적으로 TPDO를 전송
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { sendTPDO(); } }
테스트 및 검증
SDO 및 PDO 설정이 완료되면, CAN 분석기를 사용하여 통신을 검증합니다.
SDO 검증
- CAN 분석 소프트웨어에서 특정 SDO 요청을 보내고 응답을 확인
PDO 검증
- TPDO 데이터가 주기적으로 전송되는지 확인
- RPDO 데이터를 수신하여 변수 업데이트 여부 확인
결론
이번 실습에서는 STM32F429와 CANOpen을 이용하여 SDO/PDO 통신을 설정하고 테스트하였습니다. SDO를 통해 설정 데이터를 읽고 변경하는 방법을 익혔으며, 실시간 데이터 전송을 위해 PDO를 구성하고 송수신하는 방법을 실습하였습니다. 이를 기반으로 보다 복잡한 CANOpen 네트워크를 구성할 수 있습니다.
'CAN > CAN Open' 카테고리의 다른 글
CANOpen 네트워크 테스트 및 디버깅 (0) | 2025.08.09 |
---|---|
CANOpen 스택 포팅 방법(STM32F429) (0) | 2025.08.07 |
STM32F429의 CAN 컨트롤러 특징 및 설정 방법 (0) | 2025.08.06 |
CANOpen 노드 구현 (STM32CubeIDE 및 HAL 활용) (0) | 2025.08.05 |
CANOpen 스택 구조 분석 (0) | 2025.08.04 |