TMS320F28X 개발보드 V2 예제
[F28P65x / CPU1] 28X 칩 한 개로 Modbus RTU 마스터와 슬레이브를 RS485 선로로 연결해 스스로 점검하는 예제 (PC 없이 보드 한 장, DriverLib
1. 실습 안내
본 예제는 TMS320F28P65x(F28P650DK9 산업용 / F28P659DK8-Q1 차량용) 제어 모듈이 탑재된 TMS320F28X 개발보드(EVM) V2를 대상으로 합니다.개발보드의 '(16) RS485/422 트랜시버' 회로에는 트랜시버가 2채널 있습니다. 한쪽에는 Modbus RTU 슬레이브(SCI-B), 다른 쪽에는 같은 칩 안의 Modbus RTU 마스터(UARTB)를 연결하고, 두 트랜시버의 선로 쪽 핀을 점퍼선 2가닥으로 이어 실제 RS485 선로로 서로 통신하게 합니다. PC, USB-RS485 어댑터, PLC가 필요 없습니다.
마스터는 시험 항목 17개를 계속 반복해서 보내고 응답을 검사합니다. 통과·실패 횟수는 CCS Watch 창에서 봅니다.
- 읽기·쓰기 기능 코드 : FC 01 / 02 / 03 / 04 / 05 / 06 / 0F / 10
- 예외 응답 : 없는 주소 읽기(02), 지원하지 않는 기능 코드(01)
- 응답이 없어야 하는 경우 : CRC가 틀린 요청, 다른 슬레이브 주소, 방송(주소 0)
- 코일 쓰기는 LED(GPIO0~15)에, 홀딩 레지스터 0은 PWM 듀티에 반영됩니다. LED와 PWM은 연결했을 때만 눈에 보입니다.
F28P65x에는 SCI가 A, B 두 개뿐이라 두 번째 채널은 UART 모듈(UARTB)을 씁니다. 마스터는 기다리지 않는 상태기계라서 같은 칩의 슬레이브 수신이 끊기지 않습니다.
2. 실습 준비
본 예제는 아래의 개발환경에서 컴파일/링크를 확인했습니다.1) CCS 버전 : Code Composer Studio v20 / v21 (Theia)
2) 컴파일러 버전 : TI v25.11.1.LTS (이 버전에서 경고 없이 컴파일/링크를 확인했습니다)
3) 개발보드 : TMS320F28X 개발보드 V2
4) 프로세서 모듈 : 싱크웍스 TMS320F28P65x 모듈 (F28P650DK9 / F28P659DK8-Q1)
5) 예제버전 : v1.00
6) 기타 : 점퍼 케이블 10개 (신호 8개 + 선로 2개), JTAG 에뮬레이터. 시리얼 터미널은 필요 없습니다.
7) 프로젝트 구성 : DriverLib 버전 1개 (TI 표준 HAL API 라이브러리 사용, 폴더만 복사해도 빌드되는 자기완결형)
8) 확인 범위 : 시험 항목 17개와 슬레이브 코어를 PC에서 맞춰 통과했고, 판정 함수가 어긋난 응답을 잡아내는지도 PC에서 확인했습니다. 펌웨어는 CPU1_RAM, CPU1_FLASH 두 구성 모두 컴파일/링크가 됩니다. 보드에서의 실제 송수신(UARTB, 트랜시버 2, 점퍼 결선)은 아직 확인하지 않았습니다.
3. 실습 예제 다운로드 (GitHub ZIP 다운로드 안내)
초보자분들도 손쉽게 다운로드하여 사용하실 수 있도록 전체 소스 코드를 GitHub에 공개해 두었습니다.아래 안내에 따라 ZIP 압축 파일로 다운로드하세요.
[다운로드 순서]
① 아래의 링크를 클릭하여 GitHub 저장소 페이지로 이동합니다.
>> [GitHub] EVM_V2_F28P65x_16_ModbusRtu_Selftest 저장소 바로가기
(※ 다이렉트 ZIP 다운로드 : EVM_V2_F28P65x_16_ModbusRtu_Selftest.zip 클릭하여 바로받기)
② GitHub 페이지 우측 상단의 초록색 <> Code ▼ 버튼을 클릭합니다.
③ 나타나는 메뉴 맨 아래의 Download ZIP 항목을 클릭하여 압축 파일을 다운로드합니다.
④ 다운로드한 ZIP 파일의 압축을 해제합니다.
- 권장 설치 경로 : C:/SyncWorks/TMS320F28X_EVM_V2_28P65x/16_ModbusRtu_Selftest
(※ 주의 : 경로 상에 한글이나 공백이 포함되지 않도록 주의해 주세요.)
4. CCS 프로젝트 불러오기 (CCS V20 기준) 및 컴파일
>> [유튜브] CCS V20 예제 프로젝트 불러오기 방법 소개 영상① Code Composer Studio(CCS)를 실행합니다.
② 상단 메뉴에서 File > Import Projects... 를 클릭합니다.
③ Specify Search Directory 버튼을 눌러 앞서 압축을 해제한 폴더를 선택합니다. (ZIP 파일을 바로 "Select archive file"로 지정해도 됩니다.)
④ 검색된 프로젝트 목록에서 12_ModbusRtu_Selftest_Driverlib를 체크하여 선택합니다.
⑤ Finish 버튼을 클릭하여 프로젝트를 워크스페이스로 불러옵니다.
⑥ 프로젝트를 마우스 우클릭하여 Build Project를 수행합니다. (CPU1_RAM은 디버깅용, CPU1_FLASH는 전원을 껐다 켜도 실행)
5. 예제 실행을 위한 하드웨어 점퍼선 연결 안내
아래와 같이 F28P65x 모듈의 핀-헤더와 개발보드 (16) RS485/422 트랜시버의 신호 핀-헤더를 점퍼 케이블로 연결합니다. 슬레이브는 A Side, 마스터는 B Side 핀-헤더를 사용합니다.| 번호 | 신호 | EVM V2 핀-헤더 | 할당 신호명 | 연결 대상 |
| 1 | 슬레이브 RX | A Side 63번 핀 | GPIO87 / SCIB_RX | (16) 블록 "RXA" |
| 2 | 슬레이브 TX | A Side 61번 핀 | GPIO86 / SCIB_TX | (16) 블록 "TXA" |
| 3 | 슬레이브 /RE1 | A Side 59번 핀 | GPIO85 (수신 허용, Low 활성) | (16) 블록 "/RE1" |
| 4 | 슬레이브 DE1 | A Side 57번 핀 | GPIO84 (송신 허용, High 활성) | (16) 블록 "DE1" |
| 5 | 마스터 RX | B Side 51번 핀 | GPIO45 / UARTB_RX | (16) 블록 "RXB" |
| 6 | 마스터 TX | B Side 53번 핀 | GPIO44 / UARTB_TX | (16) 블록 "TXB" |
| 7 | 마스터 /RE2 | B Side 47번 핀 | GPIO49 (수신 허용, Low 활성) | (16) 블록 "/RE2" |
| 8 | 마스터 DE2 | B Side 49번 핀 | GPIO48 (송신 허용, High 활성) | (16) 블록 "DE2" |
| 9 | 선로 + | (16) 회로 아래쪽 신호 핀-헤더 | R1+ ↔ R2+ | 점퍼선으로 직접 연결 |
| 10 | 선로 - | (16) 회로 아래쪽 신호 핀-헤더 | R1- ↔ R2- | 점퍼선으로 직접 연결 |
* 개발보드 Bottom면의 RS485/422 선택 스위치를 RS485 쪽으로 놓으세요. 종단 저항 스위치(Bottom면)는 조립 기본 상태 그대로 두면 됩니다.
* PC의 USB-RS485 어댑터는 연결하지 마세요. 이 예제는 보드 혼자 시험합니다.
* 마스터 신호 4개(47, 49, 51, 53번)는 B Side에 한 줄로 모여 있어 짧은 점퍼선으로 연결할 수 있습니다. F28P65x에서 UARTB가 나오는 핀은 GPIO44/45, GPIO70/71, GPIO222/223뿐이고 222/223은 JTAG 핀이라 GPIO44/45를 골랐습니다.
* B Side 55·57번(GPIO41, 40)은 다른 예제가 CAN 채널 B로 쓰는 핀이라 피했습니다.
* LED(8번 회로), 토글 스위치(7번), 가변전압(9번), PWM-to-Analog(3번) 연결은 선택 사항입니다. 연결하면 코일 쓰기 결과가 LED로 보입니다.

