본문 바로가기
MCU/C2000

[TMS320F28335] CAN, I2C, McBSP 사용법 : Bitfield 구조 활용 예제 코드

by linuxgo 2025. 8. 19.
반응형

1. TMS320F28335 주변 장치 개요

TI의 TMS320F28335는 C2000 Delfino 시리즈의 32비트 마이크로컨트롤러로, 고성능 제어 시스템에서 CAN, I2C, McBSP와 같은 통신 인터페이스를 지원합니다. 이 문서는 CAN, I2C, McBSP 모듈의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여 초보자와 숙련된 개발자 모두 쉽게 활용할 수 있도록 돕습니다.

주요 사양

  • 클럭 소스: 시스템 클럭(SYSCLK, 최대 150MHz)
  • CAN (Controller Area Network): ISO 11898-1 표준, 최대 1Mbps, 32개의 메일박스 지원
  • I2C (Inter-Integrated Circuit): 마스터/슬레이브 모드, 최대 400kHz, 7/10비트 주소 지정
  • McBSP (Multichannel Buffered Serial Port): SPI 및 오디오 프로토콜 지원, 최대 37.5Mbps
  • 인터럽트: 각 모듈별 전용 인터럽트 지원
  • 모듈 수:
    •   CAN: 2개 (eCAN-A, eCAN-B)
    •   I2C: 1개
    •   McBSP: 2개 (McBSP-A, McBSP-B)

2. 주변 장치 Bitfield 설정 상세

TMS320F28335의 CAN, I2C, McBSP 레지스터는 Bitfield 구조로 정의되어 있으며, F2833x_ecan.h, F2833x_i2c.h, F2833x_mcbsp.h 헤더 파일을 통해 접근합니다.

2.1 CAN 주요 레지스터

  • CANCTL (Control Register):
    •   bit.INIT: 초기화 모드 (1: 초기화)
    •   bit.CCE: 설정 변경 허용 (1: 허용)
    •   bit.PDR: 전원 절약 모드
  • CANBTC (Bit Timing Register):
    •   bit.TSEG1: 타이밍 세그먼트 1
    •   bit.TSEG2: 타이밍 세그먼트 2
    •   bit.SJW: 동기화 점프 폭
    •   bit.BRP: 보드레이트 분주비
  • CANMC (Master Control Register):
    •   bit.MBNR: 메일박스 번호 선택
    •   bit.SCB: 표준/확장 식별자 선택
  • CANIF1/2 (Interrupt Flag Registers):
    •   bit.MIF: 메일박스 인터럽트 플래그
    •   bit.TIF: 전송 인터럽트 플래그

2.2 I2C 주요 레지스터

  • I2CMDR (Mode Register):
    •   bit.MST: 마스터/슬레이브 모드 (1: 마스터)
    •   bit.TRX: 송신/수신 모드 (1: 송신)
    •   bit.STT: 시작 조건 생성
    •   bit.STP: 정지 조건 생성
  • I2CCNT: 데이터 전송 바이트 수
  • I2CSAR: 슬레이브 주소 설정
  • I2CPSC: 클럭 분주비 설정
  • I2CISRC: 인터럽트 소스 상태

2.3 McBSP 주요 레지스터

  • SPCR1/2 (Serial Port Control Registers):
    •   bit.RRST/DRST: 수신/송신 리셋
    •   bit.RINTM/XINTM: 인터럽트 모드
  • RCR1/2 (Receive Control Registers):
    •   bit.RWDLEN1/2: 수신 워드 길이
    •   bit.RFRLEN1/2: 수신 프레임 길이
  • XCR1/2 (Transmit Control Registers):
    •   bit.XWDLEN1/2: 송신 워드 길이
    •   bit.XFRLEN1/2: 송신 프레임 길이
  • PCR (Pin Control Register):
    •   bit.CLKXM: 클럭 마스터/슬레이브
    •   bit.FSXM: 프레임 동기화 마스터/슬레이브

