[DSP]/DSP60002012. 2. 11. 23:00

TMS320C672x DSP Lib ROM 예제 코드

TMS320C672x DSP Lib ROM 예제 코드

TMS320C672x 는 내부롬에 DSP library, FastRTS, BOIS library 가 들어 있어 코드 사이즈를 줄이고 속도도 향상 시켜 준다고 한다.

DSP library, FastRTS 만 사용해도 3Kbyte 이상 줄일 수 있다고 하는데... 첨부파일에는 자세한 방법 및 예제 코드가 들어 있다.




Posted by nexp

댓글을 달아 주세요

[DSP]/DSP60002012. 2. 11. 22:00

[TMS320C6720 EVM] TFT LCD테스트

 [TMS320C6720 EVM] TFT LCD테스트


TMS320C6720은 최대 200Mhz까지 동작한다. 속도가 빠르기 때문에 타이밍 조절하는데 좀 고생했다.
EMIF는 SDRAM, SRAM 모두 가능한데 SARM을 위한 CS가 하나밖에 없어 보드상의 Nor Flash CS인 CS2에서 점퍼를 이용해 [LCD_EXP_EVM] 보드 의 CS로 사용했다.

TFT LCD 400x240 한프레임 출력하는데 걸리는 시간은  4.2ms정도 이고(좀더 튜닝을 하면 더 오르겠지만.. EMIF속도가 빨라 Wait Time 설정이 필요하다), 안정적인 구동을 위해 7ms 설정 했다.


TMS320C672x TFT LCD 출력 테스트 동영상




TMS320C6720 SD Card 이미지 출력 예제 동영상
역시 SPI로 SD Card제어하기 때문에 속도는 그리 빠르지 않아 보인다. NAND를 이용하여 테스트 하면 속도가 빨라지지 않을까..




TMS320C6720 TFT LCD 구동 Read/Write 함수

#define LCD_DATA       *(volatile unsigned short*)(0x90000000)

//Write Command
void Lcd_Cmd(unsigned int Data)  
{
 LCD_RS_OFF();

  _LCD_DAT_OUT(Data);

LCD_RS_ON(); 
}

//Write Data
void Lcd_Data(unsigned int Data)  
{
 _LCD_DAT_OUT(Data);
}



TMS320C6720 SD Card 드라이버코드
//-----------------------------------------------------------------------------
// SD Card HAL
#define MMC_CS_PORT      SPI0_PC3
#define MMC_CS_BIT      BIT11

#define MMC_CS_INIT()     Cbi(SPI0_PC0, MMC_CS_BIT);Sbi(SPI0_PC1, MMC_CS_BIT);\
          MMC_CS_HIGH()
          
#define MMC_CS_HIGH()     Led1Off()
#define MMC_CS_LOW()     Led1On()
//#define MMC_CS_LOW()     Cbi(MMC_CS_PORT, MMC_CS_BIT)
//#define MMC_CS_LOW()     Cbi(MMC_CS_PORT, MMC_CS_BIT)

#define MMC_ASSERT_INIT()    MMC_CS_INIT();MMC_CS_HIGH()
#define MMC_ASSERT()     MMC_CS_LOW()
#define MMC_DEASSERT()     MMC_CS_HIGH()

#define MMC_SpiInit()     SPI1_Init()
#define MMC_SendByte     SPI1_WriteReadByte
#define MMC_Send(Data)      SPI1_WriteByte(Data)
#define MMC_Recv()      SPI1_WriteReadByte(0xFF)
#define MMC_RecvP(Data)     MMC_Send(0xFF); (*(Data)=SPI1_ReadByte())
#define MMC_SPISpeed     SPI1_SetSpeed
Posted by nexp

댓글을 달아 주세요

[DSP]/DSP60002012. 2. 10. 23:30

[TMS320C6720] SPI 테스트 - 3축 가속도 센서 CCS 를 이용한 그래프표시 하기

[TMS320C6720] SPI 테스트 - 3축 가속도 센서 CCS 를 이용한 그래프표시 하기

