본문 바로가기
MCU/C2000

[TMS320F28335] XINTF 사용법 : Bitfield 구조 활용 예제 코드

by linuxgo 2025. 8. 19.
반응형

1. TMS320F28335 XINTF 모듈 개요

TI의 TMS320F28335는 C2000 Delfino 시리즈의 32비트 마이크로컨트롤러로, 외부 메모리 인터페이스(XINTF)를 통해 외부 메모리, FPGA, ADC, DAC 또는 기타 주변 장치를 연결하는 데 적합합니다. XINTF(External Interface)는 고속 병렬 데이터 전송을 지원하며, 외부 메모리 맵된 장치와의 인터페이스를 효율적으로 처리합니다. 이 문서에서는 TMS320F28335 XINTF 모듈의 설정 방법, Bitfield 구조를 활용한 레지스터 설정, 그리고 실용적인 예제 코드를 제공하여 초보자와 숙련된 개발자 모두 쉽게 활용할 수 있도록 돕습니다.

주요 사양

  • 클럭 소스: 시스템 클럭(SYSCLK, 최대 150MHz)
  • 데이터 버스: 16비트 또는 32비트 데이터 전송
  • 주소 버스: 최대 20비트 주소 라인(1MB 주소 공간)
  • 영역(Zone): 3개의 독립적인 메모리 영역(XINTF Zone 0, Zone 6, Zone 7)
    • Zone 0: Low-latency, 작은 용량 메모리 연결
    • Zone 6, Zone 7: High-latency, 대용량 메모리 연결
  • 타이밍 제어:
    • LEAD, ACTIVE, TRAIL 타이밍 설정
    • 읽기/쓰기 동작별 타이밍 조정 가능
  • 핀 기능:
    • 데이터 핀: XD[0:15] (16비트)
    • 주소 핀: XA[0:19] (20비트)
    • 제어 신호: XWE, XRD, XZCS0, XZCS6, XZCS7, XREADY 등
  • 인터럽트: XINTF 인터럽트(XINT13) 지원
  • 응용 분야: 외부 SRAM, Flash, FPGA, 병렬 ADC, 병렬 DAC 등

2. XINTF Bitfield 설정 상세

TMS320F28335의 XINTF 레지스터는 Bitfield 구조로 정의되어 있으며, F2833x_xintf.h 헤더 파일을 통해 접근합니다. 주요 레지스터는 다음과 같습니다:

2.1 XTIMING (타이밍 레지스터, XTIMING0, XTIMING6, XTIMING7)

  • bit.XWRLEAD: 쓰기 동작 LEAD 시간 (0~3 SYSCLK 사이클)
  • bit.XWRACTIVE: 쓰기 동작 ACTIVE 시간 (0~7 SYSCLK 사이클)
  • bit.XWRTRAIL: 쓰기 동작 TRAIL 시간 (0~3 SYSCLK 사이클)
  • bit.XRDLEAD: 읽기 동작 LEAD 시간 (0~3 SYSCLK 사이클)
  • bit.XRDACTIVE: 읽기 동작 ACTIVE 시간 (0~7 SYSCLK 사이클)
  • bit.XRDTRAIL: 읽기 동작 TRAIL 시간 (0~3 SYSCLK 사이클)
  • bit.USEREADY: XREADY 신호 사용 여부 (0: 비활성화, 1: 활성화)
  • bit.XSIZE: 데이터 버스 크기 (0: 16비트, 1: 32비트)

2.2 XINTCNF2 (인터페이스 제어 레지스터)

  • bit.CLKMODE: XINTF 클럭 모드 (0: SYSCLK, 1: 분주된 클럭)
  • bit.CLKDIV: 클럭 분주비 (0: 1/1, 1: 1/2)
  • bit.WRITEENA: 쓰기 동작 활성화
  • bit.XBCSN: 버스 선택 신호 설정

2.3 XBANK (뱅크 스위칭 제어 레지스터)

  • bit.BANK: 뱅크 선택 (Zone 6 또는 Zone 7)
  • bit.BCYC: 뱅크 사이클 시간 (0~7 SYSCLK 사이클)

2.4 XINT (인터럽트 제어 레지스터)

  • bit.ENABLE: 인터럽트 활성화 (1: 활성화)
  • bit.POLARITY: 인터럽트 극성 (0: Low, 1: High)
  • bit.XINT13: XINTF 인터럽트 설정

