TM4C123 EVM - W5500 TCP/IP 전송 속도 테스트



[NET_EV_SM EVM]보드와 W5500 EVM 보드를 이용하여 Ethernet (TCP/IP) 테스트를 진행 했다.

고성능 Cortex-M4 코어의 TM4C123 에서 Ethernet 기능을 추가해 두면 여러 프로젝트에서 유용할 것 같다.

위 사진과 같이 W5500 EVM 보드를 연결하면 Ethernet을 쉽게 테스트 가능하다. 



W5100, W5200, W5500 Ethernet 모듈은 [NET_EV_SM EVM] 보드의 SPI-EXP 모듈을 연결하여 쉽게 테스트 가능하다.


W5500의 CS핀은 P_B15 -> CN18_15pin ->PD6

/RST 핀은 P_A3->CN17_3pin -> PE1

에 연결되어 있다.



TM4C123 코드에서 W5500 Driver Code에서 아래와 같이 핀을 할당 할 수 있다.

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

// W5500 HAL


#define W5500_CS_PORT PORTD

#define W5500_CS_BIT BIT6


#define W5500_RST_PORT PORTE

#define W5500_RST_BIT BIT1


#define IINCHIP_RSToff() PE1 = 0

#define IINCHIP_RSTon() PE1 = BIT1


#define IINCHIP_CSoff() PD6 = 0

#define IINCHIP_CSon() PD6 = BIT6


                                        

#define W5500_IO_INIT() ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);\

                                        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, W5500_CS_BIT);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, W5500_RST_BIT);


#define IINCHIP_SPI_INIT() SPI0_Init();IINCHIP_SpiSpeed()

#define IINCHIP_SpiSendData SPI0_WriteReadByte

#define IINCHIP_SpiRecvData SPI0_WriteReadByte

#define IINCHIP_SpiSpeed()              SPI0_SetSpeed(SPI_SPEED_MAX)

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




TM4C123의 이더넷 테스트를 위해 TCP/IP 루프백 테스트 코드를 이용하였다. 

int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port)

{

   int32_t ret;

   uint16_t size = 0, sentsize=0;

   switch(getSn_SR(sn))

   {

      case SOCK_ESTABLISHED :

         if(getSn_IR(sn) & Sn_IR_CON)

         {

            setSn_IR(sn,Sn_IR_CON);

         }

         if((size = getSn_RX_RSR(sn)) > 0)

         {

            if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;

            ret = recv(sn,buf,size);

            if(ret <= 0) return ret;

            sentsize = 0;

            while(size != sentsize)

            {

               ret = send(sn,buf+sentsize,size-sentsize);

               if(ret < 0)

               {

                  close(sn);

                  return ret;

               }

               sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.

            }

         }

         break;

      case SOCK_CLOSE_WAIT :

         if((ret=disconnect(sn)) != SOCK_OK) return ret;

         break;

      case SOCK_INIT :

         if( (ret = listen(sn)) != SOCK_OK) return ret;

         break;

      case SOCK_CLOSED:

         if((ret=socket(sn,Sn_MR_TCP,port,0x00)) != sn)

            return ret;

         break;

      default:

         break;

   }

   return 1;

}




TM4C123은 기본 드라이버 코드가 ROM에 저장되어 있기 때문에 코드 사이즈를 상당히 줄일 수 있다.

실제 컴파일 해 보면 코드 사이즈가 7kbyte로 상당히 적은것을 확인 할 수 있다.


[1] = D:\WORK\ARM\TM4C\tm4c123_evm\ex10_w5500\ewarm66\Debug\Obj

[2] = command line

[3] = dl7M_tln.a

[4] = driverlib.a

[5] = m7M_tlv.a

[6] = rt7M_tl.a

[7] = shb_l.a


  7 072 bytes of readonly  code memory

    720 bytes of readonly  data memory

  2 645 bytes of readwrite data memory




Wiznet사의 AX1프로그램을 이용하여 W5500의 TCP/IP 루프백 전송 속도 테스트를 해 보면 TM4C123 의 SPI 최대 속도는 12Mhz에서 2Mbps 정도로 측정된다. 

TCP/IP 전송 속도 테스트 결과 참고 에서와 같이 TCP/IP 전송 속도를 비교해 보면 SPI속도가 느려서 그런지 약간의 한계가 있어 페리 기능이 좀 아쉽다.


[1] iInChip Send: 2.1093 Mbps(348160 bytes, 1.2593 sec)

iInChip Recv: 1.9174 Mbps(348160 bytes, 1.3853 sec)

