[DSP]/PICCOLO2011. 5. 5. 08:30

[TMS320F28069 EVM] TFT LCD 테스트

[TMS320F28069 EVM] TFT LCD 테스트


[EXP-DSP EVM] 보드를 이용하면 8비트 모드로 TFT LCD를 쉽게 테스트 해 볼 수 있다. TMS320F28069는 최대 80MHz 동작하므로 속도는 느리지 않을것 같다.

일단 기존 코드에 드라이버 부분만 수정하면 프로그램 수정없이 테스트 가능하므로 속도 테스트를 해보자

TFT LCD 드라이버 코드
//-----------------------------------------------------------------------------
// TFT LCD Driver
#define TFT_DRV_COM44     1

#define LCD_LAT_BIT      BIT8
#define LCD_LAT_ON()     sbi(GPIOA_S, LCD_LAT_BIT);NOP();
#define LCD_LAT_OFF()     cbi(GPIOA_C, LCD_LAT_BIT);NOP();
#define LCD_DATA_LATCH()    LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT      BIT30
#define LCD_EN_PORT      
#define LCD_ENABLE()     cbi(GPIOA_C, LCD_EN_BIT);NOP();
#define LCD_DISABLE()     sbi(GPIOA_S, LCD_EN_BIT);NOP();

#define LCD_RST_BIT      BIT6
#define LCD_RST_PORT     PORTA
#define LCD_RST_ON()     
#define LCD_RST_OFF()     

#define LCD_RS_BIT      BIT31
#define LCD_RS_PORT      
#define LCD_RS_OFF()     cbi(GPIOA_C, LCD_RS_BIT);NOP();
#define LCD_RS_ON()      sbi(GPIOA_S, LCD_RS_BIT);NOP();

#define LCD_WR_BIT      BIT12
#define LCD_WR_PORT      
#define LCD_WR_OFF()     cbi(GPIOA_C, LCD_WR_BIT);NOP();
#define LCD_WR_ON()      sbi(GPIOA_S, LCD_WR_BIT);NOP();

#define LCD_RD_BIT      BIT7
#define LCD_RD_PORT      
#define LCD_RD_OFF()     //cbi(GPIOA_C, LCD_RD_BIT);NOP();
#define LCD_RD_ON()      //sbi(GPIOA_C, LCD_RD_BIT);NOP();

#define LCD_BL_BIT      BIT6
#define LCD_BL_PORT      PORTB
#define LCD_BL_OFF()     
#define LCD_BL_ON()      

#define _LCD_DAT_OUT(Data)    PORTA = (PORTA&(~0xFF)) | (Data>>8)&0xFF;NOP();\
          LCD_DATA_LATCH();\
          PORTA = (PORTA&(~0xFF)) | (Data&0xFF)&0xFF;NOP();

#define TFTGpioInit()     EALLOW;\
          Sbi(GpioCtrlRegs.GPADIR.all, 0xFF);\
          Cbi(GpioCtrlRegs.GPAMUX1.all, 0xFF);\
          GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO30 = 1;\
          GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;\
          GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO12 = 1;\
          GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO8 = 1;\
          EDIS;
//-----------------------------------------------------------------------------



TMS320F28069 EVM 핀맵


[EXP-DSP] TFT LCD관련 자료





TMS320F28069 EVM TFT LCD테스트 프로그램 동영상

Posted by nexp

댓글을 달아 주세요

[DSP]/PICCOLO2011. 4. 30. 23:00

[TMS320F28069 EVM] SPI테스트 - 3축 가속도 센서 테스트

[TMS320F28069 EVM] SPI테스트 - 3축 가속도 센서 테스트


SPI테스트 하기에는 가속도센서를 이용하면 상당히 편리하다. 제어 자체도 간단하지만 API로 작성해 둔것이 있으므로 SPI 드라이버 부분과 /CS핀 설정만 하면 쉽게 SPI동작여부를 테스트 할 수 있다.

SPI구조는 TMS320F2808과 같은 구조이고 특별하게 변한것이 없고 코드 또한 동일하게 호환된다. 다만 FIFO가 16 level에서 4 level로 줄었다. 아무래도 가격때문이지 않을까...

[NET-EVM] 보드에서 가속도 센서의 CS는 CN7-P8에 연결되어 있으므로  [TMS320F28069 EVM] 보드에서는 CN6의 P8->GP20에 연결되어 있다.




TMS320F28069 SPI 가속도 센서 초기화 드라이버 코드
#define _SPI0_ENABLE     1

//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE   1
#define MY_ACCEL3LV02_I2C_MODE   0

#define ACCEL_CS_BIT     BIT19
#define ACCEL_CS_PORT     

#define ACCEL_CS_ASSERT()    cbi(GPIOA_C, LCD_RS_BIT);NOP();
#define ACCEL_CS_DEASSERT()    sbi(GPIOA_S, LCD_RS_BIT);NOP();

#define ACCEL_CS_INIT()     EALLOW;\
          GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO20 = 1;\
          EDIS;\
          ACCEL_CS_DEASSERT()
          