3. 설정 절차

3.1 CAN 설정

  1. 시스템 클럭 및 PLL 초기화 (InitSysCtrl())
  2. CAN 클럭 활성화 (PCLKCR0.bit.ECANAENCLK = 1)
  3. CAN 초기화 모드 설정 (CANCTL.bit.INIT = 1)
  4. 비트 타이밍 설정 (CANBTC)
  5. 메일박스 설정 (CANMC, CANMD, CANME)
  6. 인터럽트 설정 (선택, CANIF1/2)
  7. 정상 모드로 전환 (CANCTL.bit.INIT = 0)

3.2 I2C 설정

  1. 시스템 클럭 및 PLL 초기화
  2. I2C 클럭 활성화 (PCLKCR0.bit.I2CAENCLK = 1)
  3. I2C 모듈 리셋 해제 (I2CMDR.bit.IRS = 1)
  4. 클럭 분주비 설정 (I2CPSC, I2CCLKL/H)
  5. 마스터/슬레이브 및 주소 설정 (I2CMDR, I2CSAR)
  6. 데이터 전송 설정 (I2CCNT, I2CDXR)

3.3 McBSP 설정

  1. 시스템 클럭 및 PLL 초기화
  2. McBSP 클럭 활성화 (PCLKCR1.bit.MCBSPA = 1)
  3. McBSP 리셋 (SPCR1.bit.RRST = 0, SPCR2.bit.XRST = 0)
  4. 데이터/프레임 형식 설정 (RCR1/2, XCR1/2)
  5. 클럭 및 프레임 동기화 설정 (PCR, SRGR)
  6. 인터럽트 설정 (선택)
  7. 모듈 활성화 (SPCR1.bit.RRST = 1, SPCR2.bit.XRST = 1)

4. 설정 고려사항

  • CAN: 비트 타이밍 계산 주의, CAN 네트워크와 호환되는 보드레이트 설정
  • I2C: 풀업 저항 필수, 주소 충돌 방지
  • McBSP: SPI 모드 사용 시 클럭 극성 및 위상 설정 확인
  • 인터럽트: PIE 벡터 테이블 설정 및 우선순위 관리
  • GPIO: 각 통신 모듈의 핀 멀티플렉서 설정 (GPAMUX, GPBMUX)

5. 실용적인 예제 코드 (Bitfield 구조)

아래는 TMS320F28335의 CAN, I2C, McBSP 모듈을 Bitfield 구조로 설정하여 특정 디바이스와 통신하는 예제 코드입니다. McBSP 예제는 SPI, 오디오, TDM 모드를 포함합니다. Code Composer Studio(CCS)와 C2000Ware 환경에서 실행 가능합니다.

5.1 CAN 예제: CAN 네트워크를 통한 데이터 송수신 (상대 디바이스: CAN 노드)

// File: ecan_node_comm.c
// Description: TMS320F28335 eCAN 송수신 예제 (1Mbps, CAN 노드와 통신)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335

#include "F28x_Project.h"

volatile Uint32 rx_data[2]; // 수신 데이터 저장

__interrupt void ecan_rx_isr(void) {
    rx_data[0] = EcanbMboxes.MBOX1.MDL.WORD0; // 수신 데이터 읽기
    rx_data[1] = EcanbMboxes.MBOX1.MDH.WORD0;
    EcanbRegs.CANRMP.bit.RMP1 = 1; // 수신 플래그 클리어
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; // PIE ACK
}

void ConfigureGPIO(void) {
    EALLOW;
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // GPIO34를 출력으로 설정 (LED용)
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
    GpioDataRegs.GPBSET.bit.GPIO34 = 1; // LED 켬
    GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 2; // GPIO30을 CANRXA로 설정
    GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 2; // GPIO31을 CANTXA로 설정
    EDIS;
}

