Texas Instruments의 TMS320F28335는 C2000 시리즈 32비트 DSP로, SCI(Serial Communication Interface) 모듈을 통해 강력한 UART 기반 시리얼 통신을 지원합니다. 이 가이드는 TMS320F28335 SCI 모듈의 내부 구조, 동작 원리, 레지스터 설정, 하드웨어 연결, 상세 주석이 포함된 예제 코드, 디버깅 방법을 제공합니다.
1. TMS320F28335 SCI 모듈 개요
TMS320F28335는 3개의 SCI 모듈(SCI-A, SCI-B, SCI-C)을 제공하며, 각 모듈은 독립적인 UART 통신을 지원합니다. SCI는 PC, 마이크로컨트롤러, 센서와의 통신에 적합하며, 산업 제어, 모터 제어, 데이터 로깅, 펌웨어 업그레이드 등에 활용됩니다.
1.1 SCI 모듈의 내부 구조
SCI 모듈은 다음과 같은 구성 요소로 이루어져 있습니다:
- 송신기(Transmitter): 데이터를 직렬 비트 스트림으로 변환, TX 핀(GPIO28, SCI-A)으로 출력. 16단계 송신 FIFO로 CPU 부하 감소.
- 수신기(Receiver): RX 핀(GPIO29, SCI-A)에서 비트 스트림을 병렬 데이터로 변환. 16단계 수신 FIFO 지원.
- 보드레이트 생성기: LSPCLK(기본 37.5MHz)를 기반으로 보드레이트 설정. BRR 레지스터로 정밀 제어.
- 제어 및 상태 레지스터: 통신 포맷, 인터럽트, 에러 상태 관리.
- FIFO 제어기: 송수신 FIFO로 데이터 처리 효율화.
1.2 동작 원리
SCI는 비동기 UART 프로토콜을 사용하며, 데이터 프레임은 스타트 비트(1), 데이터 비트(1~8), 패리티 비트(선택), 스톱 비트(1~2)로 구성됩니다. 송신기는 데이터를 비트 단위로 전송하고, 수신기는 비트 스트림을 샘플링하여 데이터를 복원합니다.
1.3 주요 기능
- 비동기 통신: 클럭 없이 스타트/스톱 비트로 동기화.
- 보드레이트: LSPCLK에 따라 수십 bps~수백 kbps.
- FIFO: 16단계로 CPU 부하 감소.
- 인터럽트: 송신, 수신, 에러 처리.
- 루프백 모드: 내부 테스트용 TX-RX 연결.
- 자동 보드레이트: SCIFFCT로 감지 가능.
1.4 응용처
- 모터 제어: 모터 상태 데이터 전송.
- 데이터 로깅: 센서 데이터 기록.
- 부트로더: SCI로 펌웨어 업그레이드.
- 디버깅: 실시간 로그 출력.
1.5 제약 및 대안
- 제약: 비동기만 지원, 최대 보드레이트 약 2Mbps.
- 대안: McBSP(SPI/I2S), CAN(고속 통신).
2. SCI 레지스터 상세 설명
| 레지스터 | 역할 | 주요 비트 | 예시 설정 |
| SCICCR | 통신 포맷 | SCICHAR, STOPBITS, PARITYENA | SciaRegs.SCICCR.all = 0x0007; |
| SCICTL1 | SCI 제어 | RXENA, TXENA, SWRESET | SciaRegs.SCICTL1.all = 0x0003; |
| SCICTL2 | 인터럽트 | TXINTENA, RXBKINTENA | SciaRegs.SCICTL2.bit.TXINTENA = 1; |
| SCIHBAUD/SCILBAUD | 보드레이트 | 16비트 BRR | SCIHBAUD = 0x01, SCILBAUD = 0xE7; |
| SCIRXST | 수신 상태 | PE, OE, FE, RXERROR | 읽기 전용 |
| SCIRXBUF/SCITXBUF | 데이터 송수신 | 8비트 데이터 | SciaRegs.SCITXBUF = data; |
| SCIFFTX/SCIFFRX | FIFO 제어 | TXFFIENA, RXFFIENA, TXFFIL | SciaRegs.SCIFFTX.all = 0xC040; |
3. SCI 설정 절차
- 시스템 클럭:
InitSysCtrl()로 SYSCLKOUT(150MHz), LSPCLK(37.5MHz). - GPIO: SCI-A TX(GPIO28), RX(GPIO29).
- 인터럽트:
DINT,InitPieCtrl(),IER/IFR. - SCI 설정: 포맷, 보드레이트, FIFO.
- 활성화:
SWRESET = 1. - 데이터 송수신: 폴링 또는 인터럽트.
4. 하드웨어 연결
- 핀: SCI-A TX(GPIO28), RX(GPIO29), 공통 GND.
- 레벨 변환: MAX3232로 3.3V TTL → RS-232.
5. 예제 코드: TMS320F28335 SCI 에코백
아래는 TMS320F28335 SCI를 사용한 에코백 프로그램(9600bps, 8-N-1)이고 설정 방법을 주석으로 상세하게 설명하였습니다.
// TMS320F28335 SCI-A 에코백 프로그램: 9600bps, 8비트 데이터, 1 스톱 비트, 패리티 없음
#include "DSP28x_Project.h" // TMS320F28335 헤더: 레지스터 정의, 초기화 함수 포함
// 매크로 정의: 보드레이트 계산
#define SYSCLKOUT 150000000UL // 시스템 클럭: 150MHz (PLL 설정으로 결정)
#define LSPCLK (SYSCLKOUT / 4) // Low-Speed Peripheral Clock: 37.5MHz (SYSCLKOUT/4)
#define BAUD_RATE 9600UL // 목표 보드레이트: 9600bps
#define BRR ((LSPCLK / (BAUD_RATE * 8)) - 1) // BRR 계산: (37,500,000 / (9600 * 8)) - 1 ≈ 487
#define BRR_HIGH ((BRR >> 8) & 0xFF) // BRR 상위 8비트: 0x01
#define BRR_LOW (BRR & 0xFF) // BRR 하위 8비트: 0xE7
// 디버깅용 에러 플래그 변수: 수신 에러 상태 저장
volatile Uint16 rx_error_flags = 0;
// 함수 프로토타입: SCI-A 수신 인터럽트 서비스 루틴
interrupt void sciaRxIsr(void);
// SCI-A 초기화 함수: SCI-A 모듈 설정 (GPIO28: TX, GPIO29: RX)
void InitSCIA(void) {
EALLOW; // 보호된 레지스터 접근 허용: 시스템 제어 및 GPIO 설정
// SCI-A 클럭 활성화: LSPCLK(37.5MHz)을 SCI-A에 연결
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;
// GPIO 설정: SCI-A TX와 RX 핀 설정
// GPIO28 (SCITXDA): GPAMUX2.bit.GPIO28 = 01 (비트 24-25)
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // SCI-A 송신 핀 설정
// GPIO29 (SCIRXDA): GPAMUX2.bit.GPIO29 = 01 (비트 26-27)
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // SCI-A 수신 핀 설정
// GPIO29 풀업 활성화: GPAPUD.bit.GPIO29 = 0 (비트 29, 0=활성화)
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // 수신 신호 안정화
EDIS; // 보호된 레지스터 접근 비활성화
// 통신 포맷 설정: SCICCR (8비트 데이터, 1 스톱 비트, 패리티 없음)
SciaRegs.SCICCR.all = 0x0007; // SCICHAR=7, STOPBITS=0, PARITYENA=0
// SCI 제어 설정: SCICTL1 (송수신 활성화)
SciaRegs.SCICTL1.all = 0x0003; // RXENA=1, TXENA=1, SWRESET=0
// 인터럽트 설정: SCICTL2 (송수신 인터럽트 활성화)
SciaRegs.SCICTL2.bit.TXINTENA = 1; // 송신 인터럽트 활성화
SciaRegs.SCICTL2.bit.RXBKINTENA = 1; // 수신/브레이크 인터럽트 활성화
// 보드레이트 설정: SCIHBAUD/SCILBAUD (9600bps)
SciaRegs.SCIHBAUD = BRR_HIGH; // 0x01
SciaRegs.SCILBAUD = BRR_LOW; // 0xE7
// FIFO 설정: 송수신 FIFO 활성화
SciaRegs.SCIFFTX.all = 0xC040; // TXFFRST=1, SCIFFENA=1
SciaRegs.SCIFFRX.all = 0x2044; // RXFFRST=1, RXFFIENA=1, RXFFIL=4
SciaRegs.SCIFFCT.all = 0x0; // 자동 보드레이트 감지 비활성화
// SCI 모듈 활성화: SWRESET=1로 정상 동작 시작
SciaRegs.SCICTL1.bit.SWRESET = 1;
}
// 메인 함수: 시스템 및 SCI 초기화 후 에코백 루프 실행
void main(void) {
// 시스템 클럭 초기화: SYSCLKOUT=150MHz, LSPCLK=37.5MHz
InitSysCtrl();
// 인터럽트 초기화: 안전한 인터럽트 환경 구축
DINT; // 글로벌 인터럽트 비활성화
InitPieCtrl(); // PIE 컨트롤러 초기화
IER = 0x0000; // 인터럽트 활성화 레지스터 초기화
IFR = 0x0000; // 인터럽트 플래그 레지스터 초기화
InitPieVectTable(); // PIE 벡터 테이블 초기화
// SCI-A 수신 인터럽트 벡터 등록: PIE 그룹 9, INT1
EALLOW;
PieVectTable.SCIRXINTA = &sciaRxIsr; // SCI-A 수신 인터럽트 핸들러
EDIS;
// SCI-A 초기화
InitSCIA();
// 인터럽트 활성화: SCI-A 수신 인터럽트
EALLOW;
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; // PIE 그룹 9, INT1 활성화
IER |= M_INT9; // 인터럽트 그룹 9 활성화
EDIS;
// 글로벌 인터럽트 활성화
EINT;
// 에코백 루프: 폴링 방식으로 데이터 송수신
while(1) {
// 수신 데이터 대기: FIFO에 데이터가 있을 때까지 대기
while (SciaRegs.SCIFFRX.bit.RXFFST == 0) {
// 수신 에러 체크: 패리티, 오버런, 프레임, 브레이크 에러
if (SciaRegs.SCIRXST.bit.RXERROR) {
rx_error_flags = 0;
if (SciaRegs.SCIRXST.bit.PE) rx_error_flags |= 0x0001; // 패리티 에러
if (SciaRegs.SCIRXST.bit.OE) rx_error_flags |= 0x0002; // 오버런 에러
if (SciaRegs.SCIRXST.bit.FE) rx_error_flags |= 0x0004; // 프레임 에러
if (SciaRegs.SCIRXST.bit.BRKDT) rx_error_flags |= 0x0008; // 브레이크 에러
// SCI 모듈 리셋 및 복구
SciaRegs.SCICTL1.bit.SWRESET = 0;
SciaRegs.SCICTL1.bit.SWRESET = 1;
}
}
// 데이터 수신 및 송신: 에코백
Uint16 data = SciaRegs.SCIRXBUF.all;
while (SciaRegs.SCIFFTX.bit.TXFFST >= 16); // 송신 FIFO 대기
SciaRegs.SCITXBUF = data; // 데이터 송신
}
}
// SCI-A 수신 인터럽트 서비스 루틴: 수신 데이터 즉시 송신
interrupt void sciaRxIsr(void) {
Uint16 data = SciaRegs.SCIRXBUF.all; // 데이터 읽기
SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1; // 오버플로우 플래그 클리어
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; // 인터럽트 플래그 클리어
SciaRegs.SCITXBUF = data; // 에코백 송신
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; // PIE 그룹 9 ACK
}
6. 코드 설명
- 매크로:
BRR,BRR_HIGH,BRR_LOW로 동적 보드레이트 계산. - InitSCIA: SCI-A 클럭, GPIO, 포맷, FIFO 설정.
- main: 시스템 및 인터럽트 초기화, 폴링 기반 에코백.
- sciaRxIsr: 인터럽트 기반 데이터 처리.
7. 디버깅 및 문제 해결
- 쓰레기 데이터: 보드레이트 불일치, GPIO 오류.
BRR,GPAMUX1, MAX3232 확인. - 통신 실패:
SWRESET,PCLKCR0.bit.SCIAENCLK점검. - 인터럽트 문제:
PIEIER9.bit.INTx1,IER |= M_INT9.
8. 테스트 방법
- 하드웨어: TMS320F28335 보드, GPIO28(TX)/GPIO29(RX) 연결.
- 소프트웨어: Code Composer Studio, PuTTY(9600bps, 8-N-1).
- 결과: 터미널 입력 문자가 에코백됨.
9. 추가 팁
- 보드레이트: 115200bps 시 BRR=40(
SCIHBAUD=0x00, SCILBAUD=0x28). - SCI-B/C: GPIO9/11(SCI-B), GPIO19/18(SCI-C).
- 부트로더: SCI로 펌웨어 업그레이드.
10. 참고 자료
- TMS320F28335 Technical Reference Manual
- TI E2E Community
'MCU > C2000' 카테고리의 다른 글
| TMS320F28388D DSP SCI 사용법: Driverlib API로 UART 설정 및 예제(수정본) (0) | 2025.08.08 |
|---|---|
| TMS320F28388D DSP Driverlib 기반 프로젝트 설정 및 기본 프로그램 작성 절차 (0) | 2025.08.08 |
| TMS320F28335 DSP ePWM SPWM 생성 (0) | 2025.08.07 |
| TMS320F28335 DSP ePWM Half-Bridge 상보 출력 설정 방법 (0) | 2025.08.07 |
| TMS320F28335 DSP 사양 및 CCS 프로젝트 생성 절차 (0) | 2025.08.06 |
| TI C2000 Lockstep 완벽 정리: 기능 안전을 위한 필수 기술 (0) | 2025.08.06 |
| TMS320F28377D DSP SCI 사용법: Bitfield 구조 활용 예제 코드(수정) (0) | 2025.08.06 |
| TMS320F28377D DSP ADC 트리거 모드 사용: Bitfield 구조 활용(수정) (0) | 2025.08.06 |