6. 예제 실행 및 동작 확인
① 점퍼선 10개를 연결하고 RS485/422 스위치를 RS485로 놓습니다.② JTAG 에뮬레이터를 연결하고 디버그(Debug, F11) 후 실행(Resume, F8)합니다. 실행 1초 뒤부터 시험이 시작됩니다.
③ CCS View > Watch (기존 CCS v12 이하는 View > Expressions) 창에 아래 변수를 등록합니다.
| 변수 | 의미 | 정상 동작일 때 |
selfRounds | 끝까지 돈 라운드 수 | 계속 증가 |
selfPass | 통과한 항목 누적 | 라운드마다 17씩 증가 |
selfFail | 실패한 항목 누적 | 0에서 변하지 않음 |
selfLastRoundOk | 직전 라운드가 전부 통과였으면 1 | 1 |
selfCaseNow | 지금 시험 중인 항목 번호 | 0~16 반복 |
selfLastFailCase, selfLastFailCode | 마지막 실패 항목과 원인 | 실패가 없으면 0xFFFF, 0 |
selfUartErrors | 마스터 UART의 패리티·프레이밍·오버런 오류 | 0 |
mb.rxGoodFrames, mb.rxCrcErrors, mb.rxOtherAddr, mb.exceptionCount | 슬레이브 쪽 통계 | 라운드마다 각각 +15(방송 포함), +1, +1, +2 |