3. XINTF 설정 절차

  1. 시스템 초기화:
    •   InitSysCtrl()로 시스템 클럭과 PLL 초기화
    •   인터럽트 비활성화 및 PIE 초기화 (DINT, InitPieCtrl, InitPieVectTable)
  2. XINTF 클럭 활성화:
    •   CpuSysRegs.PCLKCR0.bit.XINTF = 1로 XINTF 모듈 클럭 활성화
    •   보호된 레지스터 접근을 위해 EALLOW와 EDIS 사용
  3. GPIO 설정:
    •   XINTF 관련 GPIO 핀(XD[0:15], XA[0:19], XWE, XRD 등)을 XINTF 기능으로 설정
    •   GpioCtrlRegs.GPAMUXx, GpioCtrlRegs.GPBMUXx로 멀티플렉서 설정
  4. 타이밍 설정:
    •   XTIMINGx 레지스터로 읽기/쓰기 타이밍 설정 (LEAD, ACTIVE, TRAIL)
    •   외부 장치 스펙에 맞게 타이밍 조정
  5. 영역 설정:
    •   XINTCNF2로 Zone 0, Zone 6, Zone 7 설정
    •   XBANK로 뱅크 스위칭 설정 (필요 시)
  6. 인터럽트 설정 (필요 시):
    •   XINT.bit.ENABLE로 인터럽트 활성화
    •   인터럽트 벡터 테이블에 ISR 연결
  7. 모듈 실행:
    •   외부 장치와 데이터 읽기/쓰기 수행
    •   XREADY 신호로 동기화 (필요 시)

4. XINTF 설정 고려사항

  • 클럭 설정: SYSCLK(150MHz)에서 XCLKOUT 분주 설정
  • 타이밍: 외부 장치의 데이터시트에 따라 LEAD/ACTIVE/TRAIL 설정
  • 데이터 버스: 16비트 또는 32비트 모드 선택
  • 메모리 맵: Zone 0(0x0020000x003FFF), Zone 6(0x1000000x17FFFF), Zone 7(0x180000~0x1FFFFF)
  • 인터럽트: XINT13을 통한 이벤트 처리
  • GPIO 충돌: 다른 기능과 핀 충돌 주의 (예: ePWM, GPIO)

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

아래는 TMS320F28335 XINTF 모듈을 Bitfield 구조로 설정한 6개의 예제 코드입니다. GPIO와 XINTF 설정은 별도의 함수로 분리되었으며, 각 라인에 상세한 주석이 추가되었습니다. Code Composer Studio(CCS)와 C2000Ware 환경에서 실행 가능합니다.

5.1 예제 1: 외부 SRAM 읽기/쓰기

// File: xintf_sram_access.c
// Description: TMS320F28335 XINTF를 사용한 외부 SRAM 읽기/쓰기 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335

#include "F28x_Project.h"

// XINTF Zone 7 메모리 주소 정의
#define XINTF_ZONE7_BASE 0x180000 // Zone 7 시작 주소
volatile Uint16 *xintf_addr = (volatile Uint16 *)XINTF_ZONE7_BASE; // 16비트 메모리 포인터

// GPIO 설정 함수
void ConfigureGPIO(void) {
    EALLOW; // 보호된 레지스터 접근 허용
    GpioCtrlRegs.GPAMUX2.all = 0xFFFFFFFF; // XA[0:15], XD[0:15]를 XINTF로 설정
    GpioCtrlRegs.GPBMUX1.all = 0xFFFFFFFF; // XA[16:19], XWE, XRD, XZCS7 등 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // GPIO34를 출력으로 설정 (LED용)
    GpioDataRegs.GPBSET.bit.GPIO34 = 1; // GPIO34를 High로 설정하여 LED 켬
    EDIS; // 보호된 레지스터 접근 비허용
}

// XINTF 설정 함수
void ConfigureXINTF(void) {
    EALLOW; // 보호된 레지스터 접근 허용
    CpuSysRegs.PCLKCR0.bit.XINTF = 1; // XINTF 모듈 클럭 활성화
    EDIS; // 보호된 레지스터 접근 비허용

    XintfRegs.XTIMING7.bit.XWRLEAD = 1; // 쓰기 LEAD 시간: 1 SYSCLK
    XintfRegs.XTIMING7.bit.XWRACTIVE = 2; // 쓰기 ACTIVE 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.XWRTRAIL = 1; // 쓰기 TRAIL 시간: 1 SYSCLK
    XintfRegs.XTIMING7.bit.XRDLEAD = 1; // 읽기 LEAD 시간: 1 SYSCLK
    XintfRegs.XTIMING7.bit.XRDACTIVE = 2; // 읽기 ACTIVE 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.XRDTRAIL = 1; // 읽기 TRAIL 시간: 1 SYSCLK
    XintfRegs.XTIMING7.bit.USEREADY = 0; // XREADY 신호 비활성화
    XintfRegs.XTIMING7.bit.XSIZE = 0; // 16비트 데이터 버스

    XintfRegs.XINTCNF2.bit.CLKMODE = 0; // XINTF 클럭: SYSCLK (150MHz)
    XintfRegs.XINTCNF2.bit.CLKDIV = 0; // 클럭 분주비 1/1
    XintfRegs.XINTCNF2.bit.WRITEENA = 1; // 쓰기 동작 활성화
}

