본문 바로가기
MCU/C2000

[TMS320F28377D] USB, I2C, McBSP, uPP 사용법 : Bitfield 구조 활용 예제 코드

by linuxgo 2025. 8. 18.
반응형

TI의 TMS320F28377D는 C2000 Delfino 시리즈의 32비트 마이크로컨트롤러로, USB, I2C, McBSP, uPP와 같은 다양한 통신 인터페이스를 지원하여 데이터 전송, 센서 인터페이스, 오디오 처리, 고속 병렬 데이터 전송 등에 적합합니다. 이 글에서는 TMS320F28377D의 USB, I2C, McBSP, uPP 모듈의 상세한 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두가 쉽게 활용할 수 있도록 돕겠습니다. 모든 예제는 Code Composer Studio(CCS)와 C2000Ware 환경에서 실행 가능합니다.


1. TMS320F28377D 통신 모듈 개요

TMS320F28377D는 다양한 통신 인터페이스를 제공하며, 각 모듈은 고속 및 정밀한 데이터 전송을 지원합니다. 아래는 주요 통신 모듈의 사양입니다:

1.1 USB (Universal Serial Bus)

  • 사양: USB 2.0 Full-Speed (12Mbps), 호스트/디바이스 모드 지원
  • 주요 기능:
    •    엔드포인트: 4개의 양방향 엔드포인트 (EP0~EP3)
    •    FIFO: 4KB 통합 FIFO
    •    DMA 지원
    •    인터럽트: USB 이벤트 기반 인터럽트 (연결, 데이터 전송 등)
  • 용도: 외부 장치 연결, 데이터 로깅, 펌웨어 업데이트

1.2 I2C (Inter-Integrated Circuit)

  • 사양: 최대 400kHz (Fast Mode), 7비트/10비트 주소 지정
  • 주요 기능:
    •    마스터/슬레이브 모드
    •    멀티마스터 지원
    •    인터럽트: 데이터 전송/수신, 에러 처리
  • 용도: 센서, EEPROM, 디스플레이 모듈 인터페이스

1.3 McBSP (Multichannel Buffered Serial Port)

  • 사양: 고속 직렬 통신, 최대 50Mbps
  • 주요 기능:
    •    풀 듀플렉스 통신
    •    다채널 지원 (최대 128채널)
    •    데이터 포맷: 8/12/16/20/24/32비트
    •    인터럽트 및 DMA 지원
  • 용도: 오디오 코덱, 디지털 신호 처리, SPI 호환 통신

1.4 uPP (Universal Parallel Port)

  • 사양: 고속 병렬 데이터 전송, 최대 75MHz
  • 주요 기능:
    •    8비트/16비트 데이터 전송
    •    단일/듀얼 채널 모드
    •    DMA 연동
  • 용도: 고속 ADC/DAC, FPGA 인터페이스, 대용량 데이터 전송

2. Bitfield 설정 상세

TMS320F28377D의 통신 모듈 레지스터는 Bitfield 구조로 정의되어 있어, F2837xD_usb.h, F2837xD_i2c.h, F2837xD_mcbsp.h, F2837xD_upp.h 헤더 파일을 통해 접근합니다. Bitfield는 명확한 비트 단위 설정으로 코드 가독성과 유지보수성을 높입니다. 주요 레지스터와 Bitfield는 다음과 같습니다:

2.1 USB 주요 레지스터

  • USB0CTRL: USB 컨트롤러 활성화/비활성화
    •    bit.USBMODE: 디바이스(0) 또는 호스트(1) 모드
    •    bit.ENABLE: USB 모듈 활성화
  • USB0TXIS: 전송 인터럽트 상태
  • USB0RXIS: 수신 인터럽트 상태
  • USB0TXCSRLn: 엔드포인트 n 전송 제어/상태
    •    bit.TXRDY: 전송 준비
    •    bit.FIFONE: FIFO 비움
  • USB0RXCSRLn: 엔드포인트 n 수신 제어/상태
    •    bit.RXRDY: 수신 준비

