[DSP]/DSP280x-M2011. 10. 30. 20:00

[TMS320F2808 EVM] TFT LCD Test - LCD-PLD-IF 보드 이용

[TMS320F2808 EVM] TFT LCD Test - LCD-PLD-IF 보드 이용



[TMS320F2808 EVM] 보드를 이용하여 TFT LCD테스트를 했다. PICCOLO 시리즈인 TMS320F28069 테스트때 SPI속도가 늦어 SD Card 읽어 오는 속도가 느렸는데 TMS320F2808이 조금 더 빠른것 같다.


TMS320F2808 TFT LCD테스트 동영상



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

#define LCD_LAT_BIT      BIT2 //-> GPIO34
#define LCD_LAT_PORT     PORTB

#define LCD_LAT_ON()     Sbi(LCD_LAT_PORT, LCD_LAT_BIT);NOP();
#define LCD_LAT_OFF()     Cbi(LCD_LAT_PORT, LCD_LAT_BIT);NOP();
#define LCD_DATA_LATCH()    LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT      BIT20
#define LCD_EN_PORT      PORTA
#define LCD_ENABLE()     Cbi(LCD_EN_PORT, LCD_EN_BIT);NOP();
#define LCD_DISABLE()     Sbi(LCD_EN_PORT, 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      BIT21
#define LCD_RS_PORT      PORTA
#define LCD_RS_OFF()     Cbi(LCD_RS_PORT, LCD_RS_BIT);NOP();
#define LCD_RS_ON()      Sbi(LCD_RS_PORT, LCD_RS_BIT);NOP();

#define LCD_WR_BIT      BIT23
#define LCD_WR_PORT      PORTA
#define LCD_WR_OFF()     Cbi(LCD_WR_PORT, LCD_WR_BIT);NOP();
#define LCD_WR_ON()      Sbi(LCD_WR_PORT, LCD_WR_BIT);NOP();

#define LCD_RD_BIT      //BIT7
#define LCD_RD_PORT      //
#define LCD_RD_OFF()     //Cbi(LCD_RD_PORT, LCD_RD_BIT)
#define LCD_RD_ON()      //Sbi(LCD_RD_PORT, LCD_RD_BIT)

#define LCD_BL_BIT      BIT15
#define LCD_BL_PORT      PORTA
#define LCD_BL_OFF()     Cbi(LCD_BL_PORT, LCD_BL_BIT)
#define LCD_BL_ON()      Sbi(LCD_BL_PORT, LCD_BL_BIT)


#define _LCD_DAT_OUT(Data)    GpioDataRegs.GPADAT.all = (GpioDataRegs.GPADAT.all&(~0xFF)) | (Data>>8)&0xFF;NOP();\
          LCD_DATA_LATCH();\
          GpioDataRegs.GPADAT.all = (GpioDataRegs.GPADAT.all&(~0xFF)) | (Data&0xFF)&0xFF;NOP();
          

#define TFTGpioInit()     EALLOW;\
          Sbi(GpioCtrlRegs.GPADIR.all, 0xFF);\
          Cbi(GpioCtrlRegs.GPAMUX1.all, 0xFF);\
          GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;\
          GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;\
          GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO21 = 1;\
          GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO20 = 1;\
          GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO23 = 1;\
          GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO15 = 1;\
          EDIS;
//-----------------------------------------------------------------------------
Posted by nexp

댓글을 달아 주세요

[DSP]/DSP280x-M2011. 10. 29. 16:19

[TMS320F2808] 메모리 할당 에러

[TMS320F2808] 메모리 할당 에러
TFT LCD, TCP/IP, FAT 를 올리고 컴파일 하니 에러가 발생한다.

"D:\\WORK\\DSP\\dsp280x-m\\DSP280x_common\\cmd\\2808_RAM_lnk.cmd", line 111: error:
   placement fails for object ".text", size 0x1182 (page 0).  Available ranges:
   PRAMH0       size: 0x1000       unused: 0x1000       max hole: 0x1000   

error: errors encountered during linking; "./Debug/dsp280x_evm.out" not built

코드영역(.text) 이 부족 하다고 한다. 8K(0x1000)가 코드 영역(PRAMH0)으로 할당되어 있다.


TMS320F2808은 스펙에 18Kx16 SRAM이 있다. 넉넉해 보이지만 코드영역을 RAM으로 올려야 하기 때문에 테스트 용으로는 상당히 부족하다.





시리얼 디버깅 삭제하고, 옵티마이즈 하니 1K안으로 들어오긴 한다. 하지만 코드가 좀더 늘어나면 문제가 있을것 같다.