void ConfigureECAN(void) {
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.ECANAENCLK = 1; // eCAN-A 클럭 활성화
    EDIS;

    EcanbRegs.CANCTL.bit.INIT = 1; // 초기화 모드 진입
    EcanbRegs.CANCTL.bit.CCE = 1; // 비트 타이밍 설정 허용

    // 비트 타이밍: 1Mbps @ SYSCLK=150MHz
    EcanbRegs.CANBTC.bit.BRPREG = 4; // BRP = 5 (150MHz/(5+1) = 25MHz)
    EcanbRegs.CANBTC.bit.TSEG1REG = 13; // TSEG1 = 14
    EcanbRegs.CANBTC.bit.TSEG2REG = 2; // TSEG2 = 3
    EcanbRegs.CANBTC.bit.SJWREG = 1; // SJW = 2

    // 송신 메일박스 0 설정
    EcanbMboxes.MBOX0.MSGID.bit.STDMSGID = 0x100; // 송신 ID
    EcanbMboxes.MBOX0.MSGCTRL.bit.DLC = 8; // 데이터 길이 8바이트
    EcanbMboxes.MBOX0.MDL.WORD0 = 0x12345678; // 송신 데이터
    EcanbMboxes.MBOX0.MDH.WORD0 = 0x9ABCDEF0;
    EcanbRegs.CANME.bit.ME0 = 1; // 메일박스 0 활성화
    EcanbRegs.CANMD.bit.MD0 = 0; // 메일박스 0 송신

    // 수신 메일박스 1 설정
    EcanbMboxes.MBOX1.MSGID.bit.STDMSGID = 0x200; // 수신 ID
    EcanbMboxes.MBOX1.MSGCTRL.bit.DLC = 8;
    EcanbRegs.CANME.bit.ME1 = 1; // 메일박스 1 활성화
    EcanbRegs.CANMD.bit.MD1 = 1; // 메일박스 1 수신
    EcanbRegs.CANMIM.bit.MIM1 = 1; // 메일박스 1 인터럽트 활성화

    EcanbRegs.CANCTL.bit.CCE = 0; // 비트 타이밍 설정 완료
    EcanbRegs.CANCTL.bit.INIT = 0; // 정상 모드로 전환
}

void main(void) {
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    EALLOW;
    PieVectTable.ECAN1_INTB = &ecan_rx_isr; // 수신 인터럽트 벡터 설정
    EDIS;

    ConfigureGPIO();
    ConfigureECAN();

    PieCtrlRegs.PIEIER9.bit.INTx6 = 1; // eCAN-B 인터럽트 활성화
    IER |= M_INT9; // CPU 인터럽트 그룹 9 활성화
    EINT; // 글로벌 인터럽트 활성화

    EcanbRegs.CANTRR.bit.TRR0 = 1; // 메일박스 0 송신 요청

    for(;;) {
        if (EcanbRegs.CANRMP.bit.RMP1) { // 수신 데이터 확인
            GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1; // LED 토글
        }
    }
}

설명:

  • 기능: eCAN-A를 통해 1Mbps로 CAN 노드(예: 다른 TMS320F28335 또는 CAN 분석기)와 데이터 송수신
  • 설정: 송신 메일박스 0 (ID=0x100, 데이터 0x12345678, 0x9ABCDEF0), 수신 메일박스 1 (ID=0x200), 인터럽트 활성화
  • GPIO: GPIO30(CANRXA), GPIO31(CANTXA), GPIO34(LED)
  • 출력: CAN 네트워크로 데이터 송신, 수신 시 LED 토글

5.2 I2C 예제: AT24C256 EEPROM에 데이터 쓰기 및 읽기

// File: i2c_eeprom_at24c256.c
// Description: TMS320F28335 I2C로 AT24C256 EEPROM 쓰기/읽기 예제 (100kHz)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335

#include "F28x_Project.h"

volatile Uint16 eeprom_data; // 읽은 데이터 저장

