TMS320F28X 개발보드 V2 예제
[F28P65x / CPU1] 28X 칩에 시리얼 EEPROM(M95M04)을 연결해 읽고 쓰기 예제 (SPI + SCI 콘솔 명령, Bitfield/DriverLib/FreeRT
1. 실습 안내
본 예제는 TMS320F28P65x(F28P650DK9 산업용 / F28P659DK8-Q1 차량용) 제어 모듈이 탑재된 TMS320F28X 개발보드(EVM) V2를 대상으로 합니다.F28P65x 칩의 SPI-A를 개발보드 '(12) 시리얼 FLASH & EEPROM' 회로와 연결하고, 회로에 실장된 EEPROM(ST M95M04-DR, 4 Mbit = 512 KB)을 SPI 마스터로 읽고 씁니다. 쓰기는 EEPROM의 페이지(512바이트) 경계에서 나눠 보내고, 쓰기 완료를 기다린 뒤 읽어서 검증합니다.
조작은 개발보드 '(11) 2채널 SCI-to-USB' 회로로 PC 터미널을 연결해 명령으로 합니다.
-
read : 16진수 + ASCII 덤프 / write : 문자열 쓰기 후 검증 / status : 상태 레지스터-
fill, test : 범위 채우기, 패턴 쓰기/읽기/비교 (해당 범위를 덮어씁니다)학습 목적에 따라 Bitfield / DriverLib / FreeRTOS 3가지 구현을 모두 제공합니다.
2. 실습 준비
본 예제는 아래의 개발환경에서 컴파일/링크를 확인했습니다.1) CCS 버전 : Code Composer Studio v12.x / v20.x / v21.x (Theia)
2) 컴파일러 버전 : TI v22.6.3.LTS 이상
3) 개발보드 : TMS320F28X 개발보드 V2
4) 프로세서 모듈 : 싱크웍스 TMS320F28P65x 모듈 (F28P650DK9 / F28P659DK8-Q1)
5) 예제버전 : v1.00
6) 기타 : Mini-B 5핀 USB 케이블 1개 (PC ↔ '(11) 2채널 SCI-to-USB' 회로), 점퍼 케이블 6개, 시리얼 터미널 프로그램 (CCS Serial Console, Tera Term 등)
7) 프로젝트 구성 : 학습 목적에 따라 3가지 버전을 모두 제공합니다.
- Bitfield : DriverLib을 전혀 호출하지 않고 레지스터 비트필드 구조체(SpiaRegs, SciaRegs, GpioDataRegs 등)만으로 구현
- Driverlib : TI 표준 HAL API 라이브러리를 활용한 구현. PC에서 가짜 EEPROM 칩으로 돌려 보는 호스트 테스트 포함
- FreeRTOS : 콘솔 / 하트비트 태스크 2개, 완전 정적 메모리 할당(Zero Heap), 쓰기 완료를 기다리는 동안 CPU를 양보,
uptime 명령 추가8) 확인 범위 : Bitfield, FreeRTOS 버전은 보드에서 부팅 배너, EEPROM 응답,
read / write(검증) 동작과 ASCII 덤프까지 확인했고, DriverLib 버전은 컴파일/링크와 PC 호스트 테스트까지 확인했습니다. fill, test, status 명령과 FreeRTOS의 uptime 출력은 아직 보드에서 확인하지 않았습니다.
3. 실습 예제 다운로드 (GitHub ZIP 다운로드 안내)
초보자분들도 손쉽게 다운로드하여 사용하실 수 있도록 전체 소스 코드를 GitHub에 공개해 두었습니다.아래 안내에 따라 ZIP 압축 파일로 다운로드하세요.
[다운로드 순서]
① 아래의 링크를 클릭하여 GitHub 저장소 페이지로 이동합니다.
>> [GitHub] EVM_V2_F28P65x_12_Serial_EEPROM 저장소 바로가기
(※ 다이렉트 ZIP 다운로드 : EVM_V2_F28P65x_12_Serial_EEPROM.zip 클릭하여 바로받기)
② GitHub 페이지 우측 상단의 초록색 <> Code ▼ 버튼을 클릭합니다.
③ 나타나는 메뉴 맨 아래의 Download ZIP 항목을 클릭하여 압축 파일을 다운로드합니다.
④ 다운로드한 ZIP 파일의 압축을 해제합니다.
- 권장 설치 경로 : C:/SyncWorks/TMS320F28X_EVM_V2_28P65x/12_Serial_EEPROM
(※ 주의 : 경로 상에 한글이나 공백이 포함되지 않도록 주의해 주세요.)
4. CCS 프로젝트 불러오기 (CCS V20 기준) 및 컴파일
>> [유튜브] CCS V20 예제 프로젝트 불러오기 방법 소개 영상① Code Composer Studio(CCS)를 실행합니다.
② 상단 메뉴에서 File > Import Projects... 를 클릭합니다.
③ Specify Search Directory 버튼을 눌러 앞서 압축을 해제한 폴더를 선택합니다. (ZIP 파일을 바로 "Select archive file"로 지정해도 됩니다.)
④ 검색된 프로젝트 목록 중 실습하고자 하는 프로젝트(12_Serial_EEPROM_Bitfield, 12_Serial_EEPROM_Driverlib, 12_Serial_EEPROM_Freertos 중 원하는 프로젝트)를 체크하여 선택합니다.
⑤ Finish 버튼을 클릭하여 프로젝트를 워크스페이스로 불러옵니다.
⑥ 프로젝트를 마우스 우클릭하여 Build Project를 수행합니다. (CPU1_RAM은 디버깅용, CPU1_FLASH는 전원을 껐다 켜도 실행)
5. 예제 실행을 위한 하드웨어 점퍼선 연결 안내
아래와 같이 F28P65x 모듈의 핀-헤더와 개발보드 각 회로 블록을 점퍼 케이블로 연결합니다. EEPROM(SPI)과 콘솔(SCI) 모두 A Side 핀-헤더를 사용합니다.| 번호 | 신호 | EVM V2 핀-헤더 | 할당 신호명 | 연결 대상 |
| 1 | SCI RX | A Side 17번 핀 | GPIO43 / SCIA_RX | (11) 블록 "RX1" |
| 2 | SCI TX | A Side 15번 핀 | GPIO42 / SCIA_TX | (11) 블록 "TX1" |
| 3 | EEPROM DI (MOSI) | A Side 97번 핀 | GPIO16 / SPIA_PICO | (12) 블록 "DI" |
| 4 | EEPROM DO (MISO) | A Side 99번 핀 | GPIO17 / SPIA_POCI | (12) 블록 "DO" |
| 5 | EEPROM CLK (SCLK) | A Side 101번 핀 | GPIO18 / SPIA_CLK | (12) 블록 "CLK" |
| 6 | EEPROM CS2 | A Side 103번 핀 | GPIO19 (일반 GPIO 출력, Low 활성) | (12) 블록 "CS2" |
* (12) 블록 헤더는 CS1 DI CLK DO CS2 순서의 5핀입니다. EEPROM은 CS2를 사용하고, 시리얼 FLASH용 CS1은 연결하지 않습니다. 보드의 풀업 저항으로 FLASH는 선택되지 않은 상태가 유지되며, 헤더 옆 LED로 선택된 칩(CS1/CS2)을 확인할 수 있습니다.
* 그림에서 빨간 점퍼선이 두 개입니다. 맨 위 줄 15번 핀에서 출발하는 선은 TX1, 아래쪽 97번 핀에서 출발하는 선은 DI로 가는 선입니다. 핀 번호로 구분하세요.
* GPIO42/43은 USB D-/D+와 같은 핀이라 예제가 아날로그 모드를 꺼서 SCI로 씁니다. 따라서 USB 예제(5번)와 동시에 사용할 수 없습니다.
* '(11) 2채널 SCI-to-USB' 회로의 미니 5핀 USB 커넥터(그림의 빨간 박스)를 PC의 USB 포트와 케이블로 연결하면 PC에서 'USB Serial Port' 2개가 인식됩니다. 그중 1채널(RX1/TX1)에 해당하는 포트를 사용하세요. 어느 쪽인지는 장치관리자에서 확인할 수 있습니다.
* (11) 헤더 위에 인쇄된 'G28 G29' 같은 표기와 관계없이, 이 예제는 위 표처럼 A Side 15번/17번 핀에 점퍼선으로 직접 연결합니다.