void main(void) {
    InitSysCtrl(); // 시스템 클럭(150MHz)과 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 컨트롤러 초기화
    IER = 0x0000; // CPU 인터럽트 레지스터 비활성화
    IFR = 0x0000; // 인터럽트 플래그 레지스터 클리어
    InitPieVectTable(); // PIE 인터럽트 벡터 테이블 초기화

    ConfigureGPIO(); // GPIO 설정 함수 호출
    ConfigureXINTF(); // XINTF 설정 함수 호출

    // SRAM 읽기/쓰기 테스트
    *xintf_addr = 0x1234; // Zone 7 주소에 데이터 쓰기
    Uint16 read_data = *xintf_addr; // Zone 7 주소에서 데이터 읽기

    // 읽은 데이터 확인 (디버깅용)
    if (read_data == 0x1234) {
        GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1; // 데이터 일치 시 LED 끔
    }

    for(;;); // 무한 루프: XINTF 동작 지속
}

설명:

  • 기능: XINTF Zone 7을 통해 외부 SRAM에 데이터 쓰기 및 읽기
  • 설정: 16비트 데이터 버스, 타이밍(LEAD=1, ACTIVE=2, TRAIL=1), Zone 7 사용
  • GPIO: XA[0:19], XD[0:15], XWE, XRD, XZCS7, GPIO34(LED)
  • 출력: Zone 7에 데이터 0x1234 쓰기 및 읽기, 읽기 성공 시 LED OFF

5.2 예제 2: XINTF 인터럽트 기반 데이터 처리

// File: xintf_interrupt.c
// Description: TMS320F28335 XINTF 인터럽트를 사용한 데이터 처리 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335

#include "F28x_Project.h"

// XINTF Zone 7 메모리 주소 정의
#define XINTF_ZONE7_BASE 0x180000 // Zone 7 시작 주소
volatile Uint16 *xintf_addr = (volatile Uint16 *)XINTF_ZONE7_BASE; // 16비트 메모리 포인터

// 인터럽트 서비스 루틴: XINT13 인터럽트 처리
__interrupt void xint13_isr(void)
{
    Uint16 read_data = *xintf_addr; // Zone 7에서 데이터 읽기
    *xintf_addr = read_data + 1; // 읽은 데이터에 1을 더해 다시 쓰기

    PieCtrlRegs.PIEACK.all = PIEACK_GROUP12; // PIE 그룹 12 인터럽트 ACK
}

// GPIO 설정 함수
void ConfigureGPIO(void) {
    EALLOW; // 보호된 레지스터 접근 허용
    GpioCtrlRegs.GPAMUX2.all = 0xFFFFFFFF; // XA[0:15], XD[0:15]를 XINTF로 설정
    GpioCtrlRegs.GPBMUX1.all = 0xFFFFFFFF; // XA[16:19], XWE, XRD, XZCS7 등 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // GPIO34를 출력으로 설정 (LED용)
    GpioDataRegs.GPBSET.bit.GPIO34 = 1; // GPIO34를 High로 설정하여 LED 켬
    GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0; // GPIO12를 XINT13 입력으로 설정
    GpioCtrlRegs.GPADIR.bit.GPIO12 = 0; // GPIO12를 입력 방향으로 설정
    EDIS; // 보호된 레지스터 접근 비허용
}

// XINTF 설정 함수
void ConfigureXINTF(void) {
    EALLOW; // 보호된 레지스터 접근 허용
    CpuSysRegs.PCLKCR0.bit.XINTF = 1; // XINTF 모듈 클럭 활성화
    EDIS; // 보호된 레지스터 접근 비허용

    XintfRegs.XTIMING7.bit.XWRLEAD = 1; // 쓰기 LEAD 시간: 1 SYSCLK
    XintfRegs.XTIMING7.bit.XWRACTIVE = 2; // 쓰기 ACTIVE 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.XWRTRAIL = 1; // 쓰기 TRAIL 시간: 1 SYSCLK
    XintfRegs.XTIMING7.bit.XRDLEAD = 1; // 읽기 LEAD 시간: 1 SYSCLK
    XintfRegs.XTIMING7.bit.XRDACTIVE = 2; // 읽기 ACTIVE 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.XRDTRAIL = 1; // 읽기 TRAIL 시간: 1 SYSCLK
    XintfRegs.XTIMING7.bit.USEREADY = 0; // XREADY 신호 비활성화
    XintfRegs.XTIMING7.bit.XSIZE = 0; // 16비트 데이터 버스

    XintfRegs.XINTCNF2.bit.CLKMODE = 0; // XINTF 클럭: SYSCLK (150MHz)
    XintfRegs.XINTCNF2.bit.CLKDIV = 0; // 클럭 분주비 1/1
    XintfRegs.XINTCNF2.bit.WRITEENA = 1; // 쓰기 동작 활성화

    XintfRegs.XINT.bit.ENABLE = 1; // XINT13 인터럽트 활성화
    XintfRegs.XINT.bit.POLARITY = 0; // 인터럽트 극성: Low
}