2.2 I2C 주요 레지스터

  • I2CMCR: 마스터 제어
    •    bit.MFE: 마스터 기능 활성화
    •    bit.SFE: 슬레이브 기능 활성화
  • I2CPSC: 프리스케일러 (I2C 클럭 설정)
  • I2CMDR: 모드 레지스터
    •    bit.STT: 시작 조건 생성
    •    bit.STP: 정지 조건 생성
    •    bit.MST: 마스터/슬레이브 선택
  • I2CFFTX: FIFO 전송 제어
    •    bit.I2CFFEN: FIFO 활성화

2.3 McBSP 주요 레지스터

  • MCBSP_DRR: 데이터 수신 레지스터
  • MCBSP_DXR: 데이터 전송 레지스터
  • MCBSP_SPCR1/2: 직렬 포트 제어
    •    bit.RRDY: 수신 데이터 준비
    •    bit.XRDY: 전송 데이터 준비
    •    bit.CLKSTP: 클럭 정지 모드
  • MCBSP_RCR1/2: 수신 제어
    •    bit.RWDLEN1: 수신 워드 길이
  • MCBSP_XCR1/2: 전송 제어
    •    bit.XWDLEN1: 전송 워드 길이

2.4 uPP 주요 레지스터

  • UPPCTL: uPP 제어
    •    bit.EN: uPP 활성화
    •    bit.MODE: 단일(0) 또는 듀얼(1) 채널
  • UPPCHCTL: 채널 제어
    •    bit.DATARATE: 데이터 전송 속도
  • UPPDMACTL: DMA 제어
    •    bit.DMAEN: DMA 활성화
  • UPPINTEN: 인터럽트 활성화

3. 통신 모듈 설정 절차

각 모듈을 효과적으로 설정하려면 다음 단계를 따릅니다:

3.1 시스템 초기화

  • InitSysCtrl(): 시스템 클럭과 PLL 초기화 (SYSCLK=200MHz)
  • 인터럽트 비활성화 및 PIE 초기화: DINT, InitPieCtrl, InitPieVectTable
  • 보호된 레지스터 접근: EALLOW와 EDIS 사용

3.2 모듈 클럭 활성화

  • USB: CpuSysRegs.PCLKCR13.bit.USB_A = 1
  • I2C: CpuSysRegs.PCLKCR10.bit.I2C_A = 1
  • McBSP: CpuSysRegs.PCLKCR10.bit.MCBSP_A = 1
  • uPP: CpuSysRegs.PCLKCR13.bit.UPP_A = 1

3.3 GPIO 설정

  • 각 모듈의 핀을 적절한 기능으로 설정 (예: GpioCtrlRegs.GPAMUX1)
  • 입력/출력 방향 설정 (GpioCtrlRegs.GPADIR)

3.4 모듈별 설정

  • USB:
    •    모드 선택 (디바이스/호스트)
    •    엔드포인트 설정 및 FIFO 구성
    •    인터럽트 활성화
  • I2C:
    •    클럭 설정 (I2CPSC, I2CCLKL/H)
    •    마스터/슬레이브 모드 설정
    •    데이터 전송/수신 설정
  • McBSP:
    •    데이터 워드 길이 및 프레임 설정
    •    클럭 및 프레임 동기화 설정
    •    인터럽트 또는 DMA 설정
  • uPP:
    •    데이터 포맷 및 채널 설정
    •    DMA 연동 설정
    •    인터럽트 활성화

3.5 모듈 실행

  • 모듈 활성화 및 데이터 전송 시작
  • 인터럽트 또는 폴링 방식으로 데이터 처리

4. 통신 모듈 설정 고려사항

  • 클럭 설정: SYSCLK(200MHz)를 기반으로 각 모듈의 클럭 분주 설정
  • 인터럽트 관리: PIE 그룹 및 CPU 인터럽트 활성화 확인
  • GPIO 충돌 방지: 동일한 핀을 다른 모듈과 공유하지 않도록 주의
  • 데이터 포맷: 각 모듈의 데이터 길이 및 포맷 일치 확인
  • DMA 활용: 고속 데이터 전송 시 DMA 사용 권장
  • 에러 처리: NACK, 버스 충돌, FIFO 오버플로우 등 에러 처리 로직 포함

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

