[MCU]/CANTUS2011. 4. 10. 21:13

[CANTUS EVM] 이더넷을 이용한 전자액자 테스트

[CANTUS EVM] 이더넷을 이용한 전자액자 테스트



CANTUS와 W5100을 이용하여 이더넷 전자 액자를 만들어 보았다. 이더넷을 이용하면 속도도 빠르고 네트웍으로 제어 할 수 있기 때문에 여러가지 이점이 많다. 일단 네트웍으로 기본 이미지 전송하고 LCD에 표시하는 간단한 예제를 작성해 보았다.

LCD_EXP_EVM 보드 를 이용하면 TFT-LCD및 W5100연결이 가능하다.



W5100모듈을 뒷면에 연결할 수있다.





CANTUS, W5100을이용한 이더넷 전자액자 테스트 동영상
UDP로 접속하여 이미지 데이터를 고속으로 전송하고 TFT LCD에 출력하도록 했다.




USB 전송과비교해 보면 두배 정도의 차이가 나는것을 확인할 수 있다. W5100을 SPI방식이 아닌 인다이렉트모드로 바꾸면 속도는 훨씬더 빨리질것이다.




이더넷 호스트 프로그램
BMP파일을 열어 16비트 이미지로 변환후 이더넷으로 데이터 전송하는 프로그램




Posted by nexp

댓글을 달아 주세요

[MCU]/CANTUS2011. 4. 10. 21:11

[CANTUS EVM] W5100 TCP Server 이더넷 전송속도 테스트

[CANTUS EVM] W5100 TCP Server 이더넷 전송속도 테스트


이더넷 테스에는 램이 많이 필요한데 저렴한 가격에 넉넉한 80Kbyte램을 가진 CANTUS가 적격이다. 그래서 Hardware TCP/IP W5100을 테스트 해 보았다.

일단 간단히 SPI방식으로 연결하여 TCP서버의 전송 속도를 테스트 해보았다.
대략 600Kbps까지 나온다. W5100 SPI의 최대 속도 인것같다.




W5100 을위한 드라이버 코스만 수정하면 기존 코드를 그대로 이용할 수 있다.
[NET-EVM] 보드의 W5100을 위한 CS포트는 P4.5에 연결되어 있다.
#define _SPI0_ENABLE     1

//-----------------------------------------------------------------------------
// W5100 HAL
#define W5100_CS_PORT     
#define W5100_CS_BIT     BIT5

#define W5100_IO_INIT()     Sbi(*R_PAF4, (3<<(2*5)));Sbi(*R_P4oDIR, W5100_CS_BIT)

#define IINCHIP_CSoff()     Sbi(*R_P4oLOW, W5100_CS_BIT)
#define IINCHIP_CSon()     Sbi(*R_P4oHIGH, W5100_CS_BIT)

#define IINCHIP_SPI_INIT()    SPI0_Init()
//#define IINCHIP_SpiSendData    SPI0_WriteByte
#define IINCHIP_SpiSendData    SPI0_WriteReadByte
#define IINCHIP_SpiRecvData    SPI0_WriteReadByte
//-----------------------------------------------------------------------------



CANTUS W5100 TCP테스트 소스코드
Posted by nexp

댓글을 달아 주세요

[MCU]/CANTUS2011. 4. 10. 20:59

[CANTUS EVM] SPI테스트 - SPI 가속도 센서 테스트

[CANTUS EVM] SPI테스트 - SPI 가속도 센서 테스트



CANTUS의  SPI구조는 아래 그림과 같고 특징적으로는 8Byte FIFO가 있다.



CANTUS SPI테스트를 위해 [NET-EVM]보드의 가속도 센서를 테스트 해 보았다.
가속도센서의 SPI CS핀은 P5.2에 연결되어 있다.



ADChip사에서 제공하는 드라이버코드는 여러기능을 위해 작성되어 있기 때문에 속도 면이나 기존 코드를 위해 그냥 사용하기는 힘들다. 데이터시트보고 로레벨로 작성해 보았다.
SUINT SPI0_WriteReadByte(SUINT Data)
{
 //SPI포트로 데이터 출력 
 *R_SPI0DATA = Data;
 
 // 전송대기
 while (!(*R_SPI0STAT & SPISTAT_SPIF));
 
 //데이터 수신
 return *R_SPI0DATA;
}


CANTUS SPI모드 설정



CANTUS SPI테스트 동영상




CANTUS SPI 테스트 코드
#include "system.h"
#include "serial.h"
#include "myAccel.h"

