[INTERFACE]/WIZNET_EVM2010. 11. 19. 01:32

[W5100] STM32에서 SPI로 테스트중... 속도문제

[W5100] STM32에서 SPI로 테스트중... 속도문제

STM32에서 SPI로 테스트중...
STM32를 SPI를 이용하여 W5100테스트 중이다. 기본 동작은 잘 되지만 전송 속도가 문제다.
SPI클럭을 18M/4 = 4.5Mhz 로 구동 하는데 속도가 400kbps도 안된다. AVR 4Mhz로 구동해도 500k이상 나왔는데...




SPI를 클럭을 메인클럭에서 2분주 해서 다시 시도 해본다. 아예 SPI리드 라이트가 않된다.

wiz_write_buf() 함수를 좀 수정해야 할듯...
CS를 for루프 위쪽으로 올려서 CS제어 부분도 줄여볼까해서 해보니 데이터 에러가 발생한다.

  IINCHIP_CSoff();        
  for(idx=0;idx<len;idx++)
 {
  IINCHIP_SpiSendData(0xF0);
  IINCHIP_SpiSendData(((addr+idx) & 0xFF00) >> 8);
  IINCHIP_SpiSendData((addr+idx) & 0x00FF);
  IINCHIP_SpiSendData(buf[idx]);
   }
 IINCHIP_CSon();


SPI Wirte를 함수에서 직접 레지스트로 바꾸니 좀 더  빨라졌다

 void SPI1_WriteByte(unsigned char Data)
{
 //while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
   
 SPI_I2S_SendData(SPI2, Data);

//while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);

 SPI_I2S_ReceiveData(SPI2);

}



[1] iInChip Send: 0.4277 Mbps(148684 bytes, 2.6525 sec)
iInChip Recv: 0.4213 Mbps(148684 bytes, 2.6923 sec)
------------------------------------------------------------


Data Read, Write부분도 변경하니 좀더 빨라진다.
[1] iInChip Send: 0.5328 Mbps(148684 bytes, 2.1290 sec)
iInChip Recv: 0.5251 Mbps(148684 bytes, 2.1604 sec)
------------------------------------------------------------


SPI Read/Wrte 두 함수 모두 변경하니 조금 더 빨라졌다.

void SPI1_WriteByte(unsigned char Data)
{
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    
 SPI2->DR =  Data;

 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);

 Data = SPI2->DR;
}


560k까지 나오고 있다.
[1] iInChip Send: 0.5737 Mbps(148684 bytes, 1.9773 sec)
iInChip Recv: 0.5655 Mbps(148684 bytes, 2.0060 sec)
------------------------------------------------------------

SPI1_WriteByte() 함수를 쓰지 않고 하니 더 빨라진다.

       int temp;
      
    while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    SPI2->DR = 0xF0;
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
    temp = SPI2->DR;
   
   
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    SPI2->DR = ((addr)>>8);   
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
    temp = SPI2->DR;

   
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    SPI2->DR = (addr);  
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
    addr = SPI2->DR;
   
   
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    SPI2->DR = data;    
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
    temp = SPI2->DR;


630kbps가 최대 인것 같다.
[1] iInChip Send: 0.6455 Mbps(148684 bytes, 1.7574 sec)
iInChip Recv: 0.6362 Mbps(148684 bytes, 1.7831 sec)
------------------------------------------------------------

Posted by nexp

댓글을 달아 주세요

[INTERFACE]/WIZNET_EVM2010. 8. 22. 21:06

[W5100 EVM] 초간단 TCP서버 테스트

[W5100 EVM] 초간단 TCP서버 테스트


임베디드 시스템에서 이더넷을 통한 네트웍제어는 여러가지 솔루션이 있지만 특히 소형의 임베디드 환경에서는 상당한 부하를 차지한다. 임베디드 환경에서 좀더 쉽고 간단히 이더넷을 제어하기 위해 TCP/IP스택이 하드웨어적으로 처리되는 W5100을 이용하여 초간단 TCP서버를 구축해 보았다.

먼저 소형 [W5100 EVM] 모듈과 AVR128 보드, 확장 테스트보드(EXP-) 를 연결한다.


회로적으로 아래와 같이 연결된다.