void ConfigureGPIO(void) {
    EALLOW;
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // GPIO34를 출력으로 설정 (LED용)
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
    GpioDataRegs.GPBSET.bit.GPIO34 = 1; // LED 켬
    GpioCtrlRegs.GPAMUX2.bit.GPIO32 = 2; // GPIO32를 SDAA로 설정
    GpioCtrlRegs.GPAMUX2.bit.GPIO33 = 2; // GPIO33을 SCLA로 설정
    EDIS;
}

void I2C_Write(Uint16 address, Uint16 data) {
    I2caRegs.I2CSAR = 0x50; // AT24C256 주소
    I2caRegs.I2CCNT = 3; // 주소 2바이트 + 데이터 1바이트
    I2caRegs.I2CDXR = (address >> 8) & 0xFF; // 주소 상위 바이트
    I2caRegs.I2CDXR = address & 0xFF; // 주소 하위 바이트
    I2caRegs.I2CDXR = data; // 데이터
    I2caRegs.I2CMDR.bit.MST = 1; // 마스터 모드
    I2caRegs.I2CMDR.bit.TRX = 1; // 송신 모드
    I2caRegs.I2CMDR.bit.STT = 1; // 시작 조건
    while(I2caRegs.I2CSTR.bit.BB); // 버스 비지 대기
    I2caRegs.I2CMDR.bit.STP = 1; // 정지 조건
    while(I2caRegs.I2CSTR.bit.SCD == 0); // 전송 완료 대기
    DELAY_US(5000); // EEPROM 쓰기 시간 대기
}

Uint16 I2C_Read(Uint16 address) {
    I2caRegs.I2CSAR = 0x50; // AT24C256 주소
    I2caRegs.I2CCNT = 2; // 주소 2바이트
    I2caRegs.I2CDXR = (address >> 8) & 0xFF; // 주소 상위 바이트
    I2caRegs.I2CDXR = address & 0xFF; // 주소 하위 바이트
    I2caRegs.I2CMDR.bit.MST = 1; // 마스터 모드
    I2caRegs.I2CMDR.bit.TRX = 1; // 송신 모드
    I2caRegs.I2CMDR.bit.STT = 1; // 시작 조건
    while(I2caRegs.I2CSTR.bit.BB); // 버스 비지 대기

    I2caRegs.I2CCNT = 1; // 읽기 1바이트
    I2caRegs.I2CMDR.bit.TRX = 0; // 수신 모드
    I2caRegs.I2CMDR.bit.STT = 1; // 반복 시작 조건
    while(I2caRegs.I2CSTR.bit.BB); // 버스 비지 대기
    while(I2caRegs.I2CSTR.bit.RRDY == 0); // 데이터 준비 대기
    Uint16 data = I2caRegs.I2CDRR; // 데이터 읽기
    I2caRegs.I2CMDR.bit.STP = 1; // 정지 조건
    return data;
}

void ConfigureI2C(void) {
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.I2CAENCLK = 1; // I2C 클럭 활성화
    EDIS;

    I2caRegs.I2CMDR.bit.IRS = 0; // I2C 리셋
    I2caRegs.I2CPSC.all = 14; // I2C 클럭: 150MHz/(14+1) = 10MHz
    I2caRegs.I2CCLKL = 45; // 100kHz: (10MHz/(45+55+4)) = ~100kHz
    I2caRegs.I2CCLKH = 55;
    I2caRegs.I2CMDR.bit.IRS = 1; // I2C 활성화
}

void main(void) {
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    ConfigureGPIO();
    ConfigureI2C();

    I2C_Write(0x0000, 0x5A); // 주소 0x0000에 데이터 0x5A 쓰기
    eeprom_data = I2C_Read(0x0000); // 주소 0x0000에서 데이터 읽기

    if (eeprom_data == 0x5A) {
        GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1; // 데이터 일치 시 LED 토글
    }

    for(;;); // 무한 루프
}