앞으로 추가적인 예제는 코드를 줄이던지 플래시에 올려서 테스트 하던지 해야 할것 같다.



Posted by nexp

댓글을 달아 주세요

[DSP]/DSP280x-M2011. 10. 29. 12:05

[TMS320F2808 EVM] W5200 이용한 TCP Server 전송 속도 테스트

[TMS320F2808 EVM] W5200 이용한 TCP Server 전송 속도 테스트


TMS320F2808의 SPI 최대 속도는 6.2Mhz 정도 이고 이때 TCP 전송 속도는 1.5831 Mbps 정도 나온다.
결론 적으로 CPU속도는 나쁘지 않는데.. SPI클럭 속도가 너무 느리다. SPI속도를 요하는 어플리케이션은 고려할 필요가 있는것 같다.
그래도 1.5Mbps면 간단한 웹서버 정도 돌리는데는 문제가 없을것 같다.


[NET_EXP] W5100 / W5200 모듈 보드 핀맵



Posted by nexp

댓글을 달아 주세요

[DSP]/DSP280x-M2010. 5. 5. 21:00

[DSP280x-M EVM] C28x Signal Generator Library 테스트

[DSP280x-M EVM] C28x Signal Generator Library 테스트
TI에서 제공하는 C28x용 라이브러리 는 여러가지로 유용한 점이 많은데 그중 가장 기본이 되는 C28x Signal Generator Library 를 이용하여 신호를 생성하는 테스트를 진행 했다.


TI제공 라이브러리 및 소스코드


우선 소스코드를 다운 받아서 라이브러리를 인클루드 해 준다.
sgen.h
sgen.lib

생성 한 신호를 확인하기 위해 여러가지 방법이 있지만 가장 간단하게 할 수 있는것이 PC USB2UART 이다. 신호 생성용 라이브러리를 이용하여 생성후 시리얼로 데이터 전송하여 확인하면 쉽게 생성된 데이터를 확인 할수 있다.



Single Channel SIN Generator (Table look-up)
신호 생성 라이브러리에느 여러 신호 생성 테이블이 있는데 그중 가장 간단한 사인(sin)파 생성을 방법을 살펴 보면 아래와 같은 구조로 구성되어있다.



데이터 타입(SGENT_1)은 SGENT_1_DEFAULTS, SGENT_1_handle 두가지로 생성 할수 있다. SGENT_1_handle는 사용자 정의 테이블 이므로 일단 Default로 생성 한다

//신호 생성 메모리 할당
SGENT_1 sgen1 = SGENT_1_DEFAULTS;

주파수 및 각 파라메터 설정
기본 최대 주파수는 20Khz샘플레이트에서 step_max가 1000으로 설정되고 305.17Hz가 된다. 당연히 2000으로 설정하면 610Hz가 되겠지...
적절히 잘 조절하면 원하는 주파수를 생성할 수 있다. 물론 주파수가 높아지면 신호는 정밀도가 떨어지지만...



TMS320F2808 신호 생성 테스트 예제
코드 아주 심플하여 쉽게 적용 가능하다. 메모리 할당하고 sgen1.calc() 함수로 신호를 생성후 sgen1.out 신호를 PWM 또는 DAC로 출력하면 된다.

//신호 생성 메모리 할당
SGENT_1 sgen1 = SGENT_1_DEFAULTS;

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

 Led1Init();
 Led1On();

 DebugInit(BAUD_57600);
 DebugPrint("Signal Gen Test\r\n");

 //신호 생성 초기화
 sgen1.offset=0;
 sgen1.gain=0x7fff;        // gain=1 in Q15                              
 sgen1.freq=5369;          /* freq = (Required Freq/Max Freq)*2^15       */
                                 /*      = (50/305.17)*2^15 = 5369             */         
 sgen1.step_max=1000;      /* Max Freq= (step_max * sampling freq)/65536 */
                                       /* Max Freq = (1000*20k)/65536 = 305.17       */
 while(1)
 {
  //신호 생성
  sgen1.calc(&sgen1);
  sig1=sgen1.out;
  
  //신호 출력
  U0_PutInt(sig1);

  Led1Toggle();
  Delay(50);
 }
}


테스트 동영상



추가로 데이터 로그 라이브러리를 이용하면 Code Composer Studio에서 제공하는 그래프 기능을 사용 하여 쉽게 디버깅 할 수 있다. (물론 위 방법보다 실시간성은 떨어지지만...)




그래프 보기 설정



소스코드