------------------------------------------------------------

[2] iInChip Send: 2.0543 Mbps(348160 bytes, 1.2930 sec)

iInChip Recv: 1.7646 Mbps(348160 bytes, 1.5053 sec)

------------------------------------------------------------

[3] iInChip Send: 2.1132 Mbps(348160 bytes, 1.2570 sec)

iInChip Recv: 1.8640 Mbps(348160 bytes, 1.4250 sec)

------------------------------------------------------------

[4] iInChip Send: 2.1347 Mbps(348160 bytes, 1.2443 sec)

iInChip Recv: 1.9225 Mbps(348160 bytes, 1.3817 sec)

------------------------------------------------------




TM4C123 EVM 과 W5500을 이용하여 TCP/IP 테스트 코드

#include "system.h"

#include "serial.h"

#include "wiznet.h"


#define SOCK_TCPS0       0

#define DATA_BUF_SIZE   2048

uint8_t gDATABUF[DATA_BUF_SIZE];


void ProcessTCPS(void)

{

    loopback_tcps(SOCK_TCPS0, gDATABUF, 3000);

}


int main(void)

{

    short data;

    

    SystemInit();

    Led1Init();

    Led1On();

    

    Led2Init();

    Led2On();

    

    DebugInit(BAUD_115200);

    DebugPrint("TM4C Uart Test\r\n");


    //W5500 초기화 함수

    W5500_Init();

    

    while(1)

    {

        ProcessTCPS();      

    }

}


EFM32G210 EVM - W5200을 이용한 TCP/IP 전송 속도 테스트



[XMega-EX EVM] 확장 테스트 보드를 이용하면 W5200모듈을 연결하여 이더넷 테스트가 가능하다.



EFM32G210 EVM W5200 TCP/IP 모듈 드라이버 코드

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

// W5100 HAL

#define W5100_CS_PORT GPIOA

#define W5100_CS_BIT BIT0


#define W5100_RST_PORT GPIOA

#define W5100_RST_BIT BIT1



#define W5100_IO_INIT() GPIO_PinModeSet(gpioPortA, 0, gpioModePushPull, 1);\

                                        GPIO_PinModeSet(gpioPortA, 1, gpioModePushPull, 1);\

                                        IINCHIP_CSon();


#define IINCHIP_CSoff() cbi(W5100_CS_PORT, W5100_CS_BIT)

#define IINCHIP_CSon() sbi(W5100_CS_PORT, W5100_CS_BIT)



#define IINCHIP_SPI_INIT() SPI0_Init();IINCHIP_SPI_SPEED();

#define IINCHIP_SpiSendData SPI0_WriteReadByte

#define IINCHIP_SpiRecvData SPI0_WriteReadByte

#define IINCHIP_SPI_SPEED()            MMC_SPISpeed(SPI_SPEED_MAX) 


#define IINCHIP_RSToff() cbi(W5100_RST_PORT, W5100_RST_BIT)

#define IINCHIP_RSTon() sbi(W5100_RST_PORT, W5100_RST_BIT)

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




EFM32를 이용하여 TCP/IP 전송율 테스트 결과 1.4Mbps 이다. EFM32 의 최대 SPI 클럭속도가 1.4Mhz인 것을 생각하면 그리 빠르지는 않은듯...

저전력 웹서버 만들면 좋을것 같다.


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모드를 이용하면 더 빠를 수 있을것 같다. 

 

 

 

[W7200 EVM] TCP/IP 테스트 - W7200 TCP Server 전송 속도 테스트




W7200은 Cortex-M3 STM32와 W5200이 한칩에 들어 있는 Internet MCU 이다.


소스코드는 기존 STM32-SM + W5200과 호환이 되지만 SPI(SPI0), CS(PA4), RST(PB8), PowerDown(PB9) 핀은 하드웨어 적으로 고정되어 있다.



W7200 TCP Server 전송 속도

TCP 서버 송수신 속도는 3Mbps정도로 측정된다. STM32-SM EVM (2.5Mbps)과 동일한 코드로 테스트 해보면 W7200이 속도가 좀더 빠르게 나오는데... 아무래도 한칩에 포함되어 있어 그런것이 아닐까 생각해 본다.




W7200 W5200 제어 드라이버 코드

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

// W5100 HAL

#define _SPI0_ENABLE 1


#define W5100_CS_PORT GPIOA

#define W5100_CS_BIT BIT4


#define W5100_RST_PORT GPIOB

#define W5100_RST_BIT BIT8