설명:

  • 기능: I2C로 AT24C256 EEPROM에 데이터(0x5A)를 쓰고 읽어 확인
  • 설정: 클럭 100kHz, 슬레이브 주소 0x50, 2바이트 주소 지정
  • GPIO: GPIO32(SDAA), GPIO33(SCLA), GPIO34(LED)
  • 출력: EEPROM에 데이터 쓰기/읽기, 읽은 데이터 일치 시 LED 토글

5.3 McBSP 예제 1: MCP3208 ADC와 SPI 통신

// File: mcbsp_spi_mcp3208.c
// Description: TMS320F28335 McBSP로 MCP3208 ADC 데이터 읽기 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335

#include "F28x_Project.h"

volatile Uint16 adc_value; // ADC 데이터 저장

void ConfigureGPIO(void) {
    EALLOW;
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // GPIO34를 출력으로 설정 (LED용)
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
    GpioDataRegs.GPBSET.bit.GPIO34 = 1; // LED 켬
    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 2; // GPIO16을 SPISIMOA로 설정
    GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 2; // GPIO17을 SPISOMIA로 설정
    GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 2; // GPIO18을 SPICLKA로 설정
    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 2; // GPIO19을 SPISTEA로 설정
    EDIS;
}

Uint16 ReadMCP3208(Uint16 channel) {
    Uint16 command = (0x06 | (channel >> 2)) << 8 | ((channel & 0x03) << 6); // MCP3208 명령어 (단일 모드, 채널 선택)
    McbspaRegs.DXR1.all = command >> 4; // 상위 12비트 전송
    while(McbspaRegs.SPCR1.bit.RRDY == 0); // 데이터 수신 대기
    Uint16 dummy = McbspaRegs.DRR1.all; // 더미 데이터 읽기
    McbspaRegs.DXR1.all = 0x0000; // 하위 4비트 및 나머지 전송
    while(McbspaRegs.SPCR1.bit.RRDY == 0); // 데이터 수신 대기
    Uint16 data = McbspaRegs.DRR1.all; // 12비트 ADC 데이터 (하위 12비트)
    return data & 0x0FFF; // 유효 12비트 반환
}

void ConfigureMcBSP(void) {
    EALLOW;
    CpuSysRegs.PCLKCR1.bit.MCBSPA = 1; // McBSP-A 클럭 활성화
    EDIS;

    McbspaRegs.SPCR2.bit.XRST = 0; // 송신 리셋
    McbspaRegs.SPCR1.bit.RRST = 0; // 수신 리셋

    McbspaRegs.PCR.bit.CLKXM = 1; // 클럭 마스터
    McbspaRegs.PCR.bit.CLKXP = 0; // 클럭 상승 에지
    McbspaRegs.PCR.bit.FSXM = 1; // 프레임 동기화 마스터
    McbspaRegs.PCR.bit.FSXP = 1; // 프레임 활성 Low
    McbspaRegs.SRGR1.bit.CLKGDV = 49; // 클럭 분주: 150MHz/(49+1) = 3MHz

    McbspaRegs.RCR1.bit.RWDLEN1 = 2; // 16비트 데이터
    McbspaRegs.XCR1.bit.XWDLEN1 = 2; // 16비트 데이터
    McbspaRegs.RCR2.bit.RFRLEN2 = 0; // 프레임 길이 1
    McbspaRegs.XCR2.bit.XFRLEN2 = 0; // 프레임 길이 1

    McbspaRegs.SPCR2.bit.XRST = 1; // 송신 활성화
    McbspaRegs.SPCR1.bit.RRST = 1; // 수신 활성화
}

void main(void) {
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    ConfigureGPIO();
    ConfigureMcBSP();

    adc_value = ReadMCP3208(0); // 채널 0에서 ADC 값 읽기

    if (adc_value > 2048) { // ADC 값이 절반(2.5V) 이상이면
        GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1; // LED 토글
    }

    for(;;); // 무한 루프
}