소스코드
소스코드는 예전에 작성했던 코드를 좀더 간단하고 사용하기 편하도록 몇가지 수정을 했다.(좀더 자세한 내용은 [AVR TCP Server 테스트 예제 참고)


[config.h]
W5100의 SPI_CS핀은 PD5에 연결되어 있다.
//-----------------------------------------------------------------------------
// W5100 Driver
#define IINCHIP_SpiInit     SPI0_Init
#define IINCHIP_SpiSendData    SPI0_SendByte 
#define IINCHIP_SpiRecvData    SPI0_RxData

#define IINCHIP_CS_BIT     BIT5
#define IINCHIP_CS_DDR     DDRD
#define IINCHIP_CS_PORT     PORTD

#define IINCHIP_CSInit()    Sbi(IINCHIP_CS_DDR, IINCHIP_CS_BIT)
#define IINCHIP_CSon()     Sbi(IINCHIP_CS_PORT, IINCHIP_CS_BIT)
#define IINCHIP_CSoff()     Cbi(IINCHIP_CS_PORT, IINCHIP_CS_BIT)
//-----------------------------------------------------------------------------


[/01_drv/wiznet/mcu/types.h]
SPI모드 제어를 위한 설정
//#define __DEF_IINCHIP_BUS__ __DEF_IINCHIP_DIRECT_MODE__
//#define __DEF_IINCHIP_BUS__ __DEF_IINCHIP_INDIRECT_MODE__
#define __DEF_IINCHIP_BUS__ __DEF_IINCHIP_SPI_MODE__ /*Enable SPI_mode*/


네트웍 초기화
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,  101} //보드 IP     : 192.168.0.101
#define MY_SUBNET   {255, 255, 255,   0}

#define MY_LISTEN_PORT  5000  //서버 포트 : 5000


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); 

   EthernetTest(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;
 }
}


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();
 }
}



메인함수
//-----------------------------------------------------------------------------
int main(void)
{
 SystemInit();

 //Serial Init
 DebugInit(BAUD_115200);
 DebugPrint("W5100 TCP Server Program\r\n");

 Led1Init();
 Led1On();

 //W5100 Chip Initialize
 //----------------------------
 InitWiznet();
 NetInit();
 //----------------------------

 //설정된 IP 표시
 DisplayConfig();

 while(1)
 {
  //TCP Server Process
  ProcessTcpSever();
 }
}
//-----------------------------------------------------------------------------


W5100 TCP 서버 테스트
실행파일


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



W5100 테스트 동영상
TCP서버로 동작하는 보드에 접속하여 데이터를 전송해 LED를 제어 하는 예제. '1'을 전송하면 LED On, '0'을 전송하면 LED Off.




Posted by nexp

댓글을 달아 주세요

[INTERFACE]/WIZNET_EVM2010. 6. 27. 23:48

[W5100-M EVM] Hardwired TCP/IP Module 제작

[W5100-M EVM] Hardwired TCP/IP Module 제작



 [W5100-S EVM] 모듈 은 소형으로 제작하기 위해 SPI, Indirect Mode(Data, A0, A1) 만을 지원하는 모듈이었는데...
크기는 조금 커지고 W5100의 전체 기능을 사용할 수 있는 형태의 모듈로 다시 제작 했다.




여러 Ethernet 테스트 확장 보드에 연결될 수 있도록 해서 다양한 MCU에서 테스트 가능하다.



Posted by nexp

댓글을 달아 주세요

[INTERFACE]/Ethernet2009. 11. 20. 20:00

ENC424J600 10/100 Base-T Ethernet Controller

ENC424J600 10/100 Base-T Ethernet Controller


Microchip ENC28J60의 후속 모델로 Microchip ENC424J600 10/100BaseT Ethernet controller가 출시 되었다. SPI방식의 소형 이더넷 컨트롤러라는 장점을 가진 ENC28J60을 사용하사용자 삽입 이미지면서 느꼈던 속도문제(10 Base-T에서 100 Base-T로 업그레이드 되어)가 해결된것 같다. 한번 사용해 볼만 헌데,,, 그리고 Microchip FREE TCP/IP Stack 도 V5.0 으로 업데이트 되었군.

이제 Hardware TCP/IP W5100과 비교해 테스트 해볼만 하지 않을까...



ENC424J60 데이터 시트

ENC424J60 핀맵



Posted by nexp

댓글을 달아 주세요

[INTERFACE]/WIZNET_EVM2009. 8. 22. 20:21

[W5100 EVM] 소형 하드웨어 TCP/IP 모듈 제작

[W5100 EVM] 소형 하드웨어 TCP/IP 모듈 제작


새로운 형태의 Wizenet W5100 EVM보드를 제작 했다. 기존 모듈보다 좀더 제작하기도 쉽고 작으면서 SPI관련 회로를 추가해서 제작했다.
소형이 목적이기 때문에 SPI, Indirect모드만 지원한다. 특히 SPI의 경우 속도는 좀 느리지만 4핀만 연결하면 되므로 상당히 간단히 연결 할 수 있다.








W5100 회로도 및 커넥터 핀맵

실제 보드상의 실크와 회로도가 좀금 다르게 되었는데... 아래 실제 핀맵은 회로를 이용하면 된다.


새롭게 제작하면서 추가된 사항은 SPI_EN핀을 따로 설정하지 않아도 자동으로 설정될 수 있도록 인버터를 추가 하였다. 위즈넷사의 버그(?)중 SPI를 멀티로 연결했을때(특히 SPI모드가 같을때) 인식이 잘 안되는 현상을 해결하기 위한 방법이기도 하므로 새로 제작한 모듈을 이용하면 SPI라인에 멀티로 연결할 수 있다.




W5100 확장 테스트 보드
EXP_ARM EVM







Posted by nexp

댓글을 달아 주세요