아래는 TMS320F28377D의 USB, I2C, McBSP, uPP 모듈을 Bitfield 구조로 설정한 실용적인 예제 코드입니다. 각 예제는 기본적인 기능을 구현하며, CCS와 C2000Ware 환경에서 실행 가능합니다.

5.1 예제 1: USB 디바이스 모드 (데이터 전송)

// File: usb_device.c
// Description: TMS320F28377D USB 디바이스 모드 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void) {
    // 시스템 초기화
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 2; // GPIO34: USB0DM
    GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 2; // GPIO35: USB0DP
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31: LED
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // USB 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR13.bit.USB_A = 1;
    EDIS;

    // USB 디바이스 모드 설정
    EALLOW;
    Usb0Regs.USB0CTRL.bit.USBMODE = 0; // 디바이스 모드
    Usb0Regs.USB0CTRL.bit.ENABLE = 1; // USB 모듈 활성화
    Usb0Regs.USB0FADDR.bit.FADDR = 0; // 기본 주소
    EDIS;

    // 엔드포인트 1 설정 (IN 전송)
    Usb0Regs.USB0TXMAXP1.bit.MAXLOAD = 64; // 최대 패킷 크기 64바이트
    Usb0Regs.USB0TXCSRL1.bit.TXRDY = 0; // 전송 준비 초기화

    // 테스트 데이터 전송
    Uint16 data[] = {0x1234, 0x5678};
    Usb0Regs.USB0TXFIFO1 = data[0]; // FIFO에 데이터 쓰기
    Usb0Regs.USB0TXCSRL1.bit.TXRDY = 1; // 전송 시작

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

설명:

  • 기능: USB 디바이스 모드로 설정, 엔드포인트 1을 통해 테스트 데이터 전송
  • 설정: USB0DM/DP 핀 설정, 디바이스 모드, 64바이트 패킷
  • GPIO: GPIO34(USB0DM), GPIO35(USB0DP), GPIO31(LED)
  • 출력: USB 연결 시 데이터 전송, LED ON

5.2 예제 2: USB 인터럽트 기반 데이터 전송

// File: usb_interrupt.c
// Description: TMS320F28377D USB 인터럽트 기반 데이터 전송 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

volatile Uint16 data_index = 0;
volatile Uint16 data[] = {0x1111, 0x2222, 0x3333, 0x4444};

__interrupt void usb_isr(void) {
    if(Usb0Regs.USB0TXIS.bit.EP1) { // 엔드포인트 1 전송 인터럽트
        Usb0Regs.USB0TXCSRL1.bit.TXRDY = 0; // 전송 플래그 클리어
        if(data_index < 4) {
            Usb0Regs.USB0TXFIFO1 = data[data_index++]; // 다음 데이터 쓰기
            Usb0Regs.USB0TXCSRL1.bit.TXRDY = 1; // 전송 시작
        }
        Usb0Regs.USB0TXIS.bit.EP1 = 0; // 인터럽트 플래그 클리어
    }
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP7; // PIE 그룹 7 ACK
}

