STM32F405에서 W5300를 FSMC 방식으로 연결하여 테스트 하기 소스코드를 이용하여 W5300 TCP Loopback 전송속도 테스트 를 해보자
W5300을 이용하여 TCP loopback 테스트를 하기 위해 loopback.c 파일을 사용하면 된다.
먼저 네트워크 환경을 wiz_NetInfo 구조체에 할당하고 초기화 코드를 작성해 준다.
wiz_NetInfo gWIZNETINFO = {
.mac = {0x00, 0x08, 0xdc, 0, 0, 0},
.ip = {172, 30, 1, 104},
.sn = {255, 255, 0, 0},
.gw = {172, 30, 1, 254},
.dns = {0, 0, 0, 0},
.dhcp = NETINFO_STATIC
};
void Reset_W5300()
{
HAL_GPIO_WritePin(RESET_W5300_GPIO_Port, RESET_W5300_Pin, GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(RESET_W5300_GPIO_Port, RESET_W5300_Pin, GPIO_PIN_SET);
HAL_Delay(100);
}
void W5300_write(uint32_t addr, iodata_t wd)
{
_W5300_DATA(addr) = wd;
}
iodata_t W5300_read(uint32_t addr)
{
return _W5300_DATA(addr);
}
void _InitW5300(void)
{
unsigned int tmpaddr[4];
Reset_W5300();
reg_wizchip_bus_cbfunc(W5300_read, W5300_write);
printf("getMR() = %04X\r\n", getMR());
if (ctlwizchip(CW_INIT_WIZCHIP, (void*)wiznet_memsize) == -1)
{
printf("W5300 memory initialization failed\r\n");
}
ctlnetwork(CN_SET_NETINFO, (void *)&gWIZNETINFO);
print_network_information();
}
메인 루프에서 loopback_tcps() 함수를 주기적으로 호출 해 TCP 프로토콜을 처리 해 주면 TCP loopback 테스트 펌웨어 코드가 완성된다
int main(void)
{
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_FSMC_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("STM3F4 W5300 Test\r\n");
_InitW5300();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
loopback_tcps(0, ether_buf,3000);
}
/* USER CODE END 3 */
}
프로그램을 실행하면 설정한 네트워크 정보가 표시 되며 TCP loopback server 가 수행된다.
펌웨어가 정상적으로 실행이 되었다면 Wiznet의 Loopback Test Program Ax를 이용하여 네트웍 전송률을 테스트 해볼 수 있다.
[1] iInChip Send: 20.5430 Mbps(12470418 bytes, 4.6314 sec)
iInChip Recv: 20.4434 Mbps(12470418 bytes, 4.6539 sec)
-------------------------------------------------------
#문제 발생
STM32F4의 내장 Ethernet Controller의 TCP loopback 전송률 테스트 결과에서 30Mbps 와 비교 해보면 20Mbps 의 전송 속도는 아쉬움이 있다.
#문제 해결
ioLibrary 는 표준화된 코드이고 다양한 하드웨어를 지원하기 위한 코드로 작성되어 있기 때문에 최대 성능을 사용하려면 하드웨어에 맞도록 최적화가 필요 하다.
네트워크 전송 속도를 높이려면 W5300에 데이터를 최대한 빨리 읽고 써야 하는데 w5300.c 파일에 있는 WIZCHIP_WRITE(), WIZCHIP_READ() 함수를 수정하면 된다.
아래 코드와 같이 수정하면 함수 포인터를 거치는 지연없이 바로 메모리에 접근 할 수 있다.
이부분을 DMA를 사용하면 좀더 성능을 개선할 수 있을것 같다.
WIZCHIP_WRITE() 함수
void WIZCHIP_WRITE(uint32_t AddrSel, uint16_t wb )
{
#if _USE_W5300_OPTIMIZE
_W5300_DATA(AddrSel) = wb;
#else
:
WIZCHIP_READ() 함수
uint16_t WIZCHIP_READ(uint32_t AddrSel)
{
uint16_t ret;
#if _USE_W5300_OPTIMIZE
ret = _W5300_DATA(AddrSel);
#else
:
최적화를 통해 동일한 코드를 실행 하면 62 Mbps(7.7 Mbytes) 의 전송 속도를 확인 할수 있다.
(이 수치는 Host CPU의 속도에 따라 다른것 같다. i7-9700 @3Ghz 기준)
640 x 480 영상의 경우 한프레임이 614400byte(640x480x2) 이므로 7.7Mbyte/s 에서 최대 12프레임 정도 전송할 수 있는 성능이 될것 같다.