void main(void) {
    InitSysCtrl(); // 시스템 클럭(150MHz)과 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 컨트롤러 초기화
    IER = 0x0000; // CPU 인터럽트 레지스터 비활성화
    IFR = 0x0000; // 인터럽트 플래그 레지스터 클리어
    InitPieVectTable(); // PIE 인터럽트 벡터 테이블 초기화

    EALLOW; // 보호된 레지스터 접근 허용
    PieVectTable.XINT13_INT = &xint13_isr; // XINT13 인터럽트 벡터를 ISR 함수에 연결
    EDIS; // 보호된 레지스터 접근 비허용

    ConfigureGPIO(); // GPIO 설정 함수 호출
    ConfigureXINTF(); // XINTF 설정 함수 호출

    PieCtrlRegs.PIEIER12.bit.INTx1 = 1; // PIE 그룹 12에서 XINT13 인터럽트 활성화
    IER |= M_INT12; // CPU 인터럽트 그룹 12 활성화

    EINT; // 글로벌 인터럽트 활성화
    ERTM; // 실시간 모드 활성화: 디버깅 시 인터럽트 실시간 처리

    for(;;); // 무한 루프: XINTF 인터럽트 동작 지속
}

설명:

  • 기능: XINTF Zone 7을 통해 외부 장치에서 데이터를 읽고, XINT13 인터럽트를 통해 데이터 처리(데이터에 1을 더해 쓰기)
  • 설정: 16비트 데이터 버스, 타이밍(LEAD=1, ACTIVE=2, TRAIL=1), XINT13 인터럽트 활성화
  • GPIO: XA[0:19], XD[0:15], XWE, XRD, XZCS7, GPIO12(XINT13), GPIO34(LED)
  • 출력: XINT13 인터럽트 발생 시 데이터 읽기/쓰기, LED ON

5.3 예제 3: XINTF Zone 6을 사용한 다중 데이터 전송

// File: xintf_zone6_multi.c
// Description: TMS320F Face ID: 3acb3eab-e3b1-4f3f-8d83-e9ca5a4f982f
// Description: TMS320F28335 XINTF Zone 6을 사용한 다중 데이터 전송 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335

#include "F28x_Project.h"

// XINTF Zone 6 메모리 주소 정의
#define XINTF_ZONE6_BASE 0x100000 // Zone 6 시작 주소
volatile Uint16 *xintf_addr = (volatile Uint16 *)XINTF_ZONE6_BASE; // 16비트 메모리 포인터

// GPIO 설정 함수
void ConfigureGPIO(void) {
    EALLOW; // 보호된 레지스터 접근 허용
    GpioCtrlRegs.GPAMUX2.all = 0xFFFFFFFF; // XA[0:15], XD[0:15]를 XINTF로 설정
    GpioCtrlRegs.GPBMUX1.all = 0xFFFFFFFF; // XA[16:19], XWE, XRD, XZCS6 등 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // GPIO34를 출력으로 설정 (LED용)
    GpioDataRegs.GPBSET.bit.GPIO34 = 1; // GPIO34를 High로 설정하여 LED 켬
    EDIS; // 보호된 레지스터 접근 비허용
}

// XINTF 설정 함수
void ConfigureXINTF(void) {
    EALLOW; // 보호된 레지스터 접근 허용
    CpuSysRegs.PCLKCR0.bit.XINTF = 1; // XINTF 모듈 클럭 활성화
    EDIS; // 보호된 레지스터 접근 비허용

    XintfRegs.XTIMING6.bit.XWRLEAD = 1; // 쓰기 LEAD 시간: 1 SYSCLK
    XintfRegs.XTIMING6.bit.XWRACTIVE = 3; // 쓰기 ACTIVE 시간: 3 SYSCLK
    XintfRegs.XTIMING6.bit.XWRTRAIL = 1; // 쓰기 TRAIL 시간: 1 SYSCLK
    XintfRegs.XTIMING6.bit.XRDLEAD = 1; // 읽기 LEAD 시간: 1 SYSCLK
    XintfRegs.XTIMING6.bit.XRDACTIVE = 3; // 읽기 ACTIVE 시간: 3 SYSCLK
    XintfRegs.XTIMING6.bit.XRDTRAIL = 1; // 읽기 TRAIL 시간: 1 SYSCLK
    XintfRegs.XTIMING6.bit.USEREADY = 0; // XREADY 신호 비활성화
    XintfRegs.XTIMING6.bit.XSIZE = 0; // 16비트 데이터 버스

    XintfRegs.XINTCNF2.bit.CLKMODE = 0; // XINTF 클럭: SYSCLK (150MHz)
    XintfRegs.XINTCNF2.bit.CLKDIV = 0; // 클럭 분주비 1/1
    XintfRegs.XINTCNF2.bit.WRITEENA = 1; // 쓰기 동작 활성화
}