#define IINCHIP_RSToff() cbi(W5100_RST_PORT, W5100_RST_BIT)

#define IINCHIP_RSTon() sbi(W5100_RST_PORT, W5100_RST_BIT)



#define W5100_PD_PORT GPIOB

#define W5100_PD_BIT BIT9

#define IINCHIP_PDoff() cbi(W5100_PD_PORT, W5100_PD_BIT)

#define IINCHIP_PDon() sbi(W5100_PD_PORT, W5100_PD_BIT)




#define W5100_IO_INIT() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);\

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;\

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;\

GPIO_InitStructure.GPIO_Pin=W5100_CS_BIT;\

GPIO_Init(GPIOA, &GPIO_InitStructure);\

GPIO_InitStructure.GPIO_Pin=W5100_RST_BIT|W5100_PD_BIT;\

GPIO_Init(GPIOB, &GPIO_InitStructure);\

                                        IINCHIP_RSTon();IINCHIP_PDoff();



#define IINCHIP_CSoff() cbi(W5100_CS_PORT, W5100_CS_BIT)

#define IINCHIP_CSon() sbi(W5100_CS_PORT, W5100_CS_BIT)




#define IINCHIP_SPI_INIT() SPI0_Init();SPI0_SetSpeed(SPI_SPEED_MAX);

#define IINCHIP_SpiSendData SPI0_WriteReadByte

#define IINCHIP_SpiRecvData SPI0_WriteReadByte

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








 [adStar EVM] W5200을 이용한 TCP-Seerver 전송 속도 테스트

 

 

 

[adStar-EX EVM] 보드에는 H/WTCPIP W5200모듈을 연결할수 있어 이더넷 테스트가 가능하다. W5200을 이용하여 TCP Server모드에서 전송 속도를 테스트 해 보았다.

 

[W5200 EVM] 모듈 연결 핀맵

 

 

[adStar-EX EVM] W5200  드라이버 코드

#define _SPI1_ENABLE     1

//-----------------------------------------------------------------------------
// W5100 HAL
#define W5100_CS_PORT     GPIO1
#define W5100_CS_BIT     BIT3
#define W5100_RST_BIT     BIT5


#define W5100_IO_INIT()     Sbi(*R_PAF4, GP_CFG(3));Sbi(*R_GP1ODIR, W5100_CS_BIT);\
          Sbi(*R_PAF2, GP_CFG(5));Sbi(*R_GP1ODIR, W5100_RST_BIT)


#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()
#define IINCHIP_SpiSendData    SPI1_WriteReadByte
#define IINCHIP_SpiRecvData    SPI1_WriteReadByte


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

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

 

 

 

테스트 결과 3Mbps정도로 측정된다. SPI방식으로 이정도면 나쁘지 않은것 같다.

 

 

[STM32-SM2 EVM] W5200 이더넷 테스트 -  NET-EVM 보드



STM32를 이용하여 [NET-EVM] 보드에서 W5200 모듈을 테스트 했다.





[NET-EVM] W5100/W5200용 커넥터




STM32-SM2는 핀맵이 약간 수정되었는데.. W5200의 /RST(INT0) 핀이 3.3V로 연결되기 때문에 3.3V끊고 PA15와 0옴으로 연결해 주어야 한다.




W5200 드라이버 코드
//-----------------------------------------------------------------------------
// W5100 HAL
#define _SPI1_ENABLE     1

#define W5100_CS_PORT     GPIOB
#define W5100_CS_BIT     BIT12
#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_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);\
          GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;\
          GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;\
          GPIO_InitStructure.GPIO_Pin=BIT12;\
          GPIO_Init(GPIOB, &GPIO_InitStructure);\
          GPIO_InitStructure.GPIO_Pin=BIT15;\
          GPIO_Init(GPIOA, &GPIO_InitStructure);


#define W5100_RST_PORT     GPIOA
#define W5100_RST_BIT     BIT15

#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()
#define IINCHIP_SpiSendData    SPI1_WriteReadByte
#define IINCHIP_SpiRecvData     SPI1_WriteReadByte




STM32 TCP/IP 전송 속도 테스트
최대 SPI클럭 18Mhz 인 STM32에서 전송 속도는 2Mbps정도 출력된다.

코드 옵티마이즈 후 2.5Mbps 까지 가능하다.





[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)
//-----------------------------------------------------------------------------
[MSP430F5529 EVM] W5200/W5100 TCP/IP loopback 전송 속도 테스트



