[AVR]/AT90USB2012.09.02 18:48

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

[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를 누르면 업데이트된 파일을 볼수 있다.

 

 

 

 

 

 

 

 

Posted by nexp
[AVR]/AT90USB2012.01.30 00:06

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

[ 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()


Posted by nexp
[AVR]/AT90USB2012.01.29 10:40

[AT90USB1287] Timer2 테스트

[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;
  }
 }
}
//-----------------------------------------------------------------------------



Posted by nexp
[AVR]/AT90USB2012.01.27 22:46

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

[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");
}





Posted by nexp
[AVR]/AT90USB2012.01.25 23:00

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

[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;
}

Posted by nexp