void main(void) {
    InitSysCtrl(); // 시스템 클럭(150MHz)과 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 컨트롤러 초기화
    IER = 0x0000; // CPU 인터럽트 레지스터 비활성화
    IFR = 0x0000; // 인터럽트 플래그 레지스터 클리어
    InitPieVectTable(); // PIE 인터럽트 벡터 테이블 초기화

    ConfigureGPIO(); // GPIO 설정 함수 호출
    ConfigureXINTF(); // XINTF 설정 함수 호출

    // 다중 데이터 전송 테스트
    Uint16 data_array[5] = {0x1111, 0x2222, 0x3333, 0x4444, 0x5555};
    Uint16 read_array[5] = {0};

    // Zone 6에 데이터 쓰기
    for (int i = 0; i < 5; i++) {
        *(xintf_addr + i) = data_array[i];
    }

    // Zone 6에서 데이터 읽기
    for (int i = 0; i < 5; i++) {
        read_array[i] = *(xintf_addr + i);
    }

    // 데이터 일치 확인 (디버깅용)
    int match = 1;
    for (int i = 0; i < 5; i++) {
        if (read_array[i] != data_array[i]) {
            match = 0;
            break;
        }
    }

    if (match) {
        GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1; // 데이터 일치 시 LED 끔
    }

    for(;;); // 무한 루프: XINTF 동작 지속
}

설명:

  • 기능: XINTF Zone 6을 통해 다중 데이터(5개 16비트 데이터)를 외부 장치에 쓰고 읽기
  • 설정: 16비트 데이터 버스, 타이밍(LEAD=1, ACTIVE=3, TRAIL=1), Zone 6 사용
  • GPIO: XA[0:19], XD[0:15], XWE, XRD, XZCS6, GPIO34(LED)
  • 출력: Zone 6에 데이터 배열 쓰기 및 읽기, 데이터 일치 시 LED OFF

5.4 예제 4: XINTF XREADY 신호 사용

// File: xintf_ready_signal.c
// Description: TMS320F28335 XINTF XREADY 신호를 사용한 데이터 전송 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335

#include "F28x_Project.h"

// XINTF Zone 7 메모리 주소 정의
#define XINTF_ZONE7_BASE 0x180000 // Zone 7 시작 주소
volatile Uint16 *xintf_addr = (volatile Uint16 *)XINTF_ZONE7_BASE; // 16비트 메모리 포인터

// GPIO 설정 함수
void ConfigureGPIO(void) {
    EALLOW; // 보호된 레지스터 접근 허용
    GpioCtrlRegs.GPAMUX2.all = 0xFFFFFFFF; // XA[0:15], XD[0:15]를 XINTF로 설정
    GpioCtrlRegs.GPBMUX1.all = 0xFFFFFFFF; // XA[16:19], XWE, XRD, XZCS7 등 설정
    GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 2; // GPIO56을 XREADY로 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // GPIO34를 출력으로 설정 (LED용)
    GpioDataRegs.GPBSET.bit.GPIO34 = 1; // GPIO34를 High로 설정하여 LED 켬
    EDIS; // 보호된 레지스터 접근 비허용
}

// XINTF 설정 함수
void ConfigureXINTF(void) {
    EALLOW; // 보호된 레지스터 접근 허용
    CpuSysRegs.PCLKCR0.bit.XINTF = 1; // XINTF 모듈 클럭 활성화
    EDIS; // 보호된 레지스터 접근 비허용

    XintfRegs.XTIMING7.bit.XWRLEAD = 2; // 쓰기 LEAD 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.XWRACTIVE = 4; // 쓰기 ACTIVE 시간: 4 SYSCLK
    XintfRegs.XTIMING7.bit.XWRTRAIL = 2; // 쓰기 TRAIL 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.XRDLEAD = 2; // 읽기 LEAD 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.XRDACTIVE = 4; // 읽기 ACTIVE 시간: 4 SYSCLK
    XintfRegs.XTIMING7.bit.XRDTRAIL = 2; // 읽기 TRAIL 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.USEREADY = 1; // XREADY 신호 활성화
    XintfRegs.XTIMING7.bit.XSIZE = 0; // 16비트 데이터 버스

    XintfRegs.XINTCNF2.bit.CLKMODE = 0; // XINTF 클럭: SYSCLK (150MHz)
    XintfRegs.XINTCNF2.bit.CLKDIV = 0; // 클럭 분주비 1/1
    XintfRegs.XINTCNF2.bit.WRITEENA = 1; // 쓰기 동작 활성화
}