6. 예제 실행 및 동작 확인
① 점퍼선 6개와 (11) 회로의 USB 케이블을 연결합니다. 이 예제에는 부하나 외부 회로가 필요 없습니다.② JTAG 에뮬레이터를 연결하고 디버그(Debug, F11) 후 실행(Resume, F8)합니다.
③ 시리얼 터미널 설정 (CCS V20 Serial Console) : CCS V20에서는 Serial Console을 엽니다.
- 상단 메뉴에서 View > Open View 메뉴를 누른 후 'serial console'을 입력해 검색하고 엔터를 눌러 선택합니다.
- Serial Console 뷰 오른쪽 위의 Connect/Disconnect COM PORT 아이콘(아래 사진의 빨간 네모)을 누릅니다.
- COM Port 창에서 Port와 Baud Rate 등을 선택해 COM 포트를 연결합니다.
* Port : COMx (PC 환경마다 다를 수 있습니다. / 장치관리자에서 확인, 예: COM35)
* Baud Rate : 115200 / Parity : none / Data Size : 8 / Stop Bits : 1 (흐름 제어 없음)
(Tera Term 같은 다른 시리얼 터미널 프로그램도 같은 설정으로 사용할 수 있습니다.)

④ 시작 확인 : 터미널에 아래와 같은 시작 배너와 EEPROM 응답 문구, 프롬프트가 나옵니다. (배너의 두 번째 줄은 버전마다
Bitfield / DriverLib / FreeRTOS로 다릅니다.)TMS320F28P65x Serial EEPROM (M95M04) SPI ConsoleEEPROM answered, status register = 0x00eeprom>※
EEPROM answered는 EEPROM이 상태 레지스터 읽기에 응답했다는 뜻입니다. 값이 0xFF이거나 WARNING: EEPROM did not answer가 나오면 SPI 4선(DI/DO/CLK/CS2)과 접지 연결을 확인하세요.⑤ 쓰기 / 읽기 확인 : 아래처럼 입력해 보세요.
-
write 0 test : 0번지에 test 4바이트를 쓰고, 바로 읽어서 검증합니다. 성공하면 Wrote 4 bytes at 0x00000, verify OK가 나옵니다.-
read 0 : 0번지부터 64바이트를 한 줄에 16바이트씩 주소: 16진수 값들 |ASCII| 형태로 보여 줍니다. 위에서 쓴 값은 74 65 73 74(= test)로 보입니다.- ASCII 열에는 출력 가능한 글자(0x20~0x7E)만 나오고 나머지 바이트는
.으로 표시됩니다. 전에 써 둔 값이 있으면 그대로 남아 있습니다. EEPROM은 전원을 꺼도 값이 유지됩니다.-
write가 Verify FAILED로 끝나고 block-protect bits are set 힌트가 나오면 칩의 블록 보호 비트가 켜져 있어 해당 영역에 쓰기가 무시된 것입니다. status로 확인하세요.
⑥ 명령어 사용 : 터미널에 아래 명령을 입력하고 엔터를 누릅니다. 주소와 길이, 값은 10진수 또는
0x 16진수로 입력하며, 칩 범위는 0x00000 ~ 0x7FFFF(512 KB)입니다.| 명령 | 설명 | 예 |
help, h, ? | 명령어 목록 | help |
status | 상태 레지스터(WIP / WEL / 블록 보호) | status |
read | 16진수 + ASCII 덤프 (기본 64바이트, 최대 1024) | read 0x1f0 48 |
write | 문자열을 쓰고 읽어서 검증 | write 0x100 hello |
fill | 범위를 한 바이트 값으로 채우고 검증 | fill 0 512 0xff |
test | 패턴 쓰기 → 읽기 → 비교 (범위를 덮어씀) | test 0x1ff 100 |
uptime | RTOS 틱 시간과 하트비트 카운터 (FreeRTOS 버전만) | uptime |
※
fill과 test는 지정한 범위의 기존 데이터를 덮어씁니다. 중요한 데이터가 있는 EEPROM에서는 사용하지 마세요.⑦ 페이지 경계 확인 : 이 EEPROM은 한 번에 쓸 수 있는 페이지가 512바이트입니다. 예제는 페이지 끝을 넘는 쓰기를 자동으로 나눠 보냅니다.
write 0x1f8 EEPROM page boundary test처럼 0x200(페이지 경계) 바로 앞에서 시작하는 긴 문자열을 쓰고 read 0x1f0 48로 읽으면 경계를 넘어서도 이어서 정상으로 읽히는지 확인할 수 있습니다.⑧ FreeRTOS 버전 관찰 : CCS View > Watch (기존 CCS v12 이하는 View > Expressions) 창에
heartbeatCount를 등록하고 test 0 65536처럼 쓰기에 오래 걸리는 명령을 실행해 보세요. EEPROM 쓰기를 기다리는 동안에도 값이 계속 올라가면 태스크가 멀티태스킹으로 돌아가고 있다는 뜻입니다. (이 동작은 아직 보드에서 확인하지 않았습니다.)
7. 참고 — 3가지 버전 실측 메모리 사용량 비교
동일한 동작을 세 가지 방식으로 구현했을 때 메모리 사용량이 얼마나 달라지는지 실제로 빌드해서 비교했습니다. 링커 맵의 영역별 사용량을 합산한 값이며, 단위는 워드(1워드 = 16비트 = 2바이트)입니다.| 버전 | CPU1_RAM 구성 합계 | CPU1_FLASH 구성 Flash 사용량 | CPU1_FLASH 구성 RAM 사용량 | Flash 사용률 (FLASH_BANK0 기준) |
| Bitfield | 11,248 | 9,626 | 2,167 | 약 7.3% |
| DriverLib | 12,833 | 11,210 | 2,369 | 약 8.6% |
| FreeRTOS | 16,252 | 13,862 | 3,138 | 약 10.6% |
CPU1_RAM 구성은 코드까지 RAM에 올라가므로 값이 크고, 스택이 포함됩니다. Bitfield 버전이 가장 작은 이유는 애플리케이션 코드가 DriverLib 함수 호출 대신 레지스터를 직접 다루기 때문이고, FreeRTOS 버전이 가장 큰 이유는 커널 자체 코드/데이터(태스크 스택, TCB, 스케줄러)가 추가되기 때문입니다. 측정은 최적화 없음(
--opt_level=off) 기준입니다.| 번호 | 제목 | 작성자 | 날짜 |
|---|
- 1