TMS320C6720에는 UART는 없지만 SPI포트가 2채널 있다.
테스트 결과 최대 클럭 스피드는 50Mhz(100Mhz//(1+1))까지 출력은 가능하다. FIFO가 없긴하지만, 클럭 설정도 유연하게 설정가능한것 같고...DMA도 지원한다니 SPI인터페이스에 좋을것 같다.



TMS320C6720SPI 관련 블록도





TMS320C672x SPI 주요 레지스터

SPIFMTx 레지스터
17 :  POLARITY
16 : PHASE
15-8 : PRESCALE[7:0]
  BR = SYSCLK2/(PRESCALEx + 1)

SPIDATx : 송신 버퍼

SPIBUF : 수신 버퍼


TMS320C6720 SPI Read/Write함수
SPI1BUF레지스터의 RXEMPTY(BIT31) 가 1이되면 수신이 완료된 것을 나타내고 데이터를 가져오면 된다.
unsigned char SPI1_WriteReadByte(unsigned char Data)

 _SPI1DATA0 = Data;

 while(_SPI1BUF & BIT31);

 return (_SPI1BUF & 0xFF);
}



TMS320C6720 SPI테스트 예제 소스코드
#include "system.h"
#include "myAccel.h"

void main()
{
 unsigned int idx = 0;
 short data = 0;
 short buf[128];

 SystemInit();

 //Led Init..
 Led1Init();
 Led2Init();

 Led1Off();
 Led2Off();

 DebugPrint("[TMS320C6720 EVM] Test Program - SPI Accel Test.\n");

myAccel3lvInit();
   //1000.0111 Power on, enable all axis, self test off
 myAccel3lvWrite(CTRL_REG1, 0xC7);  
    DebugPrint("Accel Init\r\n");   
   
 data = myAccel3lvRead(WHO_AM_I);
 DebugPrint("Who am I? 0x%02X\r\n", data);     

 while(1)
 {
  if(idx > 128)
  {
   for(idx=0;idx<128;idx++)buf[idx]=0;
   idx = 0;
  }

  GetAccelValue(AXIS_X, &data);
  buf[idx++] = data;

  Led1Toggle();
  DebugPrint("%d\r\n", data);
 }
}




[LCD_EXP_EVM] 보드 의 SPI커넥터



CCS3.3을 이용하면 데이터를 그래프로 볼 수 있어 편리한데, 3축 가속도 센서의 데이터값을 그래프로 보기 위해 적당한 값으로 버퍼 잡고 (short buf[128]), 브레이크 포인트 걸어서 실시간으로 센서 데이터값을 그래프로 확인 가능하다.




디버깅 툴이 그리 빠르지 않은넘이라... 실시간이라기는 좀 그렇지만 전체적인 센서의 추위는 확인 할 수 있다.




TMS320C 6720 SPI 가속도센서 테스트 동영상

Posted by nexp

댓글을 달아 주세요

[DSP]/DSP60002012. 2. 10. 22:00

[TMS320C6720] EMIF 테스트

[TMS320C6720] EMIF 테스트



TMS320C6720의 외부 메모리는 0x9000 0000에 CS2가 할당되어 있다.
SRAM용으로 /CS가 하나 밖에 없는것이 아쉽다.







아래 코드로 테스트 결과 EMIF신호가 정상적으로 출력되는 것을 확인할 수 있다.
타이밍 조절만 좀 해주면 될것 같다.
#define LCD_DATA   *(volatile unsigned short*)(0x90000000)


 while(1)
 {
  LCD_DATA = 0xFFFF;
  Delay(100);

  LCD_DATA = 0x0000;
  Delay(100);
 }


Asynchronous SRAM 제어시 두가지 모드가 있다.
WE Strobe Mode - >  16비트 Write모드

Select Strobe Mode -> Byte  Wrie모드







외부로 연결되는 /RD신호는 /OE에 연결해야 하는데 EM_RW에 연결 했다. NOR Flash에 연결되어 있는 /OE에서 점퍼를 날릴 필요가 있다.
EM_RW (Read/Write select pin.)
This pin is high for the duration of an asynchronous read access cycle and low for the duration of an
asynchronous write access cycle.

EM_OE (Active-low pin enable for asynchronous devices.)
This pin provides a signal which is active-low during the strobe period of an asynchronous read
access cycle.



Posted by nexp

댓글을 달아 주세요

[DSP]/DSP60002012. 2. 3. 21:30

[TMS320C6720 EVM] RTI Timer 테스트 - 1초 만들기

[TMS320C6720 EVM] RTI Timer 테스트 - 1초 만들기


TMS320C67xx RTI Timer 관련 자료

TMS320C672x는 C671x에 있는 일반적인 타이머 모듈이 없고 The Real-Time Interrupt Module (RTI) 라고 하는 타이머 모듈이 2채널 존재 한다.
 






