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