void main(void) {
    InitSysCtrl(); // 시스템 클럭(150MHz)과 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 컨트롤러 초기화
    IER = 0x0000; // CPU 인터럽트 레지스터 비활성화
    IFR = 0x0000; // 인터럽트 플래그 레지스터 클리어
    InitPieVectTable(); // PIE 인터럽트 벡터 테이블 초기화

    ConfigureGPIO(); // GPIO 설정 함수 호출
    ConfigureXINTF(); // XINTF 설정 함수 호출

    // XREADY 신호를 사용한 데이터 전송 테스트
    *xintf_addr = 0xABCD; // Zone 7 주소에 데이터 쓰기
    Uint16 read_data = *xintf_addr; // Zone 7 주소에서 데이터 읽기

    // 읽은 데이터 확인 (디버깅용)
    if (read_data == 0xABCD) {
        GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1; // 데이터 일치 시 LED 끔
    }

    for(;;); // 무한 루프: XINTF 동작 지속
}

설명:

  • 기능: XINTF Zone 7을 통해 XREADY 신호를 사용하여 외부 장치와 데이터 읽기/쓰기
  • 설정: 16비트 데이터 버스, 타이밍(LEAD=2, ACTIVE=4, TRAIL=2), XREADY 활성화
  • GPIO: XA[0:19], XD[0:15], XWE, XRD, XZCS7, GPIO56(XREADY), GPIO34(LED)
  • 출력: Zone 7에 데이터 0xABCD 쓰기 및 읽기, 읽기 성공 시 LED OFF

5.5 예제 5: 병렬 ADC 인터페이스 (AD7606 예제)

// File: xintf_adc_ad7606.c
// Description: TMS320F28335 XINTF를 사용한 병렬 ADC(AD7606) 인터페이스 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335

#include "F28x_Project.h"

// XINTF Zone 7 메모리 주소 정의 (AD7606 데이터 레지스터)
#define XINTF_ZONE7_BASE 0x180000 // Zone 7 시작 주소
volatile Uint16 *adc_data = (volatile Uint16 *)XINTF_ZONE7_BASE; // 16비트 ADC 데이터 포인터

// GPIO 설정 함수
void ConfigureGPIO(void) {
    EALLOW; // 보호된 레지스터 접근 허용
    GpioCtrlRegs.GPAMUX2.all = 0xFFFFFFFF; // XA[0:15], XD[0:15]를 XINTF로 설정
    GpioCtrlRegs.GPBMUX1.all = 0xFFFFFFFF; // XA[16:19], XWE, XRD, XZCS7 등 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // GPIO34를 출력으로 설정 (LED용)
    GpioDataRegs.GPBSET.bit.GPIO34 = 1; // GPIO34를 High로 설정하여 LED 켬
    GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0; // GPIO12를 ADC CONVST 신호로 설정
    GpioCtrlRegs.GPADIR.bit.GPIO12 = 1; // GPIO12를 출력 방향으로 설정
    GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 2; // GPIO56을 XREADY로 설정
    EDIS; // 보호된 레지스터 접근 비허용
}

// XINTF 설정 함수
void ConfigureXINTF(void) {
    EALLOW; // 보호된 레지스터 접근 허용
    CpuSysRegs.PCLKCR0.bit.XINTF = 1; // XINTF 모듈 클럭 활성화
    EDIS; // 보호된 레지스터 접근 비허용

    XintfRegs.XTIMING7.bit.XWRLEAD = 2; // 쓰기 LEAD 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.XWRACTIVE = 4; // 쓰기 ACTIVE 시간: 4 SYSCLK
    XintfRegs.XTIMING7.bit.XWRTRAIL = 2; // 쓰기 TRAIL 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.XRDLEAD = 2; // 읽기 LEAD 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.XRDACTIVE = 4; // 읽기 ACTIVE 시간: 4 SYSCLK
    XintfRegs.XTIMING7.bit.XRDTRAIL = 2; // 읽기 TRAIL 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.USEREADY = 1; // XREADY 신호 활성화 (AD7606 BUSY 신호)
    XintfRegs.XTIMING7.bit.XSIZE = 0; // 16비트 데이터 버스

    XintfRegs.XINTCNF2.bit.CLKMODE = 0; // XINTF 클럭: SYSCLK (150MHz)
    XintfRegs.XINTCNF2.bit.CLKDIV = 0; // 클럭 분주비 1/1
    XintfRegs.XINTCNF2.bit.WRITEENA = 1; // 쓰기 동작 활성화
}

// ADC 변환 시작 함수
void StartADCConversion(void) {
    GpioDataRegs.GPASET.bit.GPIO12 = 1; // CONVST High
    DELAY_US(1); // 1us 대기 (AD7606 CONVST 펄스 폭)
    GpioDataRegs.GPACLEAR.bit.GPIO12 = 0; // CONVST Low
}

