[W7100 EVM] TFT LCD 테스트 - [LCD-IF MODULE] 이용 속도 테스트



[W7100 EVM]모듈에서 [LCD-IF MODULE]을 이용하여 TFT LCD를 테스트 해 보았다. iMCU W7100은 이더넷 전송 속도가 빠르기 때문에 ([W7100   EVM] 이더넷 전송 속도테스트] ), 이더넷으로 TFT-LCD 이미지 전송 테스트를 해보려고 한다.

더보기



LCD-IF MODULE]에 20핀 커넥터를 연결하고 드라이버 코드 수정하여 테스트 했다. 



테스트 결과 이더넷 전송 속도는 아주 빠르지만 TFT LCD에 이미지 한장 출력하는 속도는 아주 느리다. 8051의 패리속도 한계로 다이렉트로 제어하는것은 좀 무리 일듯하고 CPLD나 FPGA 연결해서 이더넷에서 데이터만 전송 해 주는 형태로 바꾸어야 할듯...




W7100 TFT LCD 제어 Driver 코드
#define TFT_DRV_HD66791                 0
#define TFT_DRV_COM44                   1

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

#define LCD_EN_BIT      BIT6
#define LCD_EN_PORT      P2
#define LCD_ENABLE()     Cbi(LCD_EN_PORT, LCD_EN_BIT)
#define LCD_DISABLE()     Sbi(LCD_EN_PORT, LCD_EN_BIT)

#define LCD_RST_BIT      //BIT8
#define LCD_RST_PORT     //PORTB
#define LCD_RST_ON()     //Sbi(LCD_RST_PORT, LCD_RST_BIT)
#define LCD_RST_OFF()     //Cbi(LCD_RST_PORT, LCD_RST_BIT)

#define LCD_RS_BIT      BIT5
#define LCD_RS_PORT      P2
#define LCD_RS_OFF()     Cbi(LCD_RS_PORT, LCD_RS_BIT)
#define LCD_RS_ON()      Sbi(LCD_RS_PORT, LCD_RS_BIT)

#define LCD_WR_BIT      BIT4
#define LCD_WR_PORT      P2
#define LCD_WR_OFF()     Cbi(LCD_WR_PORT, LCD_WR_BIT)
#define LCD_WR_ON()      Sbi(LCD_WR_PORT, LCD_WR_BIT)

#define LCD_RD_BIT      ///BIT9
#define LCD_RD_PORT      //PORTB
#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      BIT7
#define LCD_BL_PORT      P2
#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)    P0 = (Data>>8);\
                                     LCD_DATA_LATCH();\
                                     P0 = (Data&0xFF);

#define TFTGpioInit() 


[W7100 EVM] TFT LCD 출력 속도 테스트 동영상

[W7100 EVM] UDP 테스트

[INTERFACE]/iMCU_W7100 | 2010.11.23 23:35
Posted by nexp
[W7100 EVM] UDP 테스트



UDP는 신뢰성을 보장하지 않는 대신 커넥션이 필요 없으므로 속도가 빠르고 간단하게 제어 할수 있다. 접속필요 없이 IP와 포트를 알고 있으면 바로 데이터를 보낼 수 있다.

