[MCU]/adStar2013. 4. 27. 23:30

adStar - W5100 TCP/IP 전송 속도 테스트 (외부 메모리 제어 모드 사용)

adStar - W5100 TCP/IP 전송 속도 테스트 (외부 메모리 제어 모드 사용)

 

 

 

adStar 도 CANTUS 와 같이 외부 메모리 제어 모드가 있다.  외부 메모리를 연결할 수 있고,  특히 W5100과 같이 고속 이더넷이 필요할 때 사용하면 편리하다. [adStar TFT-EX] 보드에는 메모리 방식의 W5100을 연결할 수 있는 커넥터가 있기 때문에 이를 테스트 해 보았다.

 

메모리 제어 기능은 PORT3, PORT4에서 설정할 수 있다.

 

 

 

adStar의 CS0 할당 번지는 0x5000 0000 이다.

기존 CANTUS 와 약간의 차이가 있는것은 메모리 번지와 제어 레지스터 번지이다. 나름의 이유가 있었겠지만 기존 코드와 호환성을 유지하기 위해 동일하게 했으면 하는 생각이 든다.

 

 

 

 

asStar W5100 초기화 코드

 

void W5100_IO_INIT()
{
 *(volatile U16*)0x80000800 = BIT10; //BANK 0 8Bit

 *R_PAF3 = 0; //SRAM interface address, data
 Cbi(*R_PAF4, GP_CFG(1) | GP_CFG(3)| GP_CFG(4)| GP_CFG(5));// nCS, nWE, nRE, ALE  

 

 

 

asStar W5100 메모리 제어 방식(INDIRECT)을 이용한 TCP/IP 전송 속도 테스트

회로적으로 간단하게 테스트 하기위해 INDIRECT방식을 이용했는데도 6Mbps 이상 나오고 있는데 DIRECT모드를 이용하면 더 빠를 수 있을것 같다. 

 

 

 

Posted by nexp

댓글을 달아 주세요

[AVR]/Mega1282012. 5. 3. 21:20

AMega128 Ethernet Test 보드 - 테스트 하기

AMega128 Ethernet Test 보드 - 테스트 하기

 

 

 

 소스코드
테스트 소스코드 는 TCP 서버 테스트를 위한 예제코드

 


 

//-----------------------------------------------------------------------------
//수신데이터 처리
void EthernetTest(unsigned char *pRcvBuffer, unsigned int len)
{
 unsigned int i;

 DebugPrint("Read Data[%d]\r\n", len);
 
 for(i=0;i<len;i++)
 {
  //if(i%16==0)DebugPrint("\r\n");
  DebugPrint("%c", pRcvBuffer[i]);
 }

 DebugPrint("\r\nReceive OK!\r\n");

 //-----------------------------------------------------------------------------

 

 


 

USB2UART 를 위해 USB를 연결하고, 랜 캐이블을 연결한다.

  

 

CP2012 칩의 드라이버 파일은 아래 링크에서 최신파일을 받을 수 있다.

  CP210x_VCP_Win2K.exe

 http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx

 

 

 

펌웨어 다운로드 하고 USB 연결후 하이퍼 터미널(보레이트 115200bps)에 아래와 같이 레지스터 정보를 표시되면 정상동작을 확인할 수 있다.

 

 

코드상에서 보드의 IP를 설정할 수 있다. 여기서는 192.168.0.100 , Port 5000 으로 설정되어 있다.

 // MY Source IP     : 192.168.0.100
#define MY_SOURCEIP {192,  168, 0,  100}

 

// MY Listen Port  : 5000

#define MY_LISTEN_PORT 5000      

 

 


 

테스트용 PC프로그램

PC측 호스트 프로그램은 TCP루프백 테스트를 할 수 있는 AX 플그램을 사용한다.

 


 

 

기본 테스트하기

1) TCP 연결

 

 

보드 IP 192.168.0.100, 5000으로 접속

 

 

정상적으로 접속되면 메세지가 출력된다.

 

 

 

테스트 메세지 전송

 

 

테스트로 100개의 데이터 전송

 

 

 

수신된 데이터 확인

하이퍼 터미널에서 수신된 데이터를 확인 할 수 있다.

 

 

 

 

 

 

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

댓글을 달아 주세요

[ST_MICRO]/STM32F42011. 12. 6. 23:30

[STM32F4] W5100/W5200 TPC/IP Loopback 전송 속도 테스트

[STM32F4] W5100/W5200 TPC/IP Loopback 전송 속도 테스트



SPI 최대 클럭 21Mhz에서 3.5Mbps 정도 나온다.
빠르긴 한데.. 아쉬운 점은 168Mhz MCU인데 속도가 기대한 만큼은 나오지 않는것 같다.
(PIC32 CP/IP 전송 속도 테스트 결과 와 비교하면 80Mhz PIC32가 더 빠르게 나온다)

SPI클럭 설정을 좀더 자유롭게 할 수 있으면 좋을것 같은데....
SPI FIFO가 없어 그런것 같은데... DMA를 이용하면 좀더 빨라지지 않을까?

------------------------------------------------------------
[7] iInChip Send: 3.5567 Mbps(5278574 bytes, 11.3230 sec)
iInChip Recv: 3.5074 Mbps(5278574 bytes, 11.4822 sec)
------------------------------------------------------------
[8] iInChip Send: 3.5647 Mbps(5278574 bytes, 11.2975 sec)
iInChip Recv: 3.3565 Mbps(5278574 bytes, 11.9982 sec)
--------------------------------------------------------






Cortex-M4 STM32F405 의 W5200 HAL Driver 코드
//-----------------------------------------------------------------------------
// W5100 HAL
#define _SPI1_ENABLE     1

#define W5100_CS_PORT     GPIOB
#define W5100_CS_BIT     BIT12

#define W5100_RST_PORT     GPIOA
#define W5100_RST_BIT     BIT0

#define IINCHIP_RSToff()    cbi(W5100_RST_PORT, W5100_RST_BIT) 
#define IINCHIP_RSTon()     sbi(W5100_RST_PORT, W5100_RST_BIT)

#define W5100_IO_INIT()     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);\
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;\
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\
          GPIO_InitStructure.GPIO_Pin=W5100_CS_BIT;\
          GPIO_Init(GPIOB, &GPIO_InitStructure);\
          GPIO_InitStructure.GPIO_Pin=W5100_RST_BIT;\
          GPIO_Init(GPIOA, &GPIO_InitStructure);


#define IINCHIP_CSoff()     cbi(W5100_CS_PORT, W5100_CS_BIT) 
#define IINCHIP_CSon()     sbi(W5100_CS_PORT, W5100_CS_BIT)

#define IINCHIP_SPI_INIT()    SPI1_Init();IINCHIP_SpiSpeed()
#define IINCHIP_SpiSendData    SPI1_WriteReadByte
#define IINCHIP_SpiRecvData    SPI1_WriteReadByte
#define IINCHIP_SpiSpeed()              SPI1_SetSpeed(SPI_SPEED_MAX)
//-----------------------------------------------------------------------------
Posted by nexp

댓글을 달아 주세요