[MSP430F5529 EVM] 을 이용하여 TCP/IP loopbak 전송 속도를 테스트 해 보았다.
MSP430F5x 의 경우 클럭이 최대 32Mhz이고 SPI클럭 속도 설정을 자유롭게 설정 가능하기 때문에 SPI클럭 속도에서 유리한 점이 있다.

메인 클럭을 32Mhz로 설정하고 SPI클럭을 16Mhz로 설정하여 테스트한 결과 2.2Mbps 정도의 전송 속도가 나온다.
다른 MCU의 TCP/IP 전송 속도 테스트 결과 와비교 했을때 나쁘지 않다.

-----------------------------------------------------------
[8] iInChip Send: 2.2657 Mbps(3880723 bytes, 13.0676 sec)
iInChip Recv: 2.1496 Mbps(3880723 bytes, 13.7736 sec)
------------------------------------------------------------
[9] iInChip Send: 2.1323 Mbps(3880723 bytes, 13.8855 sec)
iInChip Recv: 2.2160 Mbps(3880723 bytes, 13.3608 sec)
-------------------------------------------------------




[CANTUS EX EVM]  W5100 외부 메모리로 제어하기 - W5100 Direct Mode TCP전송 속도



[CANTUS-EX EVM] 보드의 W5200 CS는 nCS2(6008_0000h)에 할당되어 있다.




일단 간단히 W5100 제어 레지스터에 값을 읽고 쓰는 테스를 해 보자
 #define COMMON_BASE                              0x60080000
#define SHAR0                                                 (COMMON_BASE + 0x0009)


while(1)
{
        //W5100 MAC 레지스터에 값 쓰기
        *((vuint8*)(COMMON_BASE+SHAR0 )) = data;
        Delay(500);

        //MAC 레즈스터값 읽기
        temp =  *((vuint8*)(COMMON_BASE+SHAR0 ));
        DebugPrint("read=%x\r\n", tenp);
       Delay(500);
}



정상 동작한다.

W5100 TCP Server 루프백 테스트 예제를 포팅하여 테스트 해 보았다.

의외로 속도가 그리 빠르지 않다.
옵티마이즈나? 메모리 타이밍 설정이 필요 할것 같다.
[7] iInChip Send: 4.8839 Mbps(1193338 bytes, 1.8642 sec)
iInChip Recv: 4.0566 Mbps(1193338 bytes, 2.2443 sec)
------------------------------------------------------------
[8] iInChip Send: 4.3536 Mbps(1193338 bytes, 2.0913 sec)
iInChip Recv: 4.0821 Mbps(1193338 bytes, 2.2303 sec)
--------------------------------------------------------




한가지 문제가 발생했다.
데이터 전송을 잘 되는데... 수신이 문제가 있는것 같다.(송신이 이상한가?)
루프백 테스트시 read에서 invaild가 발생한다.

물론 한번에 100000Byte 이상 보내는것은 문제가 없이 송수신된다.

PC 소프트웨어 문제이가?
하드웨어적 이상인가?

패킷 캡쳐해본 결과 데이터 자체는 문제가 없는것 같다. 송수신 데이터는 같은데...
소프트웨어 문제 인가?

10kbye정도의 작은 데이터 전소 성공후 또 잘 된다.
메모리 엑세스 타이밍 조절으로 최대 6.2Mbps까지 출력은 되는데...
기대하던 속도는 아니다.(이정도면 SPI 방식보다 그리 빠르지 않은데... 뭔가 좀 이상하다.)




옵티마이즈와 메모리 엑세스 타이밍을 적절히 조절 후 최종 7MBps이상 나온다.
한가지 의심스러운것은 direct모드와 indirect 모드에서 속도차이가 별로 나지 않는다는 것인데... 그렇다면 어쩌면 속도는 더 나올지도 모르겠다.

[1] iInChip Send: 7.4276 Mbps(11983617 bytes, 12.3092 sec)
iInChip Recv: 7.4303 Mbps(11983617 bytes, 12.3048 sec)
------------------------------------------------------------

[DSP28335 EVM] Hardware TCP/IP W5300 TCP전송 테스트 - TMS320F28335 [EXP-ALL EVM]



[EXP-ALL EVM] 보드에는 wiznet사의 고속 Hardwired TCP/IP  W5300모듈을 연결할 수 있다.
TMS320F28335 외부 메모리 인터페이스로 제어 하면 고속의 이더넷 데이터를 전송할 수 있기 때문에 여러가지 실험해 볼것이 많을것 같다.
(좀더 자세한 내용은 TM320F28335 W5300포팅 참고)

