[AVR]/AT90USB2012. 1. 25. 21:43

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

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


Posted by nexp

댓글을 달아 주세요

[AVR]/AT90USB2012. 1. 25. 21:30

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

[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()함수에서 데모 예제가 동작한다.
하지만 내가 만든 보드에서 정상동작 하는지 알수가 없다. 이 코드를 기반으로 수정이 필요할것 같다. 
Posted by nexp

댓글을 달아 주세요

[AVR]/AT90USB2012. 1. 25. 20:30

[AT90USB1287-EX] 이더넷 테스트 - TCP/IP를 이용한 광센서 데이터 전송 테스트

[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;      
  }
 }
}
Posted by nexp

댓글을 달아 주세요

[AVR]/AT90USB2012. 1. 25. 19:00

[AT90USB1287-EX] Ehternet Test - W5100 TCP/IP 루프백 테스트

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


Posted by nexp

댓글을 달아 주세요

[AVR]/AT90USB2012. 1. 24. 22:30

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

[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 출력 테스트 결과


Posted by nexp

댓글을 달아 주세요