int main()
{
 short data;
 
 SystemInit();

 Led1Init();
 Led1On();

 U0_Init(BAUD_115200);
 DebugPrint("CANTUS SPI - Accel LIS3LV02 Test\r\n");

 //가속도 센서 초기화
 myAccel3lvInit();
 myAccel3lvWrite(CTRL_REG1, 0xC7);
 
 while(1)
 {
  if(U0_IsGetByte())
  {
   switch(U0_GetByte())
   {
    case '0':
     DebugPrint("Led1 Off\r\n");
     Led1Off();
     break;

    case '1':
     DebugPrint("Led1 On\r\n");     
     Led1On();
    break;
    
    case 'i':
     myAccel3lvWrite(CTRL_REG1, 0xC7);  //1000.0111 Power on, enable all axis, self test off
     DebugPrint("Accel Init\r\n");
     break;   

    case 'r':
     data = myAccel3lvRead(WHO_AM_I);

     DebugPrint("Who am I? 0x%02X\r\n", data);  
     break; 
     
    case 'x':
     GetAccelValue(AXIS_X, &data);

     DebugPrint("%d\r\n", data);  
     break; 
   }
  }
Posted by nexp

댓글을 달아 주세요

[MCU]/CANTUS2011. 4. 3. 03:04

[CANTUS EVM] TFT LCD제어

[CANTUS EVM] TFT LCD제어



[LCD-EXP EVM]
보드를 이용하여 CANTUS로 COM26T2844 TFT LCD를 제어 해 보려고 한다.
환경설정이 달라지면서 여러가지 문제점이 많다. 기존 소스를 포팅하니 오류가 많이 뜬다.
-> 문제는 디렉토리 설정에서 현재 자신의 프로젝트를 가리키는 설정에 문제가 있었다.
-> 그냥 "." 기입하면 자신의 디렉토리가 설정된다.



CANTUS의  GPIO 출력 레지스터는 일반 MCU와 달리  Low, High를 PxOHIGH, PxOLOW에 각각 따로 설정해야 한다. 특히 LCD와 같이 데이터를 포트제어로 해야 할때 문제가 있다. 두번 제어 해야 하므로 속도도 문제가 되고...

아무튼 기존 다른 MCU에서 사용했던 코드를 포팅 했는데.. TFT LCD가 정상 동작 하지 않는다.
왜 이렇게 만들었을까?

#define _LCD_DAT_OUT(Data)    *R_P0oLOW=0xFF;*R_P0oHIGH = (Data&0xFF);\
                                                          *R_P1oLOW=0xFF;*R_P1oHIGH = ((Data>>8)&0xFF);


스코프로 하나씩 찍어보자..
-> 문제는 /RD 쪽 포트 설정에 문제였던것 같다.
//-----------------------------------------------------------------------------
// TFT LCD Driver
#define TFT_DRV_HD66791     0
#define TFT_DRV_COM44     1

#define LCD_LAT_BIT      
#define LCD_LAT_PORT     
#define LCD_LAT_ON()     
#define LCD_LAT_OFF()     
#define LCD_DATA_LATCH()    LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT      BIT5
#define LCD_EN_PORT      
#define LCD_ENABLE()     Sbi(*R_P5oLOW, LCD_EN_BIT)
#define LCD_DISABLE()     Sbi(*R_P5oHIGH, LCD_EN_BIT)

#define LCD_RST_BIT      BIT6
#define LCD_RST_PORT     
#define LCD_RST_OFF()     Sbi(*R_P2oLOW, LCD_RST_BIT)
#define LCD_RST_ON()     Sbi(*R_P2oHIGH, LCD_RST_BIT)

#define LCD_RS_BIT      BIT7
#define LCD_RS_PORT      
#define LCD_RS_OFF()     Sbi(*R_P2oLOW, LCD_RS_BIT)
#define LCD_RS_ON()      Sbi(*R_P2oHIGH, LCD_RS_BIT)

#define LCD_WR_BIT      BIT3
#define LCD_WR_PORT      
#define LCD_WR_OFF()     Sbi(*R_P2oLOW, LCD_WR_BIT)
#define LCD_WR_ON()      Sbi(*R_P2oHIGH, LCD_WR_BIT)

#define LCD_RD_BIT      BIT2
#define LCD_RD_PORT      
#define LCD_RD_OFF()     Sbi(*R_P2oLOW, LCD_RD_BIT)
#define LCD_RD_ON()      Sbi(*R_P2oHIGH, LCD_RD_BIT)

#define LCD_BL_BIT      BIT4
#define LCD_BL_PORT      
#define LCD_BL_OFF()     Sbi(*R_P5oLOW, LCD_BL_BIT)
#define LCD_BL_ON()      Sbi(*R_P5oHIGH, LCD_BL_BIT)

#define _LCD_DAT_OUT(Data)    *R_P0oLOW=0xFF;*R_P0oHIGH = (Data&0xFF);\
          LCD_DATA_LATCH();\
          *R_P1oLOW=0xFF;*R_P1oHIGH = ((Data>>8)&0xFF);

#define TFTGpioInit()     Sbi(*R_PAF5, (3<<4));Sbi(*R_PAF5, (3<<5));*R_P0oDIR = 0xFF;\
          *R_P1oDIR = 0xFF;\
          *R_P2oDIR = 0xFF;\
          *R_P5oDIR = 0xFF;


이제 정상 동작한다.
그런제 JTAG다운로드가 너무 느리다. 80Kbyte의 간단한 이미지를 다운하는데 1분가까이 걸린다. 이건뭐... 시리얼보다 느리니.. 개발하지 말라는건지...

일단 LCD출력속도를 한번 테스트 해 보았다.

LCD_EXP_EVM 를 이용한 속도 테스트 결과와 비교해 볼 수 있다.




SD에 저장해서 출력하는 방식을 취해보았다. 잘 동작한다.



CANTUS 512 SD Card사용 TFT LCD테스트 동영상

 



Posted by nexp

댓글을 달아 주세요

[MCU]/CANTUS2011. 4. 3. 01:30

[CANTUS EVM] SD Card 테스트

[CANTUS EVM] SD Card 테스트



CANTUS 는 SDIO를 지원하므로 SD Card를 고속으로 접근할 수 있다. [CANTUS EVN]보드 뒷면에는 T-Flash를 연결할 수 있도록 해서 SDIO를 테스트 해 볼 수 있다.

[CANTUS EVM] SD Card 회로도





CANTUS개발환경의에는 SD Card제어를위한 라이버러리를 제공기 때문에 쉽게 테스트 가능하다.
#include "system.h"
#include "serial.h"

unsigned int scan_files (char* path)
{
 unsigned int file_cnt = 0;
    FRESULT res;
    FILINFO fno;
    DIR dir;
    int i;
    char *fn;
 
#if _USE_LFN
    static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1];
    fno.lfname = lfn;
    fno.lfsize = sizeof(lfn);
#endif

 DebugPrint("Open..");
    res = f_opendir(&dir, path);
 
    if (res == FR_OK) {
        i = strlen(path);
  DebugPrint("OK.");
        for (;;) {
            res = f_readdir(&dir, &fno);
            if (res != FR_OK || fno.fname[0] == 0) break;
#if _USE_LFN
            fn = *fno.lfname ? fno.lfname : fno.fname;
#else
            fn = fno.fname;
#endif
            if (fno.fattrib & AM_DIR) {
                DebugPrint("[D]%s\r\n",fn);
            } else {
                DebugPrint("%s/%s : \t\t %dbyte\r\n", path, fn,fno.fsize);
            }
        }
    }
 else{
  DebugPrint("path(%s) not found:Error(%d)\r\n",path,res);
  
 }
 
    return file_cnt;
}

int main()
{
 FATFS fs;
 int file_cnt;
 
 SystemInit();
 
 DebugInit(BAUD_115200);
 DebugPrint("CANTUS SD Card Test3\r\n");
  
 DebugPrint("System Clock(%dMhz)\r\n",GetAHBclock()/1000000); 

 Led1Init();
 Led1On();

 DebugPrint("Mount..."); 
 if(f_mount(DRIVE_SDCARD,&fs) != FR_OK)
 {
  DebugPrint("Error");
  while(1);
 }
 else DebugPrint("OK\r\n");
 
 DebugPrint("File Search:\r\n");
 
 file_cnt = scan_files("1:");
 DebugPrint("file count:%d\r\n", file_cnt);
 while(1);

 return 1;
}




CANTUS SD Card테스트 결과
SD Memory Card
Identification Mode Start
the mandatory maximum operating frequency of SD Memory Card : 25Mhz
SD Memory Size : 485Mbyte ,Blocksize:512byte
SD CARD Initialize Completed
SDCard operating frequency:18800640
OK.
File Search:
1:/a_3.bmp :    192054byte
1:/a_12.bmp :    192054byte
1:/img1.bmp :    192054byte
1:/img2.bmp :    192054byte
file count : 4
Posted by nexp

댓글을 달아 주세요