④ 시험 항목 : 마스터는 아래 17개를 위에서 아래로 차례대로 보내고, 응답을 기대 결과와 비교합니다. 응답이 없어야 하는 3개 항목은 각각 100 ms를 기다립니다. 항목 사이에 5 ms, 라운드 사이에 0.5 s를 쉽니다.
| 번호 | 항목 | 기대 결과 |
| 0 | FC06 홀딩1 = 0xA55A 쓰기 | 요청을 그대로 되돌려 줌(에코) |
| 1 | FC03 홀딩1 읽기 | 0xA55A |
| 2 | FC10 홀딩0~1 = 500, 0x1234 쓰기 | 시작 주소·개수 응답 |
| 3 | FC03 홀딩0~1 읽기 | 500, 0x1234 |
| 4 | FC0F 코일0~7 = 0xA5 쓰기 | 코일 0, 2, 5, 7 ON (LED 1, 3, 6, 8번) |
| 5 | FC01 코일0~7 읽기 | 0xA5 |
| 6 | FC05 코일1 ON | 에코 |
| 7 | FC01 코일0~7 읽기 | 0xA7 |
| 8 | FC0F 코일0~15 = 0 쓰기 | 코일 전부 OFF |
| 9 | FC02 디스크리트 입력0~7 읽기 | 형식만 확인(스위치 값은 계속 변함) |
| 10 | FC04 입력 레지스터0~4 읽기 | 형식만 확인(ADC 값은 계속 변함) |
| 11 | FC03 홀딩 주소 9 읽기 | 예외 응답 02 |
| 12 | 지원하지 않는 기능 코드 0x2B | 예외 응답 01 |
| 13 | CRC를 일부러 틀린 요청 | 응답 없음 |
| 14 | 다른 슬레이브 주소(2)로 요청 | 응답 없음 |
| 15 | 방송(주소 0)으로 홀딩1 = 0x0BCD 쓰기 | 응답 없음 |
| 16 | FC03 홀딩1 읽기 | 0x0BCD (방송 쓰기가 반영됐는지 확인) |
⑤ LED로 보이는 동작 : LED(8번 회로)를 연결했다면 4번 항목에서 LED 1, 3, 6, 8번이 켜지고, 6번 항목에서 2번 LED가 더해져 1, 2, 3, 6, 8번이 되며, 8번 항목에서 전부 꺼집니다. 이 동작이 한 라운드마다 반복됩니다. 4, 5, 7번과 9~16번 LED는 켜지지 않습니다.
⑥ 실패했을 때 :
selfLastFailCode의 값으로 원인을 구분합니다.- 1 : 응답이 없음(시간 초과). 점퍼 결선(R1+↔R2+, R1-↔R2-), RS485/422 스위치, 마스터 핀 4개를 확인하세요.
- 2 : 응답이 없어야 하는 항목(13~15번)에 응답이 왔습니다.
- 3 / 4 / 5 : 응답 길이 다름 / 응답 CRC 오류 / 응답 내용 다름.
selfCaseNow로 항목을 찾고 selfReqLen, selfRespLen을 보세요.- 6 : 마스터 UART 수신 오류(패리티·프레이밍·오버런).
selfUartErrors도 올라갑니다.
7. 참고 — 통신 설정과 코드 구조
통신 설정 : 19200 bps, 8 데이터비트, 짝수 패리티, 1 스톱비트(Modbus RTU 표준 8E1). 슬레이브 주소는 1입니다. 속도와 주소는mb_config.h의 MB_BAUDRATE, MB_SLAVE_ADDR로 바꿉니다. 프레임의 끝은 문자 사이 간격이 3.5문자(19200 bps에서 약 2 ms) 이상일 때로 판정하며, 슬레이브와 마스터가 같은 CPU 타이머1 카운터를 함께 씁니다.| 파일 | 역할 |
modbus_rtu.c/.h | 슬레이브 프로토콜 코어 (하드웨어 독립) |
12_ModbusRtu_Selftest_Driverlib.c | 슬레이브(SCI-B, 방향 제어, t3.5, LED/스위치/ADC/PWM)와 메인 루프 |
selftest_master.c/.h | UARTB 마스터. PAUSE → SEND → DRAIN → WAIT 상태기계 |
mb_selftest_cases.c/.h | 시험 항목 표, 요청 프레임 생성, 응답 판정 (하드웨어 독립) |
test/test_selftest_cases.c | PC(gcc)용 테스트. 표의 17개 항목을 슬레이브 코어에 통과시켜 봅니다 |
시험 항목을 늘릴 때는 요청과 응답이 각각 UART FIFO(16칸)에 들어가야 합니다. PC 테스트가 이 길이를 검사합니다.
| 번호 | 제목 | 작성자 | 날짜 |
|---|
- 1