void main(void) {
    InitSysCtrl(); // 시스템 클럭(150MHz)과 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 컨트롤러 초기화
    IER = 0x0000; // CPU 인터럽트 레지스터 비활성화
    IFR = 0x0000; // 인터럽트 플래그 레지스터 클리어
    InitPieVectTable(); // PIE 인터럽트 벡터 테이블 초기화

    ConfigureGPIO(); // GPIO 설정 함수 호출
    ConfigureXINTF(); // XINTF 설정 함수 호출

    // ADC 데이터 읽기 테스트
    Uint16 adc_values[8] = {0}; // AD7606 8채널 데이터 저장

    while(1) {
        StartADCConversion(); // ADC 변환 시작
        DELAY_US(10); // 변환 완료 대기 (AD7606 변환 시간 약 4us)

        // 8채널 데이터 읽기
        for (int i = 0; i < 8; i++) {
            adc_values[i] = *(adc_data + i); // 각 채널 데이터 읽기
        }

        // 데이터 유효성 확인 (예: 채널 0 데이터가 0xFFFF 미만)
        if (adc_values[0] < 0xFFFF) {
            GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1; // 유효 데이터 수신 시 LED 끔
        }

        DELAY_US(1000); // 1ms 주기로 ADC 데이터 읽기
    }
}

설명:

  • 기능: XINTF Zone 7을 통해 병렬 ADC(AD7606)에서 8채널 데이터를 읽기
  • 설정: 16비트 데이터 버스, 타이밍(LEAD=2, ACTIVE=4, TRAIL=2), XREADY(BUSY 신호) 활성화
  • GPIO: XA[0:19], XD[0:15], XWE, XRD, XZCS7, GPIO12(CONVST), GPIO56(XREADY/BUSY), GPIO34(LED)
  • 출력: AD7606의 8채널 데이터 읽기, 유효 데이터 수신 시 LED OFF
  • 참고: AD7606은 16비트 8채널 동시 샘플링 ADC로, 병렬 인터페이스와 BUSY 신호를 지원

5.6 예제 6: 병렬 DAC 인터페이스 (AD5547 예제)

// File: xintf_dac_ad5547.c
// Description: TMS320F28335 XINTF를 사용한 병렬 DAC(AD5547) 인터페이스 예제
// Compiler: Code Composer Studio (TI C2000 Compiler)
// Target: TMS320F28335

#include "F28x_Project.h"

// XINTF Zone 7 메모리 주소 정의 (AD5547 데이터 레지스터)
#define XINTF_ZONE7_BASE 0x180000 // Zone 7 시작 주소
volatile Uint16 *dac_data = (volatile Uint16 *)XINTF_ZONE7_BASE; // 16비트 DAC 데이터 포인터

// GPIO 설정 함수
void ConfigureGPIO(void) {
    EALLOW; // 보호된 레지스터 접근 허용
    GpioCtrlRegs.GPAMUX2.all = 0xFFFFFFFF; // XA[0:15], XD[0:15]를 XINTF로 설정
    GpioCtrlRegs.GPBMUX1.all = 0xFFFFFFFF; // XA[16:19], XWE, XRD, XZCS7 등 설정
    GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // GPIO34를 출력으로 설정 (LED용)
    GpioDataRegs.GPBSET.bit.GPIO34 = 1; // GPIO34를 High로 설정하여 LED 켬
    GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0; // GPIO12를 DAC WR 신호로 설정
    GpioCtrlRegs.GPADIR.bit.GPIO12 = 1; // GPIO12를 출력 방향으로 설정
    EDIS; // 보호된 레지스터 접근 비허용
}

// XINTF 설정 함수
void ConfigureXINTF(void) {
    EALLOW; // 보호된 레지스터 접근 허용
    CpuSysRegs.PCLKCR0.bit.XINTF = 1; // XINTF 모듈 클럭 활성화
    EDIS; // 보호된 레지스터 접근 비허용

    XintfRegs.XTIMING7.bit.XWRLEAD = 1; // 쓰기 LEAD 시간: 1 SYSCLK
    XintfRegs.XTIMING7.bit.XWRACTIVE = 2; // 쓰기 ACTIVE 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.XWRTRAIL = 1; // 쓰기 TRAIL 시간: 1 SYSCLK
    XintfRegs.XTIMING7.bit.XRDLEAD = 1; // 읽기 LEAD 시간: 1 SYSCLK
    XintfRegs.XTIMING7.bit.XRDACTIVE = 2; // 읽기 ACTIVE 시간: 2 SYSCLK
    XintfRegs.XTIMING7.bit.XRDTRAIL = 1; // 읽기 TRAIL 시간: 1 SYSCLK
    XintfRegs.XTIMING7.bit.USEREADY = 0; // XREADY 신호 비활성화
    XintfRegs.XTIMING7.bit.XSIZE = 0; // 16비트 데이터 버스

    XintfRegs.XINTCNF2.bit.CLKMODE = 0; // XINTF 클럭: SYSCLK (150MHz)
    XintfRegs.XINTCNF2.bit.CLKDIV = 0; // 클럭 분주비 1/1
    XintfRegs.XINTCNF2.bit.WRITEENA = 1; // 쓰기 동작 활성화
}

