TI의 TMS320F28377D는 C2000 Delfino 시리즈의 32비트 마이크로컨트롤러로, 산업 자동화, 모터 제어, 전력 변환 등에서 CAN(Controller Area Network) 통신을 지원합니다. CAN 모듈은 ISO 11898 표준을 준수하며, 고속, 신뢰성 높은 네트워크 통신을 제공합니다. 이 문서에서는 TMS320F28377D의 CAN 모듈 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두가 쉽게 활용할 수 있도록 돕겠습니다.
1. TMS320F28377D CAN 모듈 개요
TMS320F28377D는 두 개의 CAN 모듈(CANA, CANB)을 포함하며, 각 모듈은 최대 32개의 메일박스를 지원합니다. 주요 사양은 다음과 같습니다:
- 클럭 소스: 시스템 클럭(SYSCLK, 최대 200MHz)
- 전송 속도: 최대 1Mbps (CAN 2.0B 프로토콜 지원)
- 메일박스: 32개 (송신/수신 설정 가능)
- 식별자: 표준(11비트) 및 확장(29비트) ID 지원
- 주요 기능:
- 자동 재전송
- 우선순위 기반 메일박스 처리
- 타임스탬프 기능
- 에러 카운터 및 인터럽트
- 로컬 수락 필터(LAM, Local Acceptance Mask)
- 인터럽트: 수신, 송신, 에러, 상태 변경 등
- 저전력 모드: 슬립 모드 지원
2. CAN Bitfield 설정 상세
CAN 레지스터는 F2837xD_can.h 헤더 파일을 통해 Bitfield 구조로 접근합니다. 이는 레지스터의 개별 비트를 명확히 설정하여 코드 가독성과 유지보수성을 높입니다. 주요 레지스터는 다음과 같습니다:
2.1 CAN_CTL (CAN 제어 레지스터)
- bit.INIT: 초기화 모드 (1: 초기화, 0: 정상 동작)
- bit.CCE: 설정 변경 허용 (1: 활성화)
- bit.SWR: 소프트웨어 리셋
- bit.PDR: 전력 절약 모드 요청
- bit.IE0/IE1: 인터럽트 활성화 (메일박스 및 에러)
2.2 CAN_ES (CAN 상태 레지스터)
- bit.RXOK: 성공적 수신 상태
- bit.TXOK: 성공적 송신 상태
- bit.LEC: 마지막 에러 코드
- bit.PDA: 전력 절약 모드 확인
2.3 CAN_BTR (비트 타이밍 레지스터)
- bit.BRP: 보드레이트 프리스케일러
- bit.TSEG1/TSEG2: 비트 타이밍 세그먼트 1/2
- bit.SJW: 동기화 점프 폭
2.4 CAN_IF1/IF2 (인터페이스 레지스터)
- bit.MSGVAL: 메일박스 유효 (1: 유효)
- bit.XTD: 확장 ID 사용 (1: 29비트, 0: 11비트)
- bit.DIR: 방향 (1: 송신, 0: 수신)
- bit.DATA_A/DATA_B: 데이터 바이트 설정
2.5 CAN_LAM (로컬 수락 마스크)
- bit.LAM: 수락 마스크 설정
- bit.LAMI: 마스크 사용 여부
3. CAN 설정 절차
CAN 모듈을 설정하려면 다음 단계를 따릅니다:
- 시스템 초기화:
- InitSysCtrl()로 시스템 클럭과 PLL 초기화
- 인터럽트 비활성화 및 PIE 초기화 (DINT, InitPieCtrl, InitPieVectTable)
- CAN 클럭 활성화:
- CpuSysRegs.PCLKCR0.bit.CAN_A 또는 CAN_B를 1로 설정
- EALLOW와 EDIS로 보호된 레지스터 접근
- GPIO 설정:
- CAN TX/RX 핀 설정 (예: GPIO8=CANRXA, GPIO10=CANTXA)
- GpioCtrlRegs.GPAMUXx로 멀티플렉싱 설정
- CAN 초기화:
- CAN_CTL.bit.INIT = 1로 초기화 모드 진입
- CAN_BTR로 보드레이트 설정
- CAN_CTL.bit.CCE = 0으로 비트 타이밍 설정 완료
- 메일박스 설정:
- CAN_IF1CMD 또는 CAN_IF2CMD로 메일박스 설정
- ID, 마스크, 방향 설정
- 인터럽트 설정 (필요 시):
- CAN_CTL.bit.IE0/IE1로 인터럽트 활성화
- PieVectTable에 벡터 설정
- CAN 실행:
- CAN_CTL.bit.INIT = 0으로 정상 모드 진입
4. CAN 설정 고려사항
- 보드레이트: SYSCLK와 비트 타이밍으로 정확한 보드레이트 계산 (예: 1Mbps = 200MHz / (BRP * (TSEG1 + TSEG2 + 1)))
- 메일박스: 송신/수신 메일박스 분리 및 우선순위 설정
- 필터링: LAM으로 특정 ID만 수신
- 에러 처리: CAN_ES.bit.LEC로 에러 모니터링
- 인터럽트: 수신/송신 완료 시 인터럽트 활용
5. 실용적인 CAN 예제 코드 (Bitfield 구조)
아래는 TMS320F28377D CAN 모듈을 Bitfield 구조로 설정한 세 가지 예제 코드입니다. 각 코드는 Code Composer Studio(CCS)와 C2000Ware 환경에서 실행 가능합니다.
5.1 예제 1: 기본 CAN 송신
// File: can_basic_transmit.c
// Description: TMS320F28377D CAN 기본 송신 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// GPIO 설정
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 2; // GPIO8을 CANRXA로 설정
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 2; // GPIO10을 CANTXA로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// CANA 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR0.bit.CAN_A = 1; // CANA 모듈 클럭 활성화
EDIS;
// CAN 초기화
EALLOW;
CanARegs.CAN_CTL.bit.INIT = 1; // 초기화 모드 진입
CanARegs.CAN_CTL.bit.CCE = 1; // 비트 타이밍 설정 허용
CanARegs.CAN_BTR.bit.BRP = 9; // 보드레이트 프리스케일러 (1Mbps @ 200MHz)
CanARegs.CAN_BTR.bit.TSEG1 = 13; // TSEG1 = 14
CanARegs.CAN_BTR.bit.TSEG2 = 4; // TSEG2 = 5
CanARegs.CAN_BTR.bit.SJW = 3; // SJW = 4
CanARegs.CAN_CTL.bit.CCE = 0; // 비트 타이밍 설정 완료
EDIS;
// 메일박스 1 설정 (송신)
CanARegs.CAN_IF1CMD.bit.Arb = 1; // Arbitration 필드 설정
CanARegs.CAN_IF1CMD.bit.Control = 1; // 제어 필드 설정
CanARegs.CAN_IF1CMD.bit.Data_A = 1; // 데이터 A 설정
CanARegs.CAN_IF1CMD.bit.Data_B = 1; // 데이터 B 설정
CanARegs.CAN_IF1ARB.bit.MsgVal = 1; // 메일박스 유효
CanARegs.CAN_IF1ARB.bit.Xtd = 0; // 표준 11비트 ID
CanARegs.CAN_IF1ARB.bit.ID = 0x123; // CAN ID
CanARegs.CAN_IF1ARB.bit.Dir = 1; // 송신
CanARegs.CAN_IF1MCTL.bit.DLC = 8; // 데이터 길이 8바이트
CanARegs.CAN_IF1DATA.bit.Data_0 = 0x11; // 데이터 바이트
CanARegs.CAN_IF1DATA.bit.Data_1 = 0x22;
CanARegs.CAN_IF1DATA.bit.Data_2 = 0x33;
CanARegs.CAN_IF1DATA.bit.Data_3 = 0x44;
CanARegs.CAN_IF1DATB.bit.Data_4 = 0x55;
CanARegs.CAN_IF1DATB.bit.Data_5 = 0x66;
CanARegs.CAN_IF1DATB.bit.Data_6 = 0x77;
CanARegs.CAN_IF1DATB.bit.Data_7 = 0x88;
CanARegs.CAN_IF1CMD.bit.Mask = 0; // 마스크 비활성화
CanARegs.CAN_IF1CMD.bit.TXrqst = 1; // 송신 요청
CanARegs.CAN_IF1CMD.bit.Busy = 1; // 전송 시작
CanARegs.CAN_IF1CMD.bit.MSG_NUM = 1; // 메일박스 1
// CAN 정상 모드
CanARegs.CAN_CTL.bit.INIT = 0; // 정상 모드 진입
for(;;); // 무한 루프
}
설명:
- 기능: CANA 모듈로 1Mbps, 표준 11비트 ID(0x123), 8바이트 데이터 송신
- 설정: 보드레이트 1Mbps, 메일박스 1 송신, 데이터 0x11~0x88
- GPIO: GPIO8(CANRXA), GPIO10(CANTXA), GPIO31(LED)
- 출력: CAN 네트워크로 데이터 송신, 정상 동작 시 LED ON
5.2 예제 2: CAN 수신 및 필터링
// File: can_basic_receive.c
// Description: TMS320F28377D CAN 수신 및 필터링 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// GPIO 설정
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 2; // GPIO8을 CANRXA로 설정
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 2; // GPIO10을 CANTXA로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// CANA 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR0.bit.CAN_A = 1; // CANA 모듈 클럭 활성화
EDIS;
// CAN 초기화
EALLOW;
CanARegs.CAN_CTL.bit.INIT = 1; // 초기화 모드 진입
CanARegs.CAN_CTL.bit.CCE = 1; // 비트 타이밍 설정 허용
CanARegs.CAN_BTR.bit.BRP = 9; // 보드레이트 프리스케일러 (1Mbps @ 200MHz)
CanARegs.CAN_BTR.bit.TSEG1 = 13; // TSEG1 = 14
CanARegs.CAN_BTR.bit.TSEG2 = 4; // TSEG2 = 5
CanARegs.CAN_BTR.bit.SJW = 3; // SJW = 4
CanARegs.CAN_CTL.bit.CCE = 0; // 비트 타이밍 설정 완료
EDIS;
// 메일박스 2 설정 (수신)
CanARegs.CAN_IF2CMD.bit.Arb = 1; // Arbitration 필드 설정
CanARegs.CAN_IF2CMD.bit.Control = 1; // 제어 필드 설정
CanARegs.CAN_IF2ARB.bit.MsgVal = 1; // 메일박스 유효
CanARegs.CAN_IF2ARB.bit.Xtd = 0; // 표준 11비트 ID
CanARegs.CAN_IF2ARB.bit.ID = 0x123; // CAN ID
CanARegs.CAN_IF2ARB.bit.Dir = 0; // 수신
CanARegs.CAN_IF2MCTL.bit.DLC = 8; // 데이터 길이 8바이트
CanARegs.CAN_LAM2.bit.LAM = 0x1FFFFFFF; // ID 0x123만 수신
CanARegs.CAN_LAM2.bit.LAMI = 1; // 마스크 활성화
CanARegs.CAN_IF2CMD.bit.MSG_NUM = 2; // 메일박스 2
// CAN 정상 모드
CanARegs.CAN_CTL.bit.INIT = 0; // 정상 모드 진입
for(;;) {
if (CanARegs.CAN_IF2MCTL.bit.NewDat) { // 새로운 데이터 확인
GpioDataRegs.GPBTOGGLE.bit.GPIO31 = 1; // LED 토글
CanARegs.CAN_IF2CMD.bit.MSG_NUM = 2; // 데이터 읽기
}
}
}
설명:
- 기능: ID 0x123인 메시지만 수신하도록 필터링
- 설정: 보드레이트 1Mbps, 메일박스 2 수신, LAM으로 ID 필터링
- GPIO: GPIO8(CANRXA), GPIO10(CANTXA), GPIO31(LED)
- 출력: 메시지 수신 시 LED 토글
5.3 예제 3: CAN 인터럽트 기반 수신
// File: can_interrupt_receive.c
// Description: TMS320F28377D CAN 인터럽트 기반 수신 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D
#include "F28x_Project.h"
__interrupt void cana_isr(void) {
if (CanARegs.CAN_IF2MCTL.bit.NewDat) { // 새로운 데이터 확인
GpioDataRegs.GPBTOGGLE.bit.GPIO31 = 1; // LED 토글
CanARegs.CAN_IF2CMD.bit.MSG_NUM = 2; // 데이터 읽기
}
CanARegs.CAN_MIL.bit.MIL = 0x00000004; // 인터럽트 플래그 클리어 (메일박스 2)
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; // PIE 그룹 9 ACK
}
void main(void) {
// 시스템 초기화
InitSysCtrl(); // 시스템 클럭 및 PLL 초기화
DINT; // 모든 인터럽트 비활성화
InitPieCtrl(); // PIE 초기화
IER = 0x0000; // CPU 인터럽트 비활성화
IFR = 0x0000; // 대기 중인 인터럽트 플래그 지우기
InitPieVectTable(); // PIE 벡터 테이블 초기화
// 인터럽트 벡터 설정
EALLOW;
PieVectTable.CANA0_INT = &cana_isr; // CANA 인터럽트 벡터 설정
EDIS;
// GPIO 설정
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 2; // GPIO8을 CANRXA로 설정
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 2; // GPIO10을 CANTXA로 설정
GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31을 출력(LED)으로 설정
GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
EDIS;
// CANA 클럭 활성화
EALLOW;
CpuSysRegs.PCLKCR0.bit.CAN_A = 1; // CANA 모듈 클럭 활성화
EDIS;
// CAN 초기화
EALLOW;
CanARegs.CAN_CTL.bit.INIT = 1; // 초기화 모드 진입
CanARegs.CAN_CTL.bit.CCE = 1; // 비트 타이밍 설정 허용
CanARegs.CAN_BTR.bit.BRP = 9; // 보드레이트 프리스케일러 (1Mbps @ 200MHz)
CanARegs.CAN_BTR.bit.TSEG1 = 13; // TSEG1 = 14
CanARegs.CAN_BTR.bit.TSEG2 = 4; // TSEG2 = 5
CanARegs.CAN_BTR.bit.SJW = 3; // SJW = 4
CanARegs.CAN_CTL.bit.CCE = 0; // 비트 타이밍 설정 완료
CanARegs.CAN_CTL.bit.IE0 = 1; // 인터럽트 활성화
EDIS;
// 메일박스 2 설정 (수신)
CanARegs.CAN_IF2CMD.bit.Arb = 1; // Arbitration 필드 설정
CanARegs.CAN_IF2CMD.bit.Control = 1; // 제어 필드 설정
CanARegs.CAN_IF2ARB.bit.MsgVal = 1; // 메일박스 유효
CanARegs.CAN_IF2ARB.bit.Xtd = 0; // 표준 11비트 ID
CanARegs.CAN_IF2ARB.bit.ID = 0x123; // CAN ID
CanARegs.CAN_IF2ARB.bit.Dir = 0; // 수신
CanARegs.CAN_IF2MCTL.bit.DLC = 8; // 데이터 길이 8바이트
CanARegs.CAN_IF2MCTL.bit.RmtEn = 0; // 원격 프레임 비활성화
CanARegs.CAN_IF2MCTL.bit.RxIE = 1; // 수신 인터럽트 활성화
CanARegs.CAN_LAM2.bit.LAM = 0x1FFFFFFF; // ID 0x123만 수신
CanARegs.CAN_LAM2.bit.LAMI = 1; // 마스크 활성화
CanARegs.CAN_IF2CMD.bit.MSG_NUM = 2; // 메일박스 2
// 인터럽트 활성화
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; // PIE 그룹 9, CANA0 인터럽트 활성화
IER |= M_INT9; // CPU 인터럽트 9 활성화
EINT; // 글로벌 인터럽트 활성화
// CAN 정상 모드
CanARegs.CAN_CTL.bit.INIT = 0; // 정상 모드 진입
for(;;); // 무한 루프
}
설명:
- 기능: ID 0x123인 메시지를 인터럽트를 통해 수신
- 설정: 보드레이트 1Mbps, 메일박스 2 수신, LAM으로 ID 필터링, 수신 인터럽트 활성화
- GPIO: GPIO8(CANRXA), GPIO10(CANTXA), GPIO31(LED)
- 출력: 메시지 수신 시 LED 토글
6. 사용 방법
6.1 환경 설정
- C2000Ware 설치: C:\ti\c2000\C2000Ware_x_xx_xx_xx에서 라이브러리 다운로드
- CCS 프로젝트: TMS320F28377D 타겟으로 프로젝트 생성, F28x_Project.h 포함
- 링커 파일: device_support\f2837xd 폴더에서 링커 파일 추가
6.2 코드 실행
- 각 예제를 별도의 .c 파일로 저장하거나, main.c에 복사
- 원하는 예제만 실행되도록 다른 코드 주석 처리
6.3 하드웨어 준비
- CAN 핀: CANRXA(GPIO8), CANTXA(GPIO10)에 CAN 트랜시버 연결
- LED: GPIO31에 LED 연결 (정상 동작 확인용)
- CAN 네트워크: CAN 버스에 다른 노드 연결, 120Ω 종단 저항 확인
6.4 디버깅
- CCS Expressions 창: CanARegs.CAN_ES, CanARegs.CAN_IF2MCTL 확인
- 인터럽트 상태: CanARegs.CAN_MIL로 인터럽트 플래그 점검
- 에러 확인: CanARegs.CAN_ES.bit.LEC로 에러 상태 모니터링
- CAN 분석기: CAN 버스 데이터 확인용 CAN 분석기 사용
7. 추가 팁
- 보드레이트 계산: 정확한 비트 타이밍을 위해 TI의 비트 타이밍 계산기 사용
- 캘리브레이션: Device_cal() 호출로 클럭 보정
- 노이즈 감소: CAN 트랜시버와 차동 신호 라인 점검
- C2000Ware 참고: C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\cpu1\can
- 문제 해결:
- 송신 실패: CAN_ES.bit.TXOK, CAN 버스 연결 확인
- 수신 실패: CAN_LAM, CAN_IF2ARB 설정 확인
- 인터럽트 미작동: CAN_CTL.bit.IE0, PieCtrlRegs.PIEIER9 확인
- TI 리소스: TI E2E 포럼, C2000Ware 예제
8. 결론
이 문서는 TMS320F28377D CAN 모듈의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여, 초보자부터 숙련된 개발자까지 쉽게 활용할 수 있도록 구성했습니다. 기본 송신, 수신 및 필터링, 인터럽트 기반 수신 예제를 통해 다양한 CAN 애플리케이션에 적용 가능합니다.
키워드: TMS320F28377D, CAN, C2000, 마이크로컨트롤러, Code Composer Studio, CAN 송신, CAN 수신, Bitfield, 인터럽트, 로컬 수락 마스크, 보드레이트