UDP처리를 간단히 코드로 나타내면 아래와 같이 된다.
//UDP처리
void ProcessUDP(void)
{
//소켓번호
int s = SOCK_UDP;
//포트번호
int port = 3000;

 switch (getSn_SR())
 {
//연결되어 데이터를 수신하게 되면
 case SOCK_UDP:
  //UDP 데이터전송되면
    len = recvfrom(s, data_buf, len, (uint8*)gDestip, &dDestport);
   

   // 처리 한다.
   EthernetTest(data_buf, len);
  break;

 //연결종료
 case SOCK_CLOSED:
  close(s);
  socket(s,Sn_MR_UDP,port,0);  
   break;
}


UDP 호스트 프로그램은 예전에 작성했던  초간단 VB UDP 테스트 프로그램  테스트 했다.
udp_host.zip



W7100 UDP 테스트 코드
void main()
{
 unsigned int cnt = 0;
 unsigned char buffer[32]; 
 
 SystemInit();  //Initialize iMCU

 init_iMCU();
 
 Led1Init(); Led1On();
 Led2Init(); Led2Off();

 U0_Init(BAUD_115200);
 U0_PutStr("iMCU Serial Test\r\n");

 Init_Network();  // Initialize   Network Configuration
 
 Sw1Init();
 
 while(1)
 {
  ProcessUDP();

  //스위치 처리
  if(GetSw1())
  {
   sw_flag ^= 1;
   if(sw_flag == 1)Led2On();
   else Led2Off();

   sprintf(buffer, "cnt%d\r\n", cnt++);
   printf(buffer);
   
   //UDP로 데이터 전송
   sendto(0,buffer, strlen(buffer), (uint8*)gDestip, gDestport);
   
   Cbi(EIF, BIT1);
   Delay(100);
  }
 }



iMCU W7100 UDP 테스트 동영상
W7100 EVM보드상의 스위치를 누르면  누른 카운트값을 UDP로 전송하는 예제. PC프로그램에서 UDP로 데이터 전송하여 LED On/Off.
TAG iMCU, udp, W7100
[W7100 EVM] 외부 인터럽트 테스트  - 스위치 제어 예제


W7100 EVM 보드에서 스위치는 INT3에 연결되어 있다.
INT3은 인터럽트 소스 이고 GPIO로 접근할수 없다. EIF레지스터에서 인터럽트 플래그를 체크해서 확인할수 있다. 물론 이때는 인터럽트를 Enable해야 하고 확인후 플래그를 클리어 해야 한다.



EIF 레지스터
인터럽트 확인할 수 있는 레지스터로 확인후 클리어 해야 한다.



EIE레지스터
인터럽트 Enable설정 레지스터이다.



참고로 Keil에서 레지스터 비트 정의로 아래와 같이 설정하면
sbit EIF1  = EIF^0;

에러가 발생하는데...  메뉴얼을 살표 보니 P1과 같이 레지스터가 8bit로 구성되어 있으면 문제가 없는데 EIF와 같이 4bit로 되어 있다면 정의가 안된다고 한다.
그냥 Cbi, Sbi이용하면 된다고 한다.


config.h 파일에 Switch Driver 작성하자.
//Switch Driver
#define Sw1Init()     EINT3 = 1;
#define GetSw1()     (EIF&BIT1)
#define Sw1Reset()  Cbi(EIF, BIT1);



W7100 스위치 테스트 프로그램
폴링모드

void main()
{
 unsigned char sw_flag = 0;
 
 SystemInit();  //Initialize iMCU
 
 Led1Init(); Led1On();
 Led2Init(); Led2Off();

 U0_Init(BAUD_115200);
 U0_PutStr("iMCU Serial Test\r\n");

 Sw1Init();
 
 while(1)
 {
  //스위치 처리
  if(GetSw1())
  {
   Sw1Reset();
   sw_flag ^= 1;
   if(sw_flag == 1)Led2On();
   else Led2Off();

   Delay(100);
  }
 }




인터럽트를 사용할 경우
void int_test(void) interrupt 9//Timer1 interrupt
{
     disable();
     Sw1Reset();

     sw_flag ^= 1;

    if(sw_flag == 1)Led2On();
    else  Led2Off();

     counter++;
     enalbe();
}
TAG W7100
[W7100 EVM] 예제프로그램 - 초간단 TCP Server를 이용한 보드 제어
이더넷 전송 제어의 가장 기본인 TCP 프로토콜을 이용한 테스트를 해보자. TCP 는 서버모드와, 클라이언트모드가 있는데 서버모드는 클라이언트의 연결을 기다리고 있다 요청이 들어오면 연결되어 통신이 이루어진다.

W7100이  TCP Server모드로 동작하기 위한 대략적인 흐름을 보면 Socket를 OPEN하고 클라이언트의 요청을 기다린다(Listen). 연결이 되면 데이터 송수신하고(ESTABLISEH) 연결을 종료 하기위해 CLOSE 하면 된다.



TCP Server를 간단히 코드로 나타내면 아래와 같이 된다.
//TCP-Server 처리
void ProcessTcpSever(void)
{
//소켓번호
int s = SOCK_TCPS;
//포트번호
int port = 5000;

 switch (getSn_SR())
 {
//소켓 초기화 시
 case SOCK_INIT:
    listen(s);
     break;


//연결되어 데이터를 수신하게 되면
 case SOCK_ESTABLISHED:
   //데이터 받아서 
   len = recv(s, data_buf, len);   
   
   // 처리 한다.
   EthernetTest(data_buf, len);
  break;

//연결 종료 요청을 받을때  
 case SOCK_CLOSE_WAIT:                             
  disconnect(s);
  break;
 
 //연결종료
 case SOCK_CLOSED:
  close(s);
  socket(s, Sn_MR_TCP,port,0x00);
   break;
}


TCP클라이언트로 데이터가 수신되면 처리 하는 함수로 테스트 예제로 이번 예제에서 첫번째 데이터로 LED를 제어하고 있다. ->이부분을 원하는 형태로 수정하면 된다.
//수신데이터 처리
void EthernetTest(unsigned char *pRcvBuffer, unsigned int len)
{
 unsigned int i;

 DebugPrint("Read Data[%d]\r\n", len);
 
 for(i=0;i<len;i++)
 {
  //수신데이터 표시
  DebugPrint("%c ", pRcvBuffer[i]);
 }

 //데이터 처리 - LED제어
 if(pRcvBuffer[0] == '1')
 {
  Led1On();
 }
 else if(pRcvBuffer[0] == '0')
 {
  Led1Off();
 }
}


W7100 TCP 서버 테스트
실행파일



보드가 서버로 동작하기 때문에 PC프로그램은 Client로 접속에서 데이터 전송할 수 있다. 예제에서는보드 IP인 192.168.0.104로 접속 가능하다.



W7100 TCP 테스트 동영상
TAG iMCU, W7100
[iMCU W7100 EVM]  TCP/IP 테스트 -  간단한 임베디드 웹서버 테스트


W7100은 64kbyte 코드 영역외 256kbyte의 데이터 영역 flash를 내장하고 있어 외부 메모리 없이 간단한 웹서버 제작에 상당히 용이하다. MCU하나에 간단한 이더넷 처리하는 어플리케이션으로 최적이지 않을까...

그래서 간단히 웹서버를 올려서 테스트 해 보았다. 기존 LM3S8962 EVM에서 테스트한 웹페이지를 수정하여 테스트 해보았다.
코드는 간단하며 하드웨어 TCP/IP이므로 포트는 미리 열어 두어야 한다. 4개 정도를열어 두면 크게 문제 없다. 참고로 IE에서 웹페이지 요청할때 파일이나 이미지가 많으면 동시에 여러개의 포트를 열어서 요청하므로 포트가 부족하거나 빠른 처리가 되지 않는다면 무시될 수 있다. 소프트웨어 TCP/IP일 경우 메모리만 충분하다면 포트는 무한정 열수 있지만 하드웨어 TCP/IP일 경우 미리 여러 두어야 한다.
void main()
{
 unsigned int cnt = 0;
 SystemInit();  //Initialize iMCU

 init_iMCU();
 Led1Init();
 Led1On();
 Led2Init();
 Led2Off();

 U0_Init(BAUD_115200);
 U0_PutStr("iMCU Serial Test\r\n");
 printf("Start\r\n");

 NetInit();  // Initialize   Network Configuration
 DisplayConfig();
 
 RomFileTest();

 while(1)
 {
  ProcessWebSever(3);
  ProcessWebSever(4);
  ProcessWebSever(5);
  ProcessWebSever(6);
 }


W7100 웹서버 테스트 동영상
웹페이지 접속하면 메인 이미지 출력하고 LED제어 화면에서 간단히 LED제어 하는 예제이다. 포트 4개 열었는데 로딩 속도도 나쁘지않고 동시여러 파일 로딩이 되는것을 확인 할 수 있다.



참고로 LM3S8962 WebServer 테스트 동영상과 비교해 보면  이미지 로딩 속도가  큰 차이가 없음을 확인할 수 있다.


[iMCU W7100 EVM] TCP/IP 테스트 (TCP 전송 속도 테스트)



W7100은 W5100코어가 포함되어 있기 때문에 기존 하드웨어 독립적으로 작성한 예제를 이용하면 수정없이 사용가능하다.
일단 이더넷 속도 테스를위해 루프백(수신 데이터를 그대로 전송) 테스트를 해 보았다.


TCP 서버 데이터 처리
ProcessTcpSever() 함수에서 TCP 시퀀스를 폴링으로 처리 한다.
소켓의 상태를 검사 하다 데이터가 수신되면 recv()함수로 수신된 바이트를 읽어오면 된다.
//TCP-Server 처리
void ProcessTcpSever(void)
{
 int len;      
 unsigned char data_buf[TX_RX_MAX_BUF_SIZE];
 unsigned int port = MY_LISTEN_PORT;
 
 switch (getSn_SR(SOCK_TCPS))
 {
 case SOCK_ESTABLISHED:
  //데이터 수신 검사
  if((len = getSn_RX_RSR(SOCK_TCPS)) > 0)   
  {
   //if Rx data size is lager than TX_RX_MAX_BUF_SIZE
   if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE;
  
   //데이터 수신
   len = recv(SOCK_TCPS, data_buf, len);  
  
   send the received data
   send(SOCK_MYTEST, data_buf, len);
   } 
  break;
 
 case SOCK_CLOSE_WAIT:                            
  //If the client request to close
  disconnect(SOCK_TCPS);
 
  m_SokStatus1 = 0;
  break;
 
 case SOCK_CLOSED:
  if(!m_SokStatus1)
  {
   m_SokStatus1 = 1;
  }
 
  //reinitialize the socket
  if(socket(SOCK_TCPS,Sn_MR_TCP, port,0x00) == 0)
  {
   DebugPrint("Fail to create socket.");
   m_SokStatus1 = 0;
  }
  else
  {
   listen(SOCK_TCPS);
  }
  break;
 }
}




테스트로 3.4M byte 이미지 데이터 연속적으로 전송하고 송수신 시간을 측정해 보았다.
5.4Mps가 나오다. 0.5초만에 이미지 전송이 가능하다. [AVR-Mega128  EVM 이더넷 전송 속도테스트] 와 비교해 보면 알수 있듯이 16Mhz AVR보다 빠른 전송 속도가 나온다. 요즘 AVR 가격이 많이 올라 소매가 9000원 정도 한다. MCU+W5100이 포함된 W7100이 소매가 6500원에 판매 되니 가격대 성능비로는 나쁘지 않은것 같다. (물론 단점도 만이 있지만...)
TAG iMCU, TCP/IP, W7100
[W7100 EVM] 예제프로그램 작성 - TCP/IP 테스트 (Ping테스트)

W7100은 8051코어에 W5100코어가 내장되어 있는 MCU이므로 기존 W5100코드를 이용하면 크게 수정없이 사용 가능하다. (물론 Wiznet에서 제공하는 코드는 호환성이 좀 떨어지므로 레이어를 두어 수정을 좀 했다.)


네트웍 초기화
MAC Address는 고유하 번호를 할당받아야 하지만 테스트용으로 충돌 나지 않는 할당하면 된다.
보드의 IP역시 충돌나지 않는 값으로 설정하면되지만 공유기를 사용하는 경우 자동 할당번호 내의 값으로 설정해야 한다.
#define MY_NET_MAC   {0x00, 0x08, 0xdc, 0x00, 0x00, 0x00} // MY Mac Address : 00.08.DC.00.00.00

#define MY_NET_GWIP   {192,  168, 0,    1} //Gateway     : 192.168.0.1
#define MY_SOURCEIP   {192,  168, 0,  104} //보드 IP     : 192.168.0.104
#define MY_SUBNET   {255, 255, 255,   0}


NetInit() 함수에서 초기화를 하면 (MAC, IP, GW..레지스트에 값을 기입하면) 하드웨어 적으로 Ping리퀘스트를 해준다.
Keil Project에는 01_drv/iinchip 폴더에 있는 TCPIPCore.c, socket.c, wizmemcpy.c 파일을 추가 해 주면 TCP/IP처리는 쉽게 된다.



W7100 Ping 테스트 예제코드
코드 자체는 상당히 간단하다. MAC, IP, GW레지스터에 데이터를 셋팅하면 ping이 자동으로 처리된다.
void main()
{
 unsigned int cnt = 0;
 SystemInit();  //Initialize iMCU

 init_iMCU();
 Led1Init();
 Led1On();
 Led2Init();
 Led2Off();

 U0_Init(BAUD_115200);
 U0_PutStr("iMCU Serial Test\r\n");
 printf("Start\r\n");

 NetInit();  // Initialize   Network Configuration
 
 while(1)
 {
  }


W5100 ping테스트

TAG iMCU, W7100
[W7100 EVM] 예제프로그램 작성 - UART 제어 (printf 를 이용한 디버깅)




8051에서 UART제어를 위한 보레이트 설정 모드는 Mode0~3의 4가지가 있다.

더보기






Keil 에서 printf를 사용하기위해서는 putchar()함수를 재 정의해 주어야 한다. serial.c 에 아래 함수들 추가하면 된다.
char putchar (char c) 
{
  // Write data into serial-buffer.
 SBUF = c;
 // Wait till data recording is finished.
 while(!TI);
 TI = 0;
 return c;
}


W7100 UART테스트 예제 코드
void main()
{
 unsigned int cnt = 0;
 SystemInit();  //Initialize iMCU

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

//시리얼 포트 초기화
 U0_Init(BAUD_115200);
 U0_PutStr("iMCU Serial Test\r\n");

 while(1)
 {
   switch(DebugGetByte())
   {
    case '1':
     Led1On();
     printf("LED1 On %d\r\n", cnt++);
     break;
    
    case '0':
     Led1Off();
     printf("LED1 Off\r\n");
     break;
   }
 }
}




* 8051에서 printf 사용시 주의 사항
unsigned char 형 데이터를 출력하면 이상하게 출력된다. (unsigned) int형으로 캐스팅 해 주어야  정상동작한다.

TAG printf, W7100

[W7100 EVM] 개발환경 설정

[INTERFACE]/iMCU_W7100 | 2010.11.20 22:50
Posted by nexp
[iMCU W7100 EVM] 개발환경 설정

W7100은 ISP를 지원하기 때문에 간단히 별도의 장비 없이 UART나 이더넷으로 프로그램 할수 있다.
BOOT핀을 Low로 하고 리셋하면 부트모드로 설정되고 ISP프로그램을 이용하여 시리얼 포트로 다운로드 가능하다.
(아래 그림은 부트모드 설정시)



UART는 USB2UART를 이용하고 WizISP프로그램을 이용하여 다운로드 해 보았다.  Veryfy옵션을 제거 하면 상당히 빠르게 다운로드 되는것 같다.





W7100 개발환경
8051코어 MCU이므로 8051 컴파일러를 이용하면 됩다. 쉽게 구할수 있는 Keil 을 이용하여 테스트 해 보았다.
기존 타사 MCU관련 예제들과 호한되도록 하기위해 제공되는 코드구조를 좀 수정하여 내가 사용하는 형태로 변경하여 테스트를 진행했다. 아무래도 추후 업데이트나 관리면에서 유연하게 작성할 수 있다.
기본적으로 자주 사용되고 하드웨어 의존적인 부분은 01_drv폴더에 두고 최대한 하드웨어 독립적으로 프로그램을 작성할 예정이다.



Keil을 실행하고 새로운 프로젝트를 생성한다.



타겟은 일반 8052로 설정하면 된다.



프로젝트 옵션을 설정한다.



Statrup코드는 WIZNET에서 제공하는 파일을 설정하면된다.




옵션에서 특별한것은 없고 Memory Model을 XDATA를 사용할수 있도록 해준다. W5100은 코드 영역과 데이터 영역이 별도로 존제하고 데이터 영역은 XDATA로 접근할 수 있다.




그리고 C에서 ASM키워드를 사용하는 루틴이 있다면 옵션에서 Assemble SRC File옵션을 설정해 주어야 한다.


ASM을 사용하는 파일은(System.c)  아래 그림과 같이 설정된다.



그리고 include패스는 아래와 같이 설정한다.




프로젝트 생성 되었다면 코드를 작성하고 컴파일하면 에러없이 잘 컴파일 되는것을 확인할 수 있다.
이 프로젝트는 기본틀로 앞으로 다른 예제들은 이 프로젝트를 복사해서 사용하면 된다.
TAG iMCU, W7100
[W7100 EVM] iMCU 테스트 보드 제작 (8051+MAC+Phy+HW TCP/IP 원칩)


iMCU W7100은 hardwired TCP/IP Core 를 내장하고 8051코어가 내장되어 있는 one-chip 인터넷 솔루션 이다. 256KByte Data Flash, 64K Code Flash, 64Kbyte RAM으로 구성된 메모리는 별도의 확장 필요없이 간단한 웹서버를 구현하기에 아주 적합한 솔루션을 제공할것 같다.

내부에 부트로더가 있어 별도의 장비 없이 UART나 이더넷으로 프로그램을 다운로드 할 수 있다. 가격도 저렴(IC Bank에서 6500원에 판매하고 있다.)하니 간단히 임베디드 웹서버 공부하는데 사용하면 좋을것 같다.

데이트시트


회로도

예제소스




[M-Type EVM]  으로 표준핀맵에 맞추어 모든 핀을 빼두었고 서포트로 고정 가능하다.



소형으로 제작하다 보니 스위치 및 LED는 윗면에 배치하고 뒷면으로 W7100을 실장하도록 했다.



확장 테스트 보드





W7100 테스트 동영상
LED테스트



웹서버 테스트








블로그 이미지

nexp

카테고리

분류 전체보기 (1560)
[MyProject] (48)
[TI] (75)
[NXP] (51)
[ST_MICRO] (129)
[FreeScale] (31)
[MSP430] (140)
[Microchip] (131)
Cortex-M (36)
[ATMEL] (29)
[AnalogDevice] (22)
[Embedded] (2)
ARM9 (24)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (50)
[INTERFACE] (213)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (129)
[SENSOR] (41)
[DATA] (21)
[FPGA] (32)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)