설명:

  • 기능: McBSP-A를 SPI 마스터로 설정, MCP3208 ADC의 채널 0에서 12비트 데이터 읽기
  • 설정: 클럭 3MHz, 16비트 데이터, MCP3208 명령어 포맷
  • GPIO: GPIO16(SPISIMOA), GPIO17(SPISOMIA), GPIO18(SPICLKA), GPIO19(SPISTEA), GPIO34(LED)
  • 출력: ADC 값 읽기, 값이 2048(2.5V) 이상이면 LED 토글

5.4 McBSP 예제 2: PCM5102 DAC를 위한 오디오 모드

// File: mcbsp_audio_pcm5102.c
// Description: TMS320F28335 McBSP로 PCM5102 DAC에 오디오 데이터 전송 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335

#include "F28x_Project.h"

volatile Uint16 sample_index = 0;
const Uint16 square_wave[8] = {0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x0000, 0x0000, 0x0000, 0x0000}; // 1kHz 사각파

__interrupt void mcbsp_tx_isr(void) {
    McbspaRegs.DXR1.all = square_wave[sample_index]; // 사각파 데이터 전송
    sample_index = (sample_index + 1) % 8; // 다음 샘플로 이동
    McbspaRegs.SPCR2.bit.XINTM = 0x01; // 다음 인터럽트 활성화
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP6; // PIE ACK
}

void ConfigureGPIO(void) {
    EALLOW;
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // GPIO34를 출력으로 설정 (LED용)
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
    GpioDataRegs.GPBSET.bit.GPIO34 = 1; // LED 켬
    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 2; // GPIO16을 MDXA로 설정 (데이터)
    GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 2; // GPIO18을 MCLKXA로 설정 (클럭)
    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 2; // GPIO19을 MFSXA로 설정 (프레임 동기)
    EDIS;
}

void ConfigureMcBSP(void) {
    EALLOW;
    CpuSysRegs.PCLKCR1.bit.MCBSPA = 1; // McBSP-A 클럭 활성화
    EDIS;

    McbspaRegs.SPCR2.bit.XRST = 0; // 송신 리셋
    McbspaRegs.SPCR1.bit.RRST = 0; // 수신 리셋

    McbspaRegs.PCR.bit.CLKXM = 1; // 클럭 마스터
    McbspaRegs.PCR.bit.CLKXP = 0; // 클럭 상승 에지
    McbspaRegs.PCR.bit.FSXM = 1; // 프레임 동기화 마스터
    McbspaRegs.PCR.bit.FSXP = 0; // 프레임 활성 High (PCM5102 I2S 포맷)
    McbspaRegs.SRGR1.bit.CLKGDV = 29; // 클럭 분주: 150MHz/(29+1) = 5MHz
    McbspaRegs.SRGR2.bit.FPER = 31; // 프레임 주기: 32비트 (I2S 스테레오)
    McbspaRegs.SRGR2.bit.FSGM = 0; // 프레임 동기화 내부 생성

    McbspaRegs.XCR1.bit.XWDLEN1 = 2; // 16비트 데이터
    McbspaRegs.XCR2.bit.XFRLEN2 = 1; // 프레임 길이 2 (스테레오)
    McbspaRegs.XCR2.bit.XDATDLY = 1; // 1비트 지연 (I2S 포맷)
    McbspaRegs.SPCR2.bit.XINTM = 0x01; // 송신 인터럽트 활성화 (XRDY)

    McbspaRegs.SPCR2.bit.XRST = 1; // 송신 활성화
    McbspaRegs.SPCR1.bit.RRST = 1; // 수신 활성화 (필요 시)
}

void main(void) {
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    EALLOW;
    PieVectTable.MCBSPA_TX = &mcbsp_tx_isr; // 송신 인터럽트 벡터 설정
    EDIS;

    ConfigureGPIO();
    ConfigureMcBSP();

    PieCtrlRegs.PIEIER6.bit.INTx6 = 1; // McBSP-A 송신 인터럽트 활성화
    IER |= M_INT6; // CPU 인터럽트 그룹 6 활성화
    EINT; // 글로벌 인터럽트 활성화

    for(;;) {
        GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1; // 동작 중 LED 토글
        DELAY_US(500000); // 0.5초 간격
    }
}