void main(void) {
    // 시스템 초기화
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    // 인터럽트 벡터 설정
    EALLOW;
    PieVectTable.USB0_INT = &usb_isr; // USB 인터럽트 벡터
    EDIS;

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 2; // GPIO34: USB0DM
    GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 2; // GPIO35: USB0DP
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31: LED
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // USB 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR13.bit.USB_A = 1;
    EDIS;

    // USB 디바이스 모드 설정
    EALLOW;
    Usb0Regs.USB0CTRL.bit.USBMODE = 0; // 디바이스 모드
    Usb0Regs.USB0CTRL.bit.ENABLE = 1; // USB 모듈 활성화
    Usb0Regs.USB0FADDR.bit.FADDR = 0; // 기본 주소
    Usb0Regs.USB0TXIE.bit.EP1 = 1; // 엔드포인트 1 인터럽트 활성화
    EDIS;

    // 엔드포인트 1 설정 (IN 전송)
    Usb0Regs.USB0TXMAXP1.bit.MAXLOAD = 64; // 최대 패킷 크기 64바이트
    Usb0Regs.USB0TXCSRL1.bit.TXRDY = 0; // 전송 준비 초기화

    // 인터럽트 활성화
    PieCtrlRegs.PIEIER7.bit.INTx5 = 1; // USB 인터럽트 (그룹 7)
    IER |= M_INT7; // CPU 인터럽트 7 활성화
    EINT; // 글로벌 인터럽트 활성화

    // 초기 데이터 전송
    Usb0Regs.USB0TXFIFO1 = data[data_index++]; // 첫 데이터 쓰기
    Usb0Regs.USB0TXCSRL1.bit.TXRDY = 1; // 전송 시작

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

설명:

  • 기능: USB 디바이스 모드로 설정, 인터럽트를 사용하여 순차적으로 데이터 배열 전송
  • 설정: USB0DM/DP 핀 설정, 디바이스 모드, 64바이트 패킷, 엔드포인트 1 인터럽트 활성화
  • GPIO: GPIO34(USB0DM), GPIO35(USB0DP), GPIO31(LED)
  • 출력: USB 연결 시 순차 데이터 전송, LED ON

5.3 예제 3: USB 벌크 전송 (수신 및 전송)

// File: usb_bulk.c
// Description: TMS320F28377D USB 벌크 전송 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

volatile Uint16 received_data;

void main(void) {
    // 시스템 초기화
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 2; // GPIO34: USB0DM
    GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 2; // GPIO35: USB0DP
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31: LED
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // USB 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR13.bit.USB_A = 1;
    EDIS;

    // USB 디바이스 모드 설정
    EALLOW;
    Usb0Regs.USB0CTRL.bit.USBMODE = 0; // 디바이스 모드
    Usb0Regs.USB0CTRL.bit.ENABLE = 1; // USB 모듈 활성화
    Usb0Regs.USB0FADDR.bit.FADDR = 0; // 기본 주소
    EDIS;

    // 엔드포인트 1 설정 (IN 전송)
    Usb0Regs.USB0TXMAXP1.bit.MAXLOAD = 64; // 최대 패킷 크기 64바이트
    Usb0Regs.USB0TXCSRL1.bit.TXRDY = 0; // 전송 준비 초기화

    // 엔드포인트 2 설정 (OUT 수신)
    Usb0Regs.USB0RXMAXP2.bit.MAXLOAD = 64; // 최대 패킷 크기 64바이트
    Usb0Regs.USB0RXCSRL2.bit.RXRDY = 0; // 수신 준비 초기화

    for(;;) {
        // 데이터 수신
        if(Usb0Regs.USB0RXCSRL2.bit.RXRDY) {
            received_data = Usb0Regs.USB0RXFIFO2; // 데이터 읽기
            Usb0Regs.USB0RXCSRL2.bit.RXRDY = 0; // 수신 플래그 클리어

            // 수신 데이터 에코 전송
            Usb0Regs.USB0TXFIFO1 = received_data; // 데이터 쓰기
            Usb0Regs.USB0TXCSRL1.bit.TXRDY = 1; // 전송 시작
        }
    }
}

설명:

  • 기능: USB 디바이스 모드로 설정, 엔드포인트 2로 데이터 수신 후 엔드포인트 1로 에코 전송
  • 설정: USB0DM/DP 핀 설정, 디바이스 모드, 64바이트 패킷, 벌크 전송
  • GPIO: GPIO34(USB0DM), GPIO35(USB0DP), GPIO31(LED)
  • 출력: USB로 수신된 데이터 에코 전송, LED ON

5.4 예제 4: I2C 마스터 모드 (EEPROM 쓰기/읽기)

// File: i2c_eeprom.c
// Description: TMS320F28377D I2C 마스터 모드 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void) {
    // 시스템 초기화
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO32 = 1; // GPIO32: I2C SDA
    GpioCtrlRegs.GPAMUX2.bit.GPIO33 = 1; // GPIO33: I2C SCL
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31: LED
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // I2C 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR10.bit.I2C_A = 1;
    EDIS;

    // I2C 설정 (Bitfield 사용)
    I2caRegs.I2CPSC.all = 9; // 프리스케일러: 200MHz/(9+1)=20MHz
    I2caRegs.I2CCLKL = 50; // SCL 주기 Low (400kHz)
    I2caRegs.I2CCLKH = 50; // SCL 주기 High
    I2caRegs.I2CMDR.bit.MST = 1; // 마스터 모드
    I2caRegs.I2CMDR.bit.FREE = 1; // Free run
    I2caRegs.I2COAR.bit.OAR = 0x50; // 슬레이브 주소 (예: EEPROM)

    // 데이터 쓰기
    I2caRegs.I2CCNT = 2; // 2바이트 전송
    I2caRegs.I2CDXR.bit.DATA = 0x00; // 주소
    I2caRegs.I2CMDR.bit.STT = 1; // 시작 조건
    while(I2caRegs.I2CSTR.bit.BB); // 버스 비지 대기
    I2caRegs.I2CDXR.bit.DATA = 0xAA; // 데이터 쓰기
    I2caRegs.I2CMDR.bit.STP = 1; // 정지 조건

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

설명:

  • 기능: I2C 마스터 모드로 EEPROM에 데이터 쓰기
  • 설정: 400kHz SCL, 슬레이브 주소 0x50, 2바이트 전송
  • GPIO: GPIO32(SDA), GPIO33(SCL), GPIO31(LED)
  • 출력: I2C 데이터 전송, LED ON

5.5 예제 5: McBSP SPI 모드 (데이터 전송)

// File: mcbsp_spi.c
// Description: TMS320F28377D McBSP SPI 모드 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void) {
    // 시스템 초기화
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 3; // GPIO20: McBSP MDXA
    GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 3; // GPIO21: McBSP MDRA
    GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 3; // GPIO22: McBSP MCLKXA
    GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 3; // GPIO23: McBSP MFSXA
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31: LED
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // McBSP 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR10.bit.MCBSP_A = 1;
    EDIS;

    // McBSP 설정 (SPI 마스터 모드, Bitfield 사용)
    McbspaRegs.SPCR2.bit.GRST = 0; // 리셋
    McbspaRegs.SPCR1.bit.RRST = 0;
    McbspaRegs.SPCR2.bit.FRST = 0;
    McbspaRegs.SPCR2.bit.CLKSTP = 2; // SPI 클럭 모드
    McbspaRegs.PCR.bit.CLKXM = 1; // 클럭 마스터
    McbspaRegs.PCR.bit.FSXM = 1; // 프레임 동기 마스터
    McbspaRegs.RCR1.bit.RWDLEN1 = 5; // 16비트 데이터
    McbspaRegs.XCR1.bit.XWDLEN1 = 5; // 16비트 데이터
    McbspaRegs.SRGR1.bit.CLKGDV = 19; // 클럭 분주 (200MHz/(19+1)=10MHz)
    McbspaRegs.SPCR2.bit.GRST = 1; // 리셋 해제
    McbspaRegs.SPCR1.bit.RRST = 1;
    McbspaRegs.SPCR2.bit.FRST = 1;

    // 데이터 전송
    McbspaRegs.DXR1.all = 0x55AA; // 테스트 데이터
    while(!McbspaRegs.SPCR2.bit.XRDY); // 전송 준비 대기
    McbspaRegs.SPCR2.bit.XSYNCERR = 0; // 동기화 에러 클리어

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

설명:

  • 기능: McBSP를 SPI 마스터 모드로 설정, 16비트 테스트 데이터 전송
  • 설정: 10MHz 클럭, 16비트 데이터, SPI 모드
  • GPIO: GPIO20(MDXA), GPIO21(MDRA), GPIO22(MCLKXA), GPIO23(MFSXA), GPIO31(LED)
  • 출력: SPI 데이터 전송, LED ON

5.6 예제 6: uPP 8비트 데이터 전송

// File: upp_8bit.c
// Description: TMS320F28377D uPP 8비트 데이터 전송 예제 (Bitfield 구조)
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28377D

#include "F28x_Project.h"

void main(void) {
    // 시스템 초기화
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    // GPIO 설정
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 2; // GPIO0: uPP DATA0
    GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 2; // GPIO1: uPP CLK
    GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 2; // GPIO2: uPP START
    GpioCtrlRegs.GPBDIR.bit.GPIO31 = 1; // GPIO31: LED
    GpioDataRegs.GPBSET.bit.GPIO31 = 1; // LED 켜기
    EDIS;

    // uPP 클럭 활성화
    EALLOW;
    CpuSysRegs.PCLKCR13.bit.UPP_A = 1;
    EDIS;

    // uPP 설정 (Bitfield 사용)
    UppARegs.UPPCTL.bit.EN = 0; // 비활성화
    UppARegs.UPPCTL.bit.MODE = 0; // 단일 채널
    UppARegs.UPPCHCTL.bit.DATARATE = 0; // 1x 클럭 속도
    UppARegs.UPPDMACTL.bit.DMAEN = 0; // DMA 비활성화
    UppARegs.UPPCTL.bit.EN = 1; // uPP 활성화

    // 데이터 전송
    UppARegs.UPPTXDAT = 0xAA; // 8비트 테스트 데이터
    while(!UppARegs.UPPINTSTS.bit.TXEMPTY); // 전송 완료 대기

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

설명:

  • 기능: uPP를 단일 채널 8비트 모드로 설정, 테스트 데이터 전송
  • 설정: 8비트 데이터, 단일 채널, DMA 비활성화
  • GPIO: GPIO0(DATA0), GPIO1(CLK), GPIO2(START), GPIO31(LED)
  • 출력: uPP 데이터 전송, LED ON

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 하드웨어 준비

  • USB: USB0DM/DP 핀에 USB 케이블 연결
  • I2C: SDA/SCL 핀에 EEPROM 또는 센서 연결
  • McBSP: SPI 호환 장치 연결 (예: 오디오 코덱)
  • uPP: 고속 병렬 장치 (예: FPGA) 연결
  • LED: GPIO31에 LED 연결 (정상 동작 확인용)

6.4 디버깅

  • CCS Expressions 창: 레지스터 상태 확인 (예: I2caRegs.I2CSTR, Usb0Regs.USB0TXCSRL1)
  • 인터럽트 플래그: PIEACK, 모듈별 상태 레지스터 점검
  • 오실로스코프: 클럭 및 데이터 신호 확인
  • 에러 확인: NACK, 동기화 에러, FIFO 상태 점검

7. 추가 팁

  • 캘리브레이션: USB 및 uPP 사용 시 Device_cal() 호출로 클럭 보정
  • 노이즈 감소: I2C 및 McBSP 라인에 풀업 저항 또는 필터 사용
  • C2000Ware 참고: C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\cpu1
  • 문제 해결:
    •   USB 연결 실패: USB0CTRL 설정 및 케이블 점검
    •   I2C NACK 에러: 슬레이브 주소 및 풀업 저항 확인
    •   McBSP 동기화 실패: 클럭 및 프레임 설정 점검
    •   uPP 전송 실패: UPPINTSTS 확인
  • TI 리소스: TI E2E 포럼, C2000Ware 예제

8. 결론

이 문서는 TMS320F28377D의 USB, I2C, McBSP, uPP 모듈 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여 다양한 통신 애플리케이션에 쉽게 적용할 수 있도록 구성했습니다. USB 디바이스 모드, 인터럽트 기반 전송, 벌크 전송, I2C EEPROM 통신, McBSP SPI 모드, uPP 데이터 전송 예제를 통해 초보자부터 숙련된 개발자까지 활용 가능합니다.

키워드: TMS320F28377D, USB, I2C, McBSP, uPP, C2000, 마이크로컨트롤러, Code Composer Studio, Bitfield, 통신 인터페이스, 데이터 전송, SPI, 병렬 통신

반응형