//데이터 로그모듈 생성
DLOG_4CH dlog=DLOG_4CH_DEFAULTS;    

main()
{
 :
 //데이터 로그 초기화      
 dlog.iptr1=&sig1;
 dlog.trig_value=0x800;
 dlog.size=1024;         //데이터 샘플수 1024 Samples
 dlog.init(&dlog);



 

 while(1)
 {
  //신호 생성
  sgen1.calc(&sgen1);
  sig1=sgen1.out;
  
  //신호 출력
  U0_PutInt(sig1);

 //그래프 업데이트
  dlog.update(&dlog);

  Led1Toggle();
  Delay(50);
 }





 

Posted by nexp

댓글을 달아 주세요

[DSP]/DSP280x-M2010. 5. 4. 23:00

[DSP280x-M EMV]SPI 테스트 - 3축 가속도 센서(LIS3LV02) 데이터 로깅

[DSP280x-M EMV]SPI 테스트 - 3축 가속도 센서(LIS3LV02) 데이터 로깅


TMS320F2808 의 SPI통신을 이용하여 3축 가속도 센서 LIS3LV02를 테스트 했다. 확장 테스트 보드에 가속도 센서를 장착할 수 있기 때문에 쉽게 테스트 가능하다.

TMS320F2808에는 4개의 독립적인 SPI포트가 있는데 이중 표준커넥터로 뽑아둔 SPIA(P16~P19)를 이용한다.



확장 보드에서 LIS3LV02는 SPI포트에 연결되어 있고 CS핀은 P22에 연결되어 있다.



PC 호스트 프로그램



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



DSP280x-M SPI테스트를 위해 Code Composer Studio에 SPI관련 소스 및 가속도 센서 코드 추가



TMS320F280x SPI블럭도






SPI Mode설정
LIS3LV02제어를 위해서는 SPI Mode0로 설정해야한다. SPICCR, SPICTL레지스터에서 설정할 수 있다.




SPI 설정


SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;   //SPI MODE0

 //SPI 초기화
 SpiaRegs.SPICCR.bit.SPISWRESET = 0;
 SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
 SpiaRegs.SPICCR.bit.SPILBK = 0;  //루프백 비사용
 SpiaRegs.SPICCR.bit.SPICHAR = 7;  //8비트 모드 
 SpiaRegs.SPICCR.bit.SPISWRESET = 1; // Ready to transmit

 SpiaRegs.SPICTL.bit.SPIINTENA = 0; //인터럽트 비사용
 SpiaRegs.SPICTL.bit.TALK = 1;   // Transmit enable
 SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; //SPI마스터 모드
 SpiaRegs.SPICTL.bit.CLK_PHASE = 0;   //SPI MODE0
 SpiaRegs.SPICTL.bit.OVERRUNINTENA = 0; //Overrun interrupt disable

 SpiaRegs.SPIPRI.bit.FREE = 1;       // Set so breakpoints don't disturb xmission


SPI클럭 속도 설정
SpiaRegs.SPIBRR 레지스터에서 설정 가능하다.

 //SPI 클럭속도 설정
 SPI0_SetSpeed(SPI_SPEED_4MHZ);



 //SPI GPIO초기화
 EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;   // Enable pull-up on GPIO16 (SPISIMOA)
    GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;   // Enable pull-up on GPIO17 (SPISOMIA)
    GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;   // Enable pull-up on GPIO18 (SPICLKA)
    GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;   // Enable pull-up on GPIO19 (SPISTEA)

    GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (SPISOMIA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch input GPIO18 (SPICLKA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SPISTEA)
   
    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
    GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
    GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA
    EDIS;
 
 //SPI FIFO 초기화
    SpiaRegs.SPIFFTX.all=0xE040;
    SpiaRegs.SPIFFRX.all=0x204f;
    SpiaRegs.SPIFFCT.all=0x0;


TMS320F2808 3축 가속도 센서 테스트 소스
void main(void)
{
 short data = 0;
 unsigned int flag = 0;

 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

 DebugInit(BAUD_57600);
 DebugPrint("SPI Test\r\n");

 myAccel3lvInit();
 myAccel3lvWrite(CTRL_REG1, 0xD7);  //1000.0111 Power on, enable all axis, self test off
 myAccel3lvWrite(CTRL_REG2, 0x40);

 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=");
    U0_PutInt(myAccel3lvRead(WHO_AM_I));
    break;

 case 'r':
    GetAccelValue(AXIS_X, &data);
    U0_PutInt(data);  
    break;
}
}
Posted by nexp

댓글을 달아 주세요