TMS320C6720 RTI Timer 인터럽트 핸들러
//time interval = 1ms
void RTI_TimerHandler(void)
{
    Bool          intEvent;
    CSL_Status    status;

    /* Read the interrupt flag register */
    status = CSL_rtiGetHwStatus (hRti, CSL_RTI_QUERY_INT0_STATUS, &intEvent);

 //----------------------------------------
 Led1Toggle();

 gTimeTick1++;
 //----------------------------------------

    /* Clear the interrupt */
    status = CSL_rtiHwControl (hRti, CSL_RTI_CMD_CLEAR_INT0, &intEvent);
}



TMS320C6720 RTI Timer 초기화 함수
void RTI_Setup(void)
{
    CSL_RtiObj               rtiObj;
    CSL_Status               status = CSL_SOK;
    CSL_RtiHwSetup           hwSetup = CSL_RTI_HWSETUP_DEFAULTS;
    CSL_RtiHwSetup           hwSetupRead;
    Uint16                   count = 0;

    /* clear local data structures */
    memset (&rtiObj, 0, sizeof (CSL_RtiObj));
    memset (&hwSetup, 0, sizeof (CSL_RtiHwSetup));
    memset (&hwSetupRead, 0, sizeof (CSL_RtiHwSetup));

    /* Initalize the RTI csl module */
    status = CSL_rtiInit (NULL);
    
    /* Open csl module */
    hRti = CSL_rtiOpen (&rtiObj, CSL_RTI, NULL, &status);
    if ((status != CSL_SOK) || (hRti == NULL)) return;

    /* Setup hardware parameters */       
    hwSetup.blk0ExtnCntl                    = CSL_RTI_CAPTURE_EVENT_SOURCE1;
    hwSetup.blk1ExtnCntl                    = CSL_RTI_CAPTURE_EVENT_SOURCE1;  
    hwSetup.compareUpCntrs.compareUpCntr0   = UC_COMP_VALUE;  
    hwSetup.compVal.comp0Val                = COMPARE0_VALUE;
    hwSetup.compVal.comp1Val                = COMPARE1_VALUE;
    hwSetup.compVal.comp2Val                = COMPARE2_VALUE;
    hwSetup.compVal.comp3Val                = COMPARE3_VALUE;
    hwSetup.updateCompVal.updateComp0Val    = UPDATECOMPARE_VALUE;
    hwSetup.updateCompVal.updateComp1Val    = UPDATECOMPARE_VALUE;
    hwSetup.updateCompVal.updateComp2Val    = UPDATECOMPARE_VALUE;
    hwSetup.updateCompVal.updateComp3Val    = UPDATECOMPARE_VALUE;  
    hwSetup.preLoadWatchdog                 = PRELOAD_VALUE;   
       
    /* Enable compIntr0 alone */
    hwSetup.intConfig.compIntr0En       = TRUE;
    hwSetup.intConfig.compIntr1En       = FALSE;
    hwSetup.intConfig.compIntr2En       = FALSE;
    hwSetup.intConfig.compIntr3En       = FALSE;

    /* Stop Rti Block0 counters */
    status = CSL_rtiHwControl (hRti, CSL_RTI_CMD_STOP_BLOCK0, NULL);

    /* Setup rti module */
    status = CSL_rtiHwSetup (hRti, &hwSetup);

    /* verify the hwsetup configuration */
    status = CSL_rtiGetHwSetup (hRti, &hwSetupRead);

    /* Start Rti Block0 counters */
    status = CSL_rtiHwControl (hRti, CSL_RTI_CMD_START_BLOCK0, NULL);
    }




TMS320C6720 RTI Timer 테스트 예제 소스코드
TMS320C6720의 RTI0를 이용하여 1ms 인터럽트로 구동하고 메인함수에서 1초마다 한번씩 LED를 점등하는 예제이다.
void main()
{
 SystemInit();

 //Led Init..
 Led1Init();
 Led2Init();

 Led1Off();
 Led2Off();

 DebugPrint("[TMS320C6720 EVM] Test Program - RTI Timer.\n");

 //RTI Timer 초기
 RTI_Init();

 while(1)
 {
  //1000ms/1ms = 1000 => 1초
  if(gTimeTick1>1000)화
  {
   gTimeTick1 = 0;

   Led2Toggle();
  }
 }
}

Posted by nexp

댓글을 달아 주세요