// DAC 데이터 쓰기 함수
void WriteDACData(Uint16 data) {
    GpioDataRegs.GPACLEAR.bit.GPIO12 = 0; // WR Low
    *dac_data = data; // DAC 데이터 쓰기
    DELAY_US(1); // 1us 대기 (AD5547 WR 펄스 폭)
    GpioDataRegs.GPASET.bit.GPIO12 = 1; // WR High
}

void main(void) {
    InitSysCtrl(); // 시스템 클럭(150MHz)과 PLL 초기화
    DINT; // 모든 인터럽트 비활성화
    InitPieCtrl(); // PIE 컨트롤러 초기화
    IER = 0x0000; // CPU 인터럽트 레지스터 비활성화
    IFR = 0x0000; // 인터럽트 플래그 레지스터 클리어
    InitPieVectTable(); // PIE 인터럽트 벡터 테이블 초기화

    ConfigureGPIO(); // GPIO 설정 함수 호출
    ConfigureXINTF(); // XINTF 설정 함수 호출

    // DAC 출력 테스트 (간단한 램프 신호 생성)
    Uint16 dac_value = 0;

    while(1) {
        WriteDACData(dac_value); // DAC에 데이터 쓰기
        dac_value += 100; // 출력 전압 증가 (16비트 DAC 기준)
        if (dac_value >= 0xFFFF) {
            dac_value = 0; // 최대값 도달 시 초기화
            GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1; // 한 사이클 완료 시 LED 끔
            DELAY_US(1000); // LED 확인을 위해 대기
            GpioDataRegs.GPBSET.bit.GPIO34 = 1; // LED 켬
        }
        DELAY_US(100); // 100us 주기로 DAC 업데이트
    }
}

설명:

  • 기능: XINTF Zone 7을 통해 병렬 DAC(AD5547)에 데이터를 써서 램프 신호 생성
  • 설정: 16비트 데이터 버스, 타이밍(LEAD=1, ACTIVE=2, TRAIL=1), Zone 7 사용
  • GPIO: XA[0:19], XD[0:15], XWE, XRD, XZCS7, GPIO12(WR), GPIO34(LED)
  • 출력: AD5547에 램프 신호 데이터 쓰기, 한 사이클 완료 시 LED OFF 후 ON
  • 참고: AD5547은 16비트 병렬 DAC로, 빠른 쓰기 동작을 지원

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

  • XINTF 연결: 외부 SRAM, FPGA, ADC(AD7606), DAC(AD5547)를 XINTF 핀(XA, XD, XWE, XRD, XZCS6, XZCS7)에 연결
  • ADC/DAC 제어 신호: GPIO12(CONVST/WR), GPIO56(XREADY/BUSY) 연결
  • LED: GPIO34에 LED 연결
  • 타이밍 확인: 외부 장치 데이터시트(AD7606, AD5547 등)에 맞는 타이밍 설정 확인

6.4 디버깅

  • CCS Expressions 창: adc_data, dac_data, XintfRegs.XTIMING6, XintfRegs.XTIMING7 확인
  • 오실로스코프: XWE, XRD, XZCS6, XZCS7, XREADY, CONVST, WR 신호 타이밍 점검
  • 데이터 일관성: ADC/DAC 데이터 읽기/쓰기 결과 확인
  • 인터럽트 확인: PieCtrlRegs.PIEACK 및 ISR 동작 점검 (예제 2)

7. 추가 팁

  • 타이밍 최적화: 외부 장치(AD7606, AD5547 등)의 액세스 시간에 따라 타이밍 조정
  • XREADY 사용 Ascension: 비동기 장치 연결 시 XREADY 활성화 권장
  • C2000Ware 참고: C:\ti\c2000\C2000Ware_x_xx_xx_xx\device_support\f2833x\examples\cpu1\xintf
  • 문제 해결:
    •   데이터 읽기/쓰기 실패: 타이밍 설정, XSIZE, GPIO 멀티플렉서 확인
    •   신호 불안정: XCLKOUT 분주비 조정
    •   ADC/DAC 동작 실패: CONVST, WR, BUSY 신호 및 타이밍 확인
  • TI 리소스: TI E2E 포럼, C2000Ware 예제

https://www.analog.com/media/en/technical-documentation/data-sheets/ad7606_7606-6_7606-4.pdf

https://www.analog.com/media/en/technical-documentation/data-sheets/ad5547_5557.pdf

8. 결론

이 문서는 TMS320F28335 XINTF 모듈의 설정 방법과 Bitfield 구조를 활용한 예제 코드를 제공하여 외부 메모리 및 주변 장치(ADC, DAC 등) 인터페이스 애플리케이션에 적용 가능하도록 구성했습니다.

키워드: TMS320F28335, XINTF, C2000, 외부 메모리, SRAM, FPGA, 병렬 ADC, 병렬 DAC, Code Composer Studio, 타이밍 제어, Zone 6, Zone 7, 16비트 데이터 버스, 인터럽트, XREADY

반응형