#define ACCEL_SPI_INIT()    SPI0_Init()
#define ACCEL_Read      SPI0_WriteReadByte
#define ACCEL_Write      SPI0_WriteReadByte
//-----------------------------------------------------------------------------


[EXP-DSP EVM]확장 보드의 SPI포트에 연결하기 위해 점퍼핀으로 연결 했다.



TMS320F28069 3축 가속도 센서 테스트 동영상




TMS320F28069 SPI테스트 소스코드
void main(void)
{
 short data = 1;
 unsigned int flag = 1;

 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

 //시리얼 포트 초기화
 DebugInit(BAUD_115200);
 DebugPrint("TMS320F28069 EVM SPI Test(%d)Mhz\r\n", _SYS_CLK);

 //가속도 센서 LIS3LV02 초기화
 myAccel3lvInit();
 myAccel3lvWrite(CTRL_REG1, 0xD7);  //1000.0111 Power on, enable all axis, self test off

 while(1)
 {
  if(DebugIsByte())
  {
   switch(U0_GetByte())
   {
   case '0':
    Led1Off();
    DebugPrint("LED OFF\r\n");
    break;

   case '1':
    Led1On();
    DebugPrint("LED ON\r\n");   
    break;

   case 'h':
    DebugPrint("Device ID=%02X\r\n", myAccel3lvRead(WHO_AM_I));
    break;

   case 'r':
    GetAccelValue(AXIS_X, &data);
    DebugPrint("X=%d\r\n", data);
    break;
  }

  if(flag)
  {
   GetAccelValue(AXIS_X, &data);
   DebugPrint("%d\r\n", data);
   Delay(100);
  }
   
 }//end while
}




Posted by nexp

댓글을 달아 주세요

[DSP]/PICCOLO2011. 4. 30. 20:30

[TMS320F28069 EVM] Timer Interrupt Test - 1초 만들기

[TMS320F28069] Timer Interrupt Test - 1초 만들기

TMS320F28069 Piccolo시리즈는 3개의 32비트 시스템 타이머가 있다.



시스템 타이머 초기화 함수
ConfigCpuTimer() 함수를 이용하면 쉽게 설정 가능하다. 설정할 인자는 각각 아래와 같다.

//-----------------------------------------------------------------------------
//Timer0 Init
void Timer0Init(void)
{
 //인터럽트 루핸들러 설정
 EALLOW;
 PieVectTable.TINT0 = &Timer0Isr;
 EDIS;

//CPU Timer초기화
 InitCpuTimers();

 // Configure CPU-Timer 0 to interrupt every second:
 // 80MHz CPU Freq, 1 second Period (in uSeconds)
 ConfigCpuTimer(&CpuTimer0, 80, 1000);
 StartCpuTimer0();
 
 // Enable CPU INT1 which is connected to CPU-Timer 0:
    IER |= M_INT1;

 // Enable TINT0 in the PIE: Group 1 interrupt 7
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    
 // Enable global Interrupts and higher priority real-time debug events:
    ERTM;   // Enable Global realtime interrupt DBGM    
}
//-----------------------------------------------------------------------------

interrupt void Timer0Isr(void)
{
 Timer0Handler(); 

 // Acknowledge this interrupt to receive more interrupts from group 1
 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}



TMS320F28069 EVM Timer 테스트 예제 소스
1초마다 LED깜박이는 예제 테스트
#include "system.h"
#include "timer.h"

void Timer0Handler(void);

volatile unsigned int gTimeTick_1ms = 0;

void Timer0Handler(void)
{
 gTimeTick_1ms++;
}

void main(void)
{
 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

 //타이 인터럽트 초기화
 Timer0Init();
 enable();  //Enable Global realtime interrupt

 while(1)
 {
  if(gTimeTick_1ms>1000)
  {
   gTimeTick_1ms = 0;
   Led1Toggle();
  }
 }
}  
Posted by nexp

댓글을 달아 주세요

[DSP]/PICCOLO2011. 4. 30. 18:30

[TMS320F28069 EVM] GPIO토글 속토 측정

[TMS320F28069 EVM] GPIO토글 속토 측정



TMS320F28069 는 최대 클럭 80Mhz까지 가능하다. GPIO Toggle 속도를 측정해 보았다.

void main(void)
{
 //DSP System Initialize
 SystemInit();

 //LED Initialize
 Led1Init();
 Led1On();

 while(1)
 {
  GpioDataRegs.GPBTOGGLE.all = BIT34;
 }
}


메모리로 제어하기
아래 코드와 같이 비트 단위로 쉽게 제어 하기 위해 메모리로 제어하면  5Mhz정도가 정도가 나온다.
GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;





레지스터로 제어하기
8Mhz정도가 나오는데... 메모리 제어 처럼 보이지만 결국 레지스터 주소를 사용하므로 레지스터만 사용한다.



컴파일러에서 옵티마이즈 해 줄것으로 예상했지만 옵션을 바꿔봐도 메모리 제어, 레지스터 제어 결과가 다르게 나온다.
프로그램작성은 편할지 몰라도 그만큼 속도의 희생이 필요한것 같다.

앞으로 GPIO제어에는 레지스터 접근방법을 사용해야 겠다.
#define Led1Off()      GpioDataRegs.GPBSET.bit.GPIO34 = 1;
#define Led1On()      GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;

[참고] MCU속도 측정 결과 
Posted by nexp

댓글을 달아 주세요

[DSP]/PICCOLO2011. 4. 29. 22:30

[TMS320F28069 EVM] UART 테스트

[TMS320F28069 EVM] UART 테스트


UART를 테스트 하기 위해 예제 코드를 수정해서 테스트했다. 기존 TMS320F2808 예제 소스코드와 거의 동일하기 때문에 특별히 수정할것이 없을것 같았는데... 컴파일까지는 에러없이 된다.

다운로드 후 테스트 해보니 UART로 아무런 데이터도 전송되지 않는다.
무엇때문일까?


예제 코드를 보니 TMS320F2808과 같은 구조이다.(거의 코드 수정없이 가능하다. 코드는 문제가 아니라는 것인데...) 그렇다면 큰 문제없어야 할텐데...
클럭이 다르긴 한데.. 클럭이 달라진다고 해도 보레이트만 달라질 뿐 뭐라도 날아와야 하는데..


일단 TMS320F2806x에서 하드웨어 적으로 뭔가 달라진 것이 없는지 체크할 필요가 있다.
핀맵은 동일하고.. 내부 구조나 enable, 클럭등을 확인할 필요가 있다.

혹시 메모리 맵이나. 기타 설정에 문제가 있는것이 아닌지...
데이터시트를 좀더 자세히 들여다 봐야 할것 같다.

TMS320F28069 SCI 블록도




TMS320F28069 SCI UART 초기화코드

void U0_Init(unsigned char baud)
{
  InitSciaGpio();

  SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
                                   // No parity,8 char bits,
                                   // async mode, idle-line protocol
 SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                   // Disable RX ERR, SLEEP, TXWAKE
 SciaRegs.SCICTL2.all =0x0003;
 SciaRegs.SCICTL2.bit.TXINTENA =1;
 SciaRegs.SCICTL2.bit.RXBKINTENA =1;

 U0_SetBaud(baud);

 SciaRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset
}


코드적으로 한가지 의심스러운 것은  TX,RX인터럽트를 설정하고 있는데... 물론 기존 코드에서도 문제가 없긴하지만 인터럽트 백터가 이상하다면 문제가 될 수 있을것 같다. 이부분 삭제하고 테스트 해볼 필요가 있을것 같다.
 SciaRegs.SCICTL2.all =0x0003;
 SciaRegs.SCICTL2.bit.TXINTENA =1;
 SciaRegs.SCICTL2.bit.RXBKINTENA =1;
->테스트 결과 문제없다.  인터럽트는 사용하지 않으므로 문제가 없다.



무엇이 문제 일까? 항상 새로운 칩들은 문제가 발생하기 마련이다. 이런 문제를 풀어나가는 과정을 즐겨야 한다. 항상 해결하고나면 아무것도 아닌데...


USER Guide를 천천히 읽어보니 약간의  차이를 발견할 수 있다.

문제는 보레이트 설정에 있었던것 같다. 기존 TMS320F2808과는 보레이트 설정에 차이가 있다.


BRR = LSPCLK/8/Baudrate @LSPCLK 20Mhz


결정적으로 TI에서 제공하는 예제코드에 문제가 있다. 보레이트 설정 레지스터(SCIHBAUD, SCILBAUD)가 각각 8비트만 의미 있다.
    SciaRegs.SCIHBAUD    =0x0000;  // 9600 baud @LSPCLK = 20MHz (80 MHz SYSCLK).
    SciaRegs.SCILBAUD    =0x0103;

TI에서 제공하는것인데.. 좀이상하다. 컴파일러 환경이 달라서 그런가? CCS 4.x에서 테스트 해볼 필요가 있겠다.
->아무튼 아래와 같이 수정하니 잘 동작한다.
      SciaRegs.SCIHBAUD    =0x0001;
      SciaRegs.SCILBAUD    =0x0003;


PICCOLO TMS320F28069 UART테스트 예제 소스코드
나머지는 TMS320F2808 기존 코드를 그대로 사용해도 잘 동작한다. 프로그램을 좀 수정하여 printf 도 사용 가능하도록 수정하였다.
#include "system.h"
#include "serial.h"

void main(void)
{
 unsigned int cnt = 0;

 //DSP System Initialize
 SystemInit();

 DebugInit(BAUD_115200);
 DebugPrint("TMS320F28069 EVM Serial Test(%d)Mhz\r\n", _SYS_CLK);

 Led1Init();
 Led2Init();
 Led1On();

 while(1)
 {
  if(DebugIsByte())
  {
   switch(U0_GetByte())
   {
   case '0':
    Led1Off();
    DebugPrint("LED OFF\r\n");
    break;

   case '1':
    Led1On();

    DebugPrint("LED ON\r\n");   
    break;

   case '+':
    DebugPrint("Cnt Value=%d(0x%02X)\r\n", cnt++);   
    break;
   } 
  }
 }
}  
Posted by nexp

댓글을 달아 주세요