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 설정 절차
- 시스템 초기화:
- InitSysCtrl()로 시스템 클럭과 PLL 초기화
- 인터럽트 비활성화 및 PIE 초기화 (DINT, InitPieCtrl, InitPieVectTable)
- XINTF 클럭 활성화:
- CpuSysRegs.PCLKCR0.bit.XINTF = 1로 XINTF 모듈 클럭 활성화
- 보호된 레지스터 접근을 위해 EALLOW와 EDIS 사용
- GPIO 설정:
- XINTF 관련 GPIO 핀(XD[0:15], XA[0:19], XWE, XRD 등)을 XINTF 기능으로 설정
- GpioCtrlRegs.GPAMUXx, GpioCtrlRegs.GPBMUXx로 멀티플렉서 설정
- 타이밍 설정:
- XTIMINGx 레지스터로 읽기/쓰기 타이밍 설정 (LEAD, ACTIVE, TRAIL)
- 외부 장치 스펙에 맞게 타이밍 조정
- 영역 설정:
- XINTCNF2로 Zone 0, Zone 6, Zone 7 설정
- XBANK로 뱅크 스위칭 설정 (필요 시)
- 인터럽트 설정 (필요 시):
- XINT.bit.ENABLE로 인터럽트 활성화
- 인터럽트 벡터 테이블에 ISR 연결
- 모듈 실행:
- 외부 장치와 데이터 읽기/쓰기 수행
- XREADY 신호로 동기화 (필요 시)
4. XINTF 설정 고려사항
- 클럭 설정: SYSCLK(150MHz)에서 XCLKOUT 분주 설정
- 타이밍: 외부 장치의 데이터시트에 따라 LEAD/ACTIVE/TRAIL 설정
- 데이터 버스: 16비트 또는 32비트 모드 선택
- 메모리 맵: Zone 0(0x002000
0x003FFF), 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
'MCU > C2000' 카테고리의 다른 글
[TI C2000]TMS320F280049C DSP를 적용한 동기 벅 컨버터 설계 절차-VMC (0) | 2025.08.20 |
---|---|
[TMS320F28335] CAN, I2C, McBSP 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.19 |
[TMS320F28335] DMA 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.19 |
[TMS320F28335] eQEP 및 eCAP 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.19 |
[TMS320F28335] ADC 사용법 : Bitfield 구조 활용 예제 코드 (0) | 2025.08.18 |
[TMS320F28335] ePWM 사용법 : Bitfield 구조 활용 예제 코드 (1) | 2025.08.18 |
[TMS320F28377D] DC-DC 변환 토포롤로지별 ePWM 생성 방법: Bitfield 구조 활용 예제 코드 (1) | 2025.08.18 |
[TI C2000]TMS320F28377D, TMS320F28379D, TMS320F28388D 비교 (2) | 2025.08.18 |