[EXP-ALL EVM] 의 W5300모듈 연결 회로도
TMS320F28335는 16비트 모드를 지원하기 때문에 R49, R1을 제거한다. W5300의 CS는 TMS320F28335 의 CS0에 연결한다.





TMS320F28335를 이용하여 W5300 TCP 서버 루푸백 전송 속도 테스트 결과
대략 28Mbps 정도 출력된다.  55Mbyte 동영상 전송시 15초 정도 걸린다.
저렴하고 OS없는 임베디드 보드에서 간단한 코드로 TCP전송 속도가 이정도 이면.. 상당히 빠르다. (참고로 ARM9 2410으로 테스트시 45Mbps정도 나온다) .
물론 비교 대상은 아니지만 ATmega128(8Mhz) 에서 W5300 속도 테스트 결과(2.6Mbps)와 비교해 보면 아주 많은 차이가 난다.







TCP Server 처리 함수
Wiznet칩 제어를 위한 함수를 통합했다. 앞으로 손을 좀더 봐야 겠지만 이 코드로 수정 해 나갈 예정인다.
//-----------------------------------------------------------------------------
//TCP Server 처리함수
void ProcessTCPS(SOCKET s, unsigned int port)
{
 unsigned long len;
 unsigned int mode = 0;

 //TCP SOCKET status
 switch(getSn_SSR(s))               
 {     
  //초기에
  case SOCK_INIT:
   //접속대기
   temp = listen(s);
   if(!gTcpStatus)DebugPrint("%d : LOOPBACK_TCPS(%d) Started.\r\n",s,temp);
   gTcpStatus = 1;
   break; 
  
  // Socket CLOSED일 경우
  case SOCK_CLOSED:
   
   //닫고
   _close(s);  //C2000에서 close() 함수는 예약되어 있어서 함수명 변경했다.
  
   //새롭게 Open
   DebugPrint("TCP Server Opne.\r\n");
   socket(s,Sn_MR_TCP,port,mode);
   gTcpStatus = 0;
   break;
   
  //ESTABLISH?
  case SOCK_ESTABLISHED:          
   //수신된 데이터가 있으면
   if((len=getSn_RX_RSR(s)) > 0)
   {
    //수신하고
    len = recv(s,data_buf,len);

    //재전송(루프백 테스트)
    send(s, data_buf, len);
   }
   break;

  // PASSIVE CLOSED
  case SOCK_CLOSE_WAIT:              
    disconnect(s);
    break; 
  
  default:
   break;
 }
}
//-----------------------------------------------------------------------------



W5300초기화 함수
//WIZENT Chip 초기화함수
void IINCHIP_NetInit(void)
{
 uint8 tx_mem_conf[8] = {8,8,8,8,8,8,8,8};          // for setting TMSR regsiter
 uint8 rx_mem_conf[8] = {8,8,8,8,8,8,8,8};          // for setting RMSR regsiter

 unsigned char addr[6] = MY_NET_MAC;

 //initiate W5300
 iinchip_init(); 

 /* allocate internal TX/RX Memory of W5300 */
 if(!sysinit(tx_mem_conf,rx_mem_conf))          
 {
  DebugPrint("MEMORY CONFIG ERR.\r\n");
  while(1);
 }

 // If Little-endian, set MR_FS.
    setMR(getMR() | MR_FS|BIT10|BIT11|BIT12);
 Delay(100);

 //set MAC
 IINCHIP_SET_MAC(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); 

 //set subnet
    MY_SUBNET_SET();
 IINCHIP_SET_SUB(addr[0], addr[1], addr[2], addr[3]);
 
 //set Gateway
    MY_GWIP_SET(); 
 IINCHIP_SET_GAR(addr[0], addr[1], addr[2], addr[3]);
 
 //set IP
    MY_IP_SET();
 IINCHIP_SET_IP(addr[0], addr[1], addr[2], addr[3]); 
}



TMS320F28335 W5300 TCP Server 테스트 예제코드
void main(void)
{
 short data = 0;
 unsigned int flag = 0;

 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

 DebugInit(BAUD_115200);
 DebugPrint("W5300 Test\r\n");

 //TMS320F28335 외부 메모리 초기화
 init_zone();  

 //W5300 초기화
 IINCHIP_NetInit();
 DisplayConfig();

 while(1)
 {
  //TCP 서버 루프백 처리함수
  ProcessTCPS(SOCK_TCPS, MY_LISTEN_PORT); 
 }
}  


블로그 이미지

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)