[AT90USB EVM] FTP Client 테스트 - USB메모리 스틱의 mp3파일 전송하기

 

 

이더넷을 이용하여 FTP Client 테스트를 진행했다.

AT90USB1287은 USB호스트를 지원하므로 USB메모리스틱의 파일을 읽어 FTP로 전송 가능하다.

FTP 서버 접속을 위한 이더넷 처리는 W5100에서 한다. 원격지의 임베디드 보드에서 FTP서버로 접속해 파일을 송수신 할수 있다.

 

 

 

AT90USB1287 FTP Client 테스트 동영상

FTP Server( ALFTP)에 접속해서 특정 이벤트에 따라 USB메모리 스틱의 mp3파일을 전송하는 테스트

 

 

 

 


 

FTP 서버모드로 실행

알FTP를 실행하고 서버 모드로 실행한다.

서버 디렉토리는 디폴트 디렉토리 ALFtpServer 로 설정되어 있다.

 

 

 

 

 

IP및  ID, PASS 설정
서버로 사용할 IP설정 - PC의 IP이다.

 

 

보드쪽에서는 main.h 에 설정 되어 있다.

#define FTP_SERVER_PORT     {192,168,0,7} 

 

 

ID : admin, PASS: 1234
보드쪽 펌웨어 main.c에서 아래 코드로 설정되어 있다.
 
 switch (resp)
  {
  case 220:
   //ID설정
   fsprintf(CTRL_SOCK, "USER %s\r\n", "admin");
   resp = getresp(CTRL_SOCK, 200);
   break;
   
  case 331:
   //Password
   fsprintf(CTRL_SOCK, "PASS %s\r\n", "1234");
   resp = getresp(CTRL_SOCK, 200);
   break;

 

 

 

 

 

FTP Client 접속

서버 실행하면 보드쪽에서 자동으로 FTP서버로 접속을 시도 한다.
 
! 192.168.0.104 connected
< 192.168.0.104 USER admin
> 192.168.0.104 331 Password required for admin.
< 192.168.0.104 PASS 1234
! 192.168.0.104 User 'admin' is authenticated
> 192.168.0.104 230 User admin logged in.

 

 

 

 

 

 

FTP서버로 파일 전송
보드의 스위치 1번을 누르면 USB 메모리 스틱에 있는 mp3파일을 읽어서 FTP서버로 전송한다.
  

 

 

< 192.168.0.104 PORT 192,168,0,104,15,162
> 192.168.0.104 200 Port command successful.
 
< 192.168.0.104 STOR test.mp3
> 192.168.0.104 150 Opening data connection for test.mp3.
> 192.168.0.104 226 File received ok

 

알FTP에서는 파일 전송 완료후  F5를 누르면 업데이트된 파일을 볼수 있다.

 

 

 

 

 

 

 

 

[ AT90USB1287-EX] MP3(VS1033) 모듈 테스트




[AT90USB1287-EX] 보드는 VS1033 MP3모듈 을 연결할 수 있어 USB메모리 스틱의 MP3파일을 출력하거나 이더넷을 이용하여 인터넷 라디오 등을 제작할 수 있다.




[AT90USB1287-EX] VS1033 MP3모듈 드라이버 소스코드
//-----------------------------------------------------------------------------
#define VS_DREQ_BIT      BIT6
#define VS_DREQ_PORT     PORTD

#define VS_CS_BIT      BIT4
#define VS_CS_PORT      PORTD

#define VS_XDCS_BIT      BIT5
#define VS_XDCS_PORT     PORTD

#define VS_RST_BIT      BIT7
#define VS_RST_PORT      PORTD


#define VS1003_CS_H()      Sbi(VS_CS_PORT, VS_CS_BIT)
#define VS1003_CS_L()      Cbi(VS_CS_PORT, VS_CS_BIT)

#define vs1003_enable()      VS1003_CS_L()
#define vs1003_disable()     VS1003_CS_H()


#define VS1003_XDCS_H()      Sbi(VS_XDCS_PORT, VS_XDCS_BIT)
#define VS1003_XDCS_L()      Cbi(VS_XDCS_PORT, VS_XDCS_BIT)


#define VS1003_RESET_H()     Sbi(VS_RST_PORT, VS_RST_BIT)
#define VS1003_RESET_L()     Cbi(VS_RST_PORT, VS_RST_BIT)

#define IsVs1003DataReady()     (PIND&VS_DREQ_BIT)

#define VS_SendByte       SPI0_WriteReadByte
#define VS_InitSpi()      SPI0_Init()
#define VS_SpiSpeed_Low()        SPI0_SetSpeed(SPI_SPEED_1MHZ)
#define VS_SpiSpeed_High()     SPI0_SetSpeed(SPI_SPEED_4MHZ)

#define MP3_PORT_INIT()         Sbi(DDRD, (BIT4|BIT5|BIT7));\
           Sbi(PORTD, BIT6);Cbi(DDRD, BIT6);\
              VS1003_CS_H();VS1003_XDCS_H()


[AT90USB1287] Timer2 테스트

[AVR]/AT90USB | 2012.01.29 10:40
Posted by nexp
[AT90USB1287] Timer2 테스트

AT90USB1287의 타이머 관련 레지스터는 ATMega128과 약간 다른데 드라이버 코드를 수정할 필요가 있다.
//---------------------------------------------------------------------------------------
#define TIMER2_VALUE      (256-115)

volatile unsigned int m_TimerTick = 0;

//---------------------------------------------------------------------------------------
// Timer2
#define TIMER_STOP                         0
#define TIMER2_CLK_DIVCLK                   1
#define TIMER2_CLK_DIV8                     2
#define TIMER2_CLK_DIV32                    3
#define TIMER2_CLK_DIV64                    4
#define TIMER2_CLK_DIV128                   5
#define TIMER2_CLK_DIV512                6
#define TIMER2_CLK_DIV1024                7

#define TIMSK        TIMSK2
#define TIMER2_INT_ENABLE     BIT0
#define Timer2Set(Value)     (TCNT2 = Value)
#define TCCR2        TCCR2B

void Timer2Init(void)
{
    Sbi(TIMSK, TIMER2_INT_ENABLE);
 Sbi(TCCR2, TIMER2_CLK_DIV128);

 //set 1ms
 Timer2Set(TIMER2_VALUE);
}
//---------------------------------------------------------------------------------------



Timer2 인터럽트 핸들러
//---------------------------------------------------------------------------------------
// Timer2 Handler
SIGNAL(TIMER2_OVF_vect)
{
 m_TimerTick++;

 //Led2Toggle();

 //set 1ms
 Timer2Set(TIMER2_VALUE);
}
//---------------------------------------------------------------------------------------



AT90USB1287 Timer 테스트 예제 소스코드
//-----------------------------------------------------------------------------
int main(void)
{
 //시스템 초기화
 SystemInit();
 
 //LED포트 초기화
 Led1Init();
 Led1Off();

 Led2Init();
 Led2Off();

 //UART Init
 DebugInit(BAUD_57600);
 DebugPrint("[AT90USB1287-EX] Test Program - Timer\r\n");

//Timer2초기화
 Timer2Init();
 enable();

 while(1)
 {
  if(m_TimerTick>100)
  {
   
   Led2Toggle();
   m_TimerTick = 0;
  }
 }
}
//-----------------------------------------------------------------------------



[AT90USB1287-EX] 이더넷 테스트 - 초간단 웹서버 만들기




AVR와 W5100을 이용하여 아주 간단한 웹서버를 만들어 보도록 하자.
웹서버는 TCP서버의 일종으로 웹브라우저에서 80번 포트로 접속하면 HTTP프로토콜에 따라 데이터를 송수신 하면 된다.

AVR 초간단 웹서버 테스트 동영상
[AT90USB1287-EX] 보드가 임베디드 웹서버로 동작하고 접속하여 보드의 LED제어하는 간단한 예제를 작성해 보았다.





먼저 접속하면 보여줄 웹페이지를 HTML 코드로 작성해서 변수로 저장해 둔다. 추후 좀더 복잡한 페이지는 USB메모리 스틱이나 SD Card에 저장할 수 있다.




const unsigned char str_http_ok[] = {"HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n"};

const unsigned char str_msg[] = {"HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n\
    <html><head></head><body ><DIV><p align=\"center\"><b><size=\"8\"><br>[AT90USB1287-EX] WebServer - LED Test</font></b></DIV>\
    <HR style=\"COLOR: #3366FF; BACKGROUND-COLOR: #EB9243\"></DIV><div align=\"center\"><p align=\"center\"></p></div>\
    <form name=\"form1\" method=\"get\" action=\"$LED_ON\"><p align=\"center\"><input type=\"submit\" value=\"LED ON\"  name=\"ledo\"></p></form>\
 <p><p></td></tr><tr><td><form name=\"form2\" method=\"get\" action=\"$LED_OF\"><p align=\"center\">\
    <input type=\"submit\" value=\"LED OFF\" name=\"ledn\"></p></form><p></td></tr></table></div></body></html>"};




TCP서버 처리를 위한 함수는 기존과 동일한데 HTTP프로토콜은 디폴트 80번 포트 이므로 80번포트로 소켓을 생성하고 데이터 수신되면 웹페이지를 전송해 주면 된다. 아래 코드와 같이 아주 간단하다.

void ProcessTCPS(unsigned int sock)
{
    unsigned int len;
 unsigned int port = MY_LISTEN_PORT;

 switch (getSn_SR(sock))
 {
  // Socket CLOSED일 경우     
 case SOCK_CLOSED:
  if(!m_SokStatus1)
  {
   DebugPrint("[%d] : Web Server Started.",sock);
   m_SokStatus1 = 1;
  }

  if(socket(sock, Sn_MR_TCP, DEFAULT_HTTP_PORT, 0x00) == 0)
  {
   DebugPrint("\a%d : Fail to create socket.",sock);
   m_SokStatus1 = 0;
  }
  else listen(sock);
 
  break;

case SOCK_ESTABLISHED:
  //수신데이터가 있으면
  if((len = getSn_RX_RSR(sock)) > 0)   
  {
      if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE;
      //데이터 수신
      len = recv(sock, data_buf, len);  
  
     //수신데이터 처리 -> 웹 쿼리 응답
     ProcessWebpage(sock, data_buf);    
  } 
  break;

 case SOCK_CLOSE_WAIT:                            
  //If the client request to close
  disconnect(sock);
 
  m_SokStatus1 = 0;
  break;  
  } 
}



이제 웹페이지에서 특정한 응답을 받아서 처리 하는 부분을 작성해 보자. 이번 예제에서는 웹페이지에 있는 버튼에 따라 LED를 On/Off할 수 있도록 해 보았다.

아래 코드와 같이 브라우저에서 웹페이지를 요청하면 "HTTP/1.0 200 OK" 메세지와 HTML페이지를 전송하면 된다.
  send(sock, str_http_ok, strlen(str_http_ok));
  send(sock, str_msg, strlen(str_msg));


void ProcessWebpage(unsigned sock, unsigned char *data_buf)
{
 int wait_send=0;

 //LED 제어 처리
 if(strncmp("$LED_ON", (char *)&(data_buf[5]), 7)==0)
 {     
  Led1On();
  send(sock, str_http_ok, strlen(str_http_ok));
  send(sock, str_msg, strlen(str_msg));
  DebugPrint("led on\r\n");
 }
 else if(strncmp("$LED_OF", (char *)&(data_buf[5]), 7)==0)
 {     
  Led1Off();
  PORTF = 0xFF;
  send(sock, str_http_ok, strlen(str_http_ok));
  send(sock, str_msg, strlen(str_msg));
  DebugPrint("led off\r\n");
 }
 else
 {
  send(sock, str_msg, strlen(str_msg));   
 }

 while(getSn_TX_FSR(sock)!= getIINCHIP_TxMAX(sock))
 {
  if(wait_send++ > 1500)
  {
   DebugPrint( "HTTP Response send fail");
    break;
  }
  Delay(1);
 }
 disconnect(sock);
 DebugPrint("closed\r\n");
}





[AT90USB1287-EX] USB Host 테스트 - 메모리 스틱의 이미지 파일 TFT LCD에 출력하기


AT90USB1287은 USB 호스트 기능이 있어 USB 메모리 스틱의 파일을 읽거나 쓸수 있다.


USB 메모리 스틱의 파일 리스트를 읽어 LCD에 출력하고 bmp파일을 차례로 TFT LCD에 출력하는 예제를 작성해 보았다.





AT90USB1287 USB Host 테스트 동영상
USB메모리 스틱이 인식되면 BMP파일을 찾아서 순서대로 출력하는 예제를 작성해 보았다.





AT90USB1287 USB 메모리스틱 테스트 예제 소스코드
int main(void)
{
 //시스템 초기화
 SystemInit();
 
 //LED포트 초기화
 Led1Init();
 Led1On();
 Led2Init();
 Led2On();

 //UART Init
 DebugInit(BAUD_57600);
 DebugPrint("[AT90USB1287-EX] Test Program - USB Host MS\r\n");

 //TFT LCD 초기화
 TftLcd_Init();         
    Disp_Full_Color(White);
    Delay(500); 

 PutString("[AT90USB1287] Host MS Test",1,0,Red,0);

 //USB Host초기화
 usb_task_init();
 host_ms_task_init();
 nav_reset();

 while(1)
 {
  usb_task();
  host_ms_task();
  
  //메모리스틱 파일 처리
  ProcessMSTest();
 }
}



AT90USB1287 USB 메모리스틱 호스트 처리 함수
void ProcessMSTest(void)
{
 char name[10] = "a_1.bmp";
    unsigned char cnt = 0;

 unsigned char i;
 
 // USB인식되면
 if( !Is_device_disconnection() )
 {
  if(ms_connected == 1)
  {
   if(mounted == FALSE)
   {
    if(nav_drive_set(host_selected_lun) == FALSE)
    {
     mounted = FALSE;
     return;
    }
    
   //FAT 초기화
    if(nav_partition_mount()==FALSE)
    {
     mounted = FALSE;
     return;
    }
    else
    {
     mounted = TRUE;
     
     //파일 리스트 출력
     USB_FileNameRead();

     Delay(100);
     
     //MS에서 파일 읽어와 TFT에 출력
        while( 1)
        {
      if(cnt>gMaxFileCnt)cnt=0;
      sprintf(name, "a_%d.bmp", cnt);
      Draw_BitMap(name);
      cnt++;
        }
     return;
    }
   }
  }
  else mounted = FALSE;
 }
 else mounted = FALSE;
}

[AT90USB1287-EX] USB Host Test - 간단히 USB 메모리스틱 인식하기

ATMEL에서 제공하는 MS예제가 정상 동작을 하지 않는다.
데모를 위해 복잡한 기능들이 포함되어 있어 수정하기가 까다롭다.
잘 안될때는 분해 해서 하나씩 테스트 하는것이 이해하기도 좋고 관리에있어 편리할것 같다.

간단히 메모리 스틱을 인식하는 아주 간단한 예제를 작성해 보도록 하자.


일단 ATMEL에서 제공하는 기본 Lib파일을 드라이버 폴더에 복사 한다.
(그대로 사용하기는 좀 힘들고 include path 설정을 좀 수정할 필요가 있다.)





가장 기본이 되는 Lib파일을 인식 시킨다.






AT90USB1287 USB 메모리 스틱 인식 테스트 예제코드
코드 자체는 아주 단순하게 동작한다.
usb_task_init() 함수로 USB초기화 하고 usb_task()함수로 USB관련 처리를 하도록 하면 된다.
이후 ProcessMS()함수에서 메모리 스틱 인식 및 해지에 관련된 이벤트를 받아서 처리하면 쉽게 작성 할 수 있다.

USB 메모리 스틱을 인식하면 LED 점등되고 해지하면 소등되는 예제이다.
//-----------------------------------------------------------------------------
int main(void)
{
 //시스템 초기화
 SystemInit();
 
 //LED포트 초기화
 Led1Init();
 Led1On();

 Led2Init();
 Led2On();

 //UART Init
 DebugInit(BAUD_57600);
 DebugPrint("[AT90USB1287-EX] Test Program - USB Host\r\n");

 //USB초기화
 usb_task_init();

 while(1)
 {
  usb_task();
  ProcessMS();
 }
}
//-----------------------------------------------------------------------------



AT90USB1287 USB 메모리 스틱 인식 처리 함수
//USB 메모리 스틱 인식 처리
void ProcessMS(void)
{
 //메모리 스틱 인식되면...
 if( Is_host_ready() )  
 {
  if(Is_new_device_connection_event())
    {
      Led1On();
   DebugPrint("New Device Connected\r\n");
  }
 }

 //연결 해지되면..
 if (Is_device_disconnection_event())
 {
  Led1Off();
  DebugPrint("Disconnection...\r\n");
 }
}


[AT90USB1287] 메모리 스틱 예제 분석

최신의ATMEL에서 제공하는 AT90USB1287 USB Host MS 예제를 다운받아 분석해 보았다.


예제코드의 폴더 구성은 아래와 같다. 여기서 필요한 파일들을 복사하면 될것 같다.




데모 예제의 메인 함수는 아래와 같다.
int main(void)
{  
   wdtdrv_disable();
   //Clear_prescaler();
   scheduler();
   return 0;
}

void scheduler (void)
{
   scheduler_init();
   scheduler_tasks();
}



scheduler_tasks ()함수에서 루프 돌면서 코드가 실행되는 구조이다.
void scheduler_tasks (void)
{
   // To avoid uncalled segment warning if the empty function is not used
   scheduler_empty_fct();

   for(;;)
   {
      Scheduler_new_schedule();
      #ifdef Scheduler_task_1
         Scheduler_task_1();
         Scheduler_call_next_task();
      #endif
      #ifdef Scheduler_task_2
         Scheduler_task_2();
         Scheduler_call_next_task();
      #endif
     :
 }
}


정의된 task는 아래와같다.
#define Scheduler_task_1        usb_task()
#define Scheduler_task_2        storage_task()
#define Scheduler_task_3        ushell_task()
#define Scheduler_task_4        host_ms_task()








결국 main함수는 아래와 같이 구동되고 있다.

int main(void)
{  
 wdtdrv_disable();
 //Clear_prescaler();

 scheduler_init();
 
 while(1)
 {
  usb_task();
  storage_task();
  ushell_task();
  host_ms_task();
 }
 
 return 0;


usb_task() 는 USB인식 및 기본 처리에 관련된 일을 처리 하는 함수 이다.
host_ms_task()함수에서 데모 예제가 동작한다.
하지만 내가 만든 보드에서 정상동작 하는지 알수가 없다. 이 코드를 기반으로 수정이 필요할것 같다. 
[AT90USB1287-EX] 이더넷 테스트 - TCP/IP를 이용한 광센서 데이터 전송 테스트


[AT90USB1287-EX] 보드에는 하드웨어 TCP/IP 모듈인 W5100을 메모리 제어(다이렉트) 방식으로 연결할 수 있다. 
간단히 TCP/IP  동작확인 테스트를 위해 이더넷으로 LED 제어 및 ADC값을 읽어오는 예제를 테스트 해 보았다.


TCP/IP 호스트 프로그램
기존에 C#으로 작성했던 TCP예제를 그대로 사용하기로 한다.





AT90USB1287 TCP/IP 전송 테스트 동영상
보드에 연결되어 있는 LED를 제어하고 ADC값(CdS)을 읽어와 그래프로 출력하는 예제를 작성해 보았다.




[AT90USB1287-EX] TCP 서버 처리 함수
ProcessTCPS() 함수는 루프를 돌면서 이더넷으로 데이터가 전송되면 필요한 처리를 한다.
void ProcessTCPS(unsigned int sock)
{
    unsigned int len;
 unsigned char data_buf[TX_RX_MAX_BUF_SIZE];
 unsigned int port = MY_LISTEN_PORT;

 switch (getSn_SR(sock))
 {
  // Socket CLOSED일 경우      
 case SOCK_CLOSED:
   if(!m_SokStatus1)m_SokStatus1 = 1;
  
  //socket 초기화 하고
  if(socket(sock,Sn_MR_TCP, port,0x00) == 0)
  {
   DebugPrint("Fail to create socket.");
   m_SokStatus1 = 0;
  }
  else
  {
   //접속대기
   listen(sock);
  }
  break; 


 case SOCK_ESTABLISHED:
  //수신데이터가 있으면
  if((len = getSn_RX_RSR(sock)) > 0)    
  {
      if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE; 
      //데이터 수신
      en = recv(sock, data_buf, len);   
   
     //수신데이터 처리
     //send(sock, data_buf, len);    
     EthernetTest(data_buf, len);
  }  
  break;


 case SOCK_CLOSE_WAIT:                             
  //If the client request to close
  disconnect(sock);
  
  m_SokStatus1 = 0;
  break;  
 
    default:
      
        break;
 } 
}


[AT90USB1287-EX] 이더넷 데이터 수신 처리 처리 함수
//-----------------------------------------------------------------------------
//수신데이터 처리

void EthernetTest(unsigned char *pRcvBuffer, unsigned int len)
{
 unsigned int i;
 char buf[32];
 DebugPrint("Read Data[%d]\r\n", len);
 
 //Packet CMD Check
 if(pRcvBuffer[0] == 0x55)
 {
  switch(pRcvBuffer[1])
  {
   case '0':
    Led1Off();
    break;
    
   case '1':
    Led1On();
    break;
    
   case '2':
    Led2Off();
    break;
    
   case '3':
    Led2On();
    break; 
    
   case 'r':
    sprintf(buf, "%d\r\n", AdcRead(2));
    send(SOCK_TCPS, buf, strlen(buf));
    break;      
  }
 }
}
[AT90USB1287-EX] Ehternet Test - W5100 TCP/IP 루프백 테스트

[AT90USB1287-EX] 보드는 하드웨어 TCP/IP 모듈인 W5100/W5200 을 연결할 수 있여 이더넷 관련 테스트를 쉽게 진행할 수 있다.
물론 AT90USB1287-EX 보드는 ATmega128도 호환 되기 때문에 동일하게 동작 시킬 수 있다.

먼저 개발 환경 설정을 해 보면...
하드웨어 TCP/IP 스택이므로 쉽게 이더넷 구현이 가능한데, 드라이버 폴더의 wizent에서 W5100관련 w5100.c, socket.c 만 삽입하면 된다.



그리고 메인 소스코드에  아래를 인클루드 한다.
#include "w5100.h"
#include "socket.h"


다음은 네트웍 설정을 해 준다.
W5100초기화 하고 MAC 어드레스, IP, Gateway등을 설정해 준다.
#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.101
#define MY_SUBNET   {255, 255, 255,   0}


void W5100_NetInit(void)
{
 unsigned char mac[6] = MY_NET_MAC;
 unsigned char sm[4] = MY_SUBNET;
 unsigned char gwip[4] = MY_NET_GWIP;
 unsigned char m_sip[4] = MY_SOURCEIP;

 IICHIP_HAL_INIT();
 IICHIP_RESET_INIT() ;
 IICHIP_RESET();

 DebugPrint("W5100_NetInit");     

 //W5100 Chip Init
 iinchip_init();
     
 //Set MAC Address
 setSHAR(mac);

 //Set Gateway
 setGAR(gwip);

 //Set Subnet Mask
 setSUBR(sm);

 //Set My IP
 setSIPR(m_sip);
 
#ifdef __DEF_IINCHIP_INT__
 setIMR(0xEF);
#endif

 sysinit(MY_NET_MEMALLOC, MY_NET_MEMALLOC);  
}



여기까지 하고 시리얼 포트로 설정한 값을 읽을 수 있다면 하드웨어적 설정이 끝난 것이고 ping테스를 할 수 있다.




int main(void)
{
 //시스템 초기화
 SystemInit();
 
 //LED포트 초기화
 Led1Init();
 Led1On();

 Led2Init();
 Led2On();

 //UART Init
 DebugInit(BAUD_57600);
 DebugPrint("myMCU UART0 Test Program\r\n");

 //init_network();
    W5100_NetInit();
    DisplayConfig();

   while(1);
}




TCP 서버 루프백 테스트
ProcessTCPS() 함수를 main루프에서 호출하면 TCP루프백 테스트를 할 수 있다.
(좀더 자세한 사항은 다음에 진행하고 일단 이더넷 통신이 되는것을 확인 하도록 하자)
void ProcessTCPS(unsigned int sock)
{
    unsigned int len;
 unsigned char data_buf[TX_RX_MAX_BUF_SIZE];
 unsigned int port = MY_LISTEN_PORT;

 switch (getSn_SR(sock))
 {
  // Socket CLOSED일 경우     
 case SOCK_CLOSED:
   if(!m_SokStatus1)m_SokStatus1 = 1;
 
  //socket 초기화 하고
  if(socket(sock,Sn_MR_TCP, port,0x00) == 0)
  {
   DebugPrint("Fail to create socket.");
   m_SokStatus1 = 0;
  }
  else
  {
   //접속대기
   listen(sock);
  }
  break; 


 case SOCK_ESTABLISHED:
  //수신데이터가 있으면
  if((len = getSn_RX_RSR(sock)) > 0)   
  {
      if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE;
      //데이터 수신
      len = recv(sock, data_buf, len);  
  
     //수신데이터 처리-> 루프백
     send(sock, data_buf, len);    
  } 
  break;

 case SOCK_CLOSE_WAIT:                            
  //If the client request to close
  disconnect(sock);
 
  m_SokStatus1 = 0;
  break; 
 
    default:
      
        break;
 } 
}


[AT90USB1287-EX] I1511 15" TFT LCD모듈 테스트



확장 포트는 표준 8bit 모드 TFT-LCD 모듈제어 포트를 연결할 수 있어 15" [I1511 TFT LCD] 모듈을 연결하여 테스트 가능하다.





AT90USB1287-EX I1151 TFT-LCD 드라이버 코드
Driver 코드에서 Enable 여부만 설정하면 코드 수정 없이 사용가능하다.
//-----------------------------------------------------------------------------
//TFT LCD Driver
#define TFT_DRV_HD66791                 0
#define TFT_DRV_COM44                   0
#define TFT_DRV_ST7735                  1
:





[AT90USB1287-EX] I1151 TFT-LCD 출력 테스트 결과


블로그 이미지

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)