---
title: "W610io + stm32 tcp connection에 대해 문의드립니다."
url: "https://maker.wiznet.io/forum/15352"
markdown_url: "https://maker.wiznet.io/forum/15352/md"
type: "Forum topic"
category: "IO Modules"
author: "limhs727"
created: "2024-11-14T18:01:20+09:00"
last_activity: "2024-11-15T10:28:24+09:00"
language: "en"
views: 5
replies: 1
source: "WIZnet Makers forum (https://maker.wiznet.io/forum/)"
---

# W610io + stm32 tcp connection에 대해 문의드립니다.

## Question

Asked by limhs727 on 2024-11-14 in IO Modules.

W610io 모듈을 stm32보드에 연결해서 loopback 동작을 실습해보고 있습니다. Wiznet의 loopback [github](https://github.com/WIZnet-ioLibrary/W6100EVB_CUBEIDE/blob/master/STM32CubeIDE/Src/main.c)과 [블로그](https://teddywiz.github.io/2019/03/21/2-W6100EVB_loopback_test/)를 참고하고 있는데 막히는 부분이 있어 문의드립니다.

Netinfo를 출력해보았을 때는 설정한 값이 잘 출력되고 칩의 id도 읽히지만, version이 읽히지 않습니다.

```plaintext
< WIZNET Loop Back TEST!! >
PHY OK.
W6100VERSION(200) = ffff          
version : ff
Mac address: 11:22:33:aa:bb:cc
IP address : 192.20.0.200
SN Mask   : 255.255.255.0
Gate way   : 192.20.0.233
DNS Server : 8.8.8.8
```

Github loopback_tcps(1, data_buf, 5000, AS_IPV4);을 실행했을 때 tcp connection timeout 이 출력되며 CMD창에서도 해당 ip로 ping 되지 않고 있습니다.

loopback_tcps을 한 줄씩 실행해보면 getsockopt(sn, SO_STATUS, &status); 이 부분에서 SO_STATUS의 경우에 실행되는 getSn_SR(sn)에 WIZCHIP_READ가 있습니다. 또, 버전을 읽는 gerVer()에서도 WIZCHIP_READ으로 읽고 있습니다. 추측해보기로는, WIZCHIP_READ 이 부분에서 문제가 생기는 것 같습니다.

코드에 이상이 있는지 어떤게 문제인지 잘 모르겠습니다..

```c
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "spi.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "board_init.h"
#include "wizchip_init.h"
#include "../../Drivers/io6Library/Ethernet/wizchip_conf.h"
#include "../../Drivers/io6Library/Ethernet/socket.h"
#include "../../Drivers/io6Library/Ethernet/W6100/w6100.h"
#include "../../Drivers/io6Library/Application/Application.h"
#include "../../Drivers/io6Library/Application/loopback/loopback.h"
#include <stdio.h>
#include <string.h>
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#define True_STD
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
wiz_NetInfo gWIZNETINFO = {
    .mac = {0x11, 0x22, 0x33, 0xaa, 0xbb, 0xcc},  	// Source Hardware Address
    .ip = {192, 20, 0, 200},                     	// W6100 IP Address
    .sn = {255, 255, 255, 0},                     	// Subnet Mask Address
    .gw = {192, 20, 0, 233},                       	// Gateway IP Address
    .dns = {8, 8, 8, 8},                          	// DNS (선택)
    .ipmode = 0x01  // IPv4 only
};

uint8_t WIZ_Dest_IP[4] = {192, 20, 0, 233};

uint8_t data_buf[2048];
uint8_t rxData[2];
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void critical_enter(void);
void critical_exit(void);
void print_network_information(void);
void configure_network_registers(void);

#ifdef KEIL
     #ifdef __GNUC__
     //With GCC, small printf (option LD Linker->Libraries->Small printf
     //set to ''Yes'') calls __io_putchar()
         #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
		#else
				 #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
		#endif /* __GNUC__*/
#endif

#ifdef True_STD
	int _write(int fd, char *str, int len)
	{
		for(int i=0; i<len; i++)
		{
			HAL_UART_Transmit(&huart3, &str[i], 1, 0xFFFF);
		}
		return len;
	}
#endif

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {

    /*
        This will be called once data is received successfully,
        via interrupts.
    */

     /*
       loop back received data
     */
     HAL_UART_Receive_IT(&huart3, rxData, 1);
     HAL_UART_Transmit(&huart3, rxData, 1, 1000);
}

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void csEnable(void)
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
}

void csDisable(void)
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
}

void spiWriteByte(uint8_t tx)
{
	uint8_t rx;
	HAL_SPI_TransmitReceive(&hspi1, &tx, &rx, 1, 10);
}

uint8_t spiReadByte(void)
{
	uint8_t rx = 0, tx = 0xFF;
	HAL_SPI_TransmitReceive(&hspi1, &tx, &rx, 1, 10);
	return rx;
}

void critical_enter(void)
{
  __disable_irq();
}

void critical_exit(void)
{
  __enable_irq();
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_USART3_UART_Init();
  /* USER CODE BEGIN 2 */
  printf("< WIZNET Loop Back TEST!! >\n");

  /* CS function register */
  reg_wizchip_cs_cbfunc(csEnable,csDisable);

  //WIZCHIP Critical Section
  reg_wizchip_cris_cbfunc(critical_enter, critical_exit);

  //WIZCHIP read/write function
  reg_wizchip_spi_cbfunc(spiReadByte, spiWriteByte);

  NETUNLOCK(); 						
  wizchip_setnetinfo(&gWIZNETINFO);
  W6100Initialze();

  uint8_t chip_id[6];
  ctlwizchip(CW_GET_ID, &chip_id);
  HAL_UART_Transmit(&huart3, chip_id, 6, HAL_MAX_DELAY);

  printf("VERSION(%x) = %.2x \r\n", _VER_,getVER());	//getVER()값 안 읽힘

  uint8_t ver;
  ctlwizchip(CW_GET_VER, &ver);
  printf("version : %.2x\n", ver);						//ver 값 안 읽힘
  HAL_UART_Transmit(&huart3, ver, sizeof(ver), HAL_MAX_DELAY);

  print_network_information();

//  wizchip_getnetinfo(&gWIZNETINFO);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  loopback_tcps(1, data_buf, 5000, AS_IPV4);
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 4;
  RCC_OscInitStruct.PLL.PLLN = 50;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
void print_network_information(void)
{
	printf("Mac address: %02x:%02x:%02x:%02x:%02x:%02x\n\r",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2],gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]);
	printf("IP address : %d.%d.%d.%d\n\r",gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);
	printf("SN Mask	   : %d.%d.%d.%d\n\r",gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);
	printf("Gate way   : %d.%d.%d.%d\n\r",gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);
	printf("DNS Server : %d.%d.%d.%d\n\r",gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);
}
/* USER CODE END 4 */
```

## Replies

### Reply 1 by limhs727, 2024-11-15

1,2,3번은 이상이 없음을 확인하였고 spi 통신에도 이상이 없으니 Netinfo를 읽고 쓰는게 가능하다고 판단되어지는데 맞을까요?

```plaintext
< WIZNET Loop Back TEST!! >
PHY OK.
PHY status: Connected
W6100
VERSION(200) = ffff 
version : ff
Mac address: 11:22:33:aa:bb:cc
IP address : 192.20.0.200
SN Mask   : 255.255.255.0
Gate way   : 192.20.0.233
DNS Server : 8.8.8.8
Socket 1 status: 0xff
```

추가로 cmd창에서 netstat 해보면
TCP 172.20.0.233:139 LISTENING
으로 확인됩니다.

---

Source: https://maker.wiznet.io/forum/15352