설명:

  • 기능: McBSP-A를 I2S 오디오 모드로 설정, PCM5102 DAC에 1kHz 사각파 전송
  • 설정: 클럭 5MHz, 16비트 스테레오, I2S 포맷, 송신 인터럽트로 샘플 전송
  • GPIO: GPIO16(MDXA), GPIO18(MCLKXA), GPIO19(MFSXA), GPIO34(LED)
  • 출력: PCM5102로 오디오 출력, 동작 중 LED 토글

5.5 McBSP 예제 3: TDM 모드로 다채널 데이터 전송

// File: mcbsp_tdm.c
// Description: TMS320F28335 McBSP로 TDM 다채널 데이터 전송 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335

#include "F28x_Project.h"

volatile Uint16 tdm_data[4] = {0x1111, 0x2222, 0x3333, 0x4444}; // TDM 채널 데이터
volatile Uint16 channel_index = 0;

__interrupt void mcbsp_tx_isr(void) {
    McbspaRegs.DXR1.all = tdm_data[channel_index]; // 현재 채널 데이터 전송
    channel_index = (channel_index + 1) % 4; // 다음 채널로 이동
    McbspaRegs.SPCR2.bit.XINTM = 0x01; // 다음 인터럽트 활성화
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP6; // PIE ACK
}

void ConfigureGPIO(void) {
    EALLOW;
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // GPIO34를 출력으로 설정 (LED용)
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
    GpioDataRegs.GPBSET.bit.GPIO34 = 1; // LED 켬
    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 2; // GPIO16을 MDXA로 설정 (데이터)
    GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 2; // GPIO18을 MCLKXA로 설정 (클럭)
    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 2; // GPIO19을 MFSXA로 설정 (프레임 동기)
    EDIS;
}

void ConfigureMcBSP(void) {
    EALLOW;
    CpuSysRegs.PCLKCR1.bit.MCBSPA = 1; // McBSP-A 클럭 활성화
    EDIS;

    McbspaRegs.SPCR2.bit.XRST = 0; // 송신 리셋
    McbspaRegs.SPCR1.bit.RRST = 0; // 수신 리셋

    McbspaRegs.PCR.bit.CLKXM = 1; // 클럭 마스터
    McbspaRegs.PCR.bit.CLKXP = 0; // 클럭 상승 에지
    McbspaRegs.PCR.bit.FSXM = 1; // 프레임 동기화 마스터
    McbspaRegs.PCR.bit.FSXP = 0; // 프레임 활성 High
    McbspaRegs.SRGR1.bit.CLKGDV = 49; // 클럭 분주: 150MHz/(49+1) = 3MHz
    McbspaRegs.SRGR2.bit.FPER = 63; // 프레임 주기: 64비트 (4채널 x 16비트)
    McbspaRegs.SRGR2.bit.FSGM = 0; // 프레임 동기화 내부 생성

    McbspaRegs.XCR1.bit.XWDLEN1 = 2; // 16비트 데이터
    McbspaRegs.XCR2.bit.XFRLEN2 = 3; // 프레임 길이 4 (4채널)
    McbspaRegs.XCR2.bit.XDATDLY = 0; // 데이터 지연 없음 (TDM 포맷)
    McbspaRegs.SPCR2.bit.XINTM = 0x01; // 송신 인터럽트 활성화 (XRDY)

    McbspaRegs.SPCR2.bit.XRST = 1; // 송신 활성화
    McbspaRegs.SPCR1.bit.RRST = 1; // 수신 활성화 (필요 시)
}

void main(void) {
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    EALLOW;
    PieVectTable.MCBSPA_TX = &mcbsp_tx_isr; // 송신 인터럽트 벡터 설정
    EDIS;

    ConfigureGPIO();
    ConfigureMcBSP();

    PieCtrlRegs.PIEIER6.bit.INTx6 = 1; // McBSP-A 송신 인터럽트 활성화
    IER |= M_INT6; // CPU 인터럽트 그룹 6 활성화
    EINT; // 글로벌 인터럽트 활성화

    for(;;) {
        GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1; // 동작 중 LED 토글
        DELAY_US(500000); // 0.5초 간격
    }
}

설명:

  • 기능: McBSP-A를 TDM 모드로 설정, 4채널 데이터(0x1111, 0x2222, 0x3333, 0x4444) 전송
  • 설정: 클럭 3MHz, 16비트 데이터, 4채널 TDM 프레임, 송신 인터럽트
  • GPIO: GPIO16(MDXA), GPIO18(MCLKXA), GPIO19(MFSXA), GPIO34(LED)
  • 출력: TDM 호환 장치로 다채널 데이터 전송, 동작 중 LED 토글

6. 사용 방법

6.1 환경 설정

  • C2000Ware 설치: C:\ti\c2000\C2000Ware_x_xx_xx_xx
  • CCS 프로젝트: TMS320F28335 타겟으로 프로젝트 생성, F28x_Project.h 포함
  • 링커 파일: device_support\f2833x 폴더에서 링커 파일 추가

6.2 코드 실행

  • 각 예제를 별도의 .c 파일로 저장하거나, main.c에 복사
  • 다른 예제 코드 주석 처리

6.3 하드웨어 준비

  • CAN: CAN 트랜시버(SN65HVD230)와 CAN 노드(예: 다른 TMS320F28335 또는 CAN 분석기) 연결, 120Ω 터미네이터 저항
  • I2C: AT24C256 EEPROM 연결, SDAA/SCLA에 4.7kΩ 풀업 저항
  • McBSP (SPI): MCP3208 ADC 연결, Vref=5V, 아날로그 입력 준비
  • McBSP (Audio): PCM5102 DAC 연결, I2S 포맷 준수, 오디오 출력 준비
  • McBSP (TDM): TDM 호환 장치 연결, 데이터/클럭/프레임 동기 라인 준비
  • LED: GPIO34에 LED 연결

6.4 디버깅

  • CAN: EcanbRegs.CANRMP, EcanbRegs.CANGIF0로 송수신 상태 확인
  • I2C: I2caRegs.I2CSTR.bit.BB, I2caRegs.I2CDRR로 데이터 확인
  • McBSP: McbspaRegs.DRR1.all로 수신 데이터 확인 (SPI/TDM), McbspaRegs.DXR1.all로 송신 데이터 확인
  • CCS Expressions 창: 레지스터 값 모니터링

7. 추가 팁

  • CAN: 비트 타이밍 계산은 TI의 CAN Bit Timing Calculator 사용
  • I2C: AT24C256 데이터시트에서 쓰기 시간(5ms) 확인
  • McBSP:
    • SPI: MCP3208의 SPI 타이밍 요구사항(클럭 극성, 위상) 준수
    • Audio: PCM5102 데이터시트에서 I2S 포맷 및 샘플레이트 확인
    • TDM: 프레임 길이와 채널 수 일치 확인
  • 문제 해결:
    • CAN 송수신 실패: CANME, CANMD, 네트워크 연결 확인
    • I2C 통신 실패: 풀업 저항, I2CSAR, EEPROM 주소 확인
    • McBSP 데이터 오류: PCR.bit.CLKXP, PCR.bit.FSXP, 장치 연결 확인
  • TI 리소스: TI E2E 포럼, C2000Ware 예제 (C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2833x\examples)

8. 결론

이 문서는 TMS320F28335의 CAN, I2C, McBSP 모듈 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여 특정 디바이스와의 통신 애플리케이션에 적용 가능하도록 구성했습니다.

키워드: TMS320F28335, CAN, I2C, McBSP, C2000, 마이크로컨트롤러, Code Composer Studio, SPI, I2S, TDM, AT24C256, MCP3208, PCM5102

반응형