STM32 +w5500 (slave) issue

Hi all, I have a connection problem about stm32 + w5500 as slave. When I am debugging, socket is not opening. Here my codes:

/* USER CODE BEGIN Header /
/
*


  • @file : main.c
  • @brief : Main program body

  • @attention
  • Copyright (c) 2024 STMicroelectronics.
  • All rights reserved.
  • This software is licensed under terms that can be found in the LICENSE file
  • in the root directory of this software component.
  • If no LICENSE file comes with this software, it is provided AS-IS.

/
/
USER CODE END Header /
/
Includes ------------------------------------------------------------------*/
#include “main.h”

/* Private includes ----------------------------------------------------------/
/
USER CODE BEGIN Includes /
#include “wizchip_conf.h”
#include “socket.h”
#include “loopback.h”
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
/
USER CODE END Includes */

/* Private typedef -----------------------------------------------------------/
/
USER CODE BEGIN PTD */

/* 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 ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;

SPI_HandleTypeDef hspi1;

/* USER CODE BEGIN PV /
const uint8_t MASTER_IP[] = {192,168,0,101};
/
USER CODE END PV */

/* Private function prototypes -----------------------------------------------/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
static void MX_ADC1_Init(void);
/
USER CODE BEGIN PFP */
uint8_t function3(uint8_t *request,uint8_t *response);
uint8_t function4(uint8_t *request,uint8_t response);
/
USER CODE END PFP */

/* Private user code ---------------------------------------------------------/
/
USER CODE BEGIN 0 */
void delay(void){
for(uint32_t i=0;i<250000;i++);
}
void cs_sel() {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET); //CS LOW
}

void cs_desel() {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); //CS HIGH
}

uint8_t spi_rb(void) {
uint8_t rbuf;
HAL_SPI_Receive(&hspi1, &rbuf, 1, 0xFFFFFFFF);
return rbuf;
}

void spi_wb(uint8_t b) {
HAL_SPI_Transmit(&hspi1, &b, 1, 0xFFFFFFFF);
}

/* USER CODE END 0 */

/**

  • @brief The application entry point.
  • @retval int
    /
    int main(void)
    {
    /
    USER CODE BEGIN 1 /
    uint8_t bufSize[] = {2,2,2,2,2,2,2,2};
    /
    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_ADC1_Init();
/
USER CODE BEGIN 2 */

wizchip_init(bufSize, bufSize);
wiz_NetInfo netInfo = { .mac = {176, 45, 176, 62, 49, 219}, // Mac address
.ip = {192, 168, 0, 150}, // IP address
.sn = {255, 255, 255, 0},
.gw = {0,0,0,0}};

wizchip_setnetinfo(&netInfo);
//wizchip_getnetinfo(&netInfo);

reg_wizchip_cs_cbfunc(cs_sel, cs_desel);
reg_wizchip_spi_cbfunc(spi_rb, spi_wb);

uint8_t s=0;

uint8_t listen_socket;
uint8_t cevap;
uint8_t connect_status;

uint8_t *request_message; //Message from master
uint8_t *response_message; //Response message from server to master
cevap = socket(s, Sn_MR_TCP, (uint16_t)502, SF_TCP_NODELAY);

if(cevap == SOCK_OK){
		  /* Put socket in LISTEN mode.*/
			listen_socket = listen(s);
			if(listen_socket == SOCK_OK){
				//We connect to client(master)
				connect_status = connect(s, (uint8_t *)MASTER_IP, 502);
				for(uint8_t i=0;i<10;i++){
					  HAL_GPIO_TogglePin(kirmizi_led_GPIO_Port, kirmizi_led_Pin);
					  delay();
					  HAL_GPIO_TogglePin(yesil_led_GPIO_Port, yesil_led_Pin);
					  delay();
					  HAL_GPIO_TogglePin(turuncu_led_GPIO_Port, turuncu_led_Pin);
					  delay();
					  HAL_GPIO_TogglePin(mavi_led_GPIO_Port, mavi_led_Pin);
					  delay();
				}
				if(connect_status == SOCK_OK){
					recvfrom(s,(uint8_t *)&request_message, 12, (uint8_t *)MASTER_IP, (uint16_t *)502);
					if(request_message[6] == 1){
						switch(request_message[7]){
							case 0x3:
								function3((uint8_t *)&request_message,(uint8_t *)&response_message);
								break;
							case 0x4:
								function4((uint8_t *)&request_message,(uint8_t *)&response_message);
								break;
						}
					}
				}else{
					while(1){
						  HAL_GPIO_TogglePin(turuncu_led_GPIO_Port, turuncu_led_Pin);
						  delay();
						  HAL_GPIO_TogglePin(kirmizi_led_GPIO_Port, kirmizi_led_Pin);
						  delay();
					}
				}
			}else{
				while(1){
				  HAL_GPIO_TogglePin(turuncu_led_GPIO_Port, turuncu_led_Pin);
				  delay();
				  HAL_GPIO_TogglePin(mavi_led_GPIO_Port, mavi_led_Pin);
				  delay();
				}
			}
	  }else{
		  while(1){
			  HAL_GPIO_TogglePin(kirmizi_led_GPIO_Port, kirmizi_led_Pin);
			  delay();
			  HAL_GPIO_TogglePin(yesil_led_GPIO_Port, yesil_led_Pin);
			  delay();
		  }
	  }

/* USER CODE END 2 */

/* Infinite loop /
/
USER CODE BEGIN WHILE /
while (1){
/
USER CODE END WHILE /
/
Open socket 0 as TCP_SOCKET with port 502 */

/* USER CODE BEGIN 3 */

}
/* 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_SCALE1);

/** 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 = 82;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    RCC_OscInitStruct.PLL.PLLQ = 7;
    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_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

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

/**

  • @brief ADC1 Initialization Function
  • @param None
  • @retval None
    */
    static void MX_ADC1_Init(void)
    {

/* USER CODE BEGIN ADC1_Init 0 */

/* USER CODE END ADC1_Init 0 */

ADC_ChannelConfTypeDef sConfig = {0};

/* USER CODE BEGIN ADC1_Init 1 */

/* USER CODE END ADC1_Init 1 */

/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}

/** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
/
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/
USER CODE BEGIN ADC1_Init 2 */

/* USER CODE END ADC1_Init 2 */

}

/**

  • @brief SPI1 Initialization Function
  • @param None
  • @retval None
    */
    static void MX_SPI1_Init(void)
    {

/* USER CODE BEGIN SPI1_Init 0 */

/* USER CODE END SPI1_Init 0 */

/* USER CODE BEGIN SPI1_Init 1 */

/* USER CODE END SPI1_Init 1 /
/
SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */

/* USER CODE END SPI1_Init 2 */

}

/**

  • @brief GPIO Initialization Function
  • @param None
  • @retval None
    */
    static void MX_GPIO_Init(void)
    {
    GPIO_InitTypeDef GPIO_InitStruct = {0};

/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();

/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOD, mavi_led_Pin|yesil_led_Pin|turuncu_led_Pin|kirmizi_led_Pin
|CS_Pin_Pin, GPIO_PIN_RESET);

/*Configure GPIO pins : mavi_led_Pin yesil_led_Pin turuncu_led_Pin kirmizi_led_Pin
CS_Pin_Pin */
GPIO_InitStruct.Pin = mavi_led_Pin|yesil_led_Pin|turuncu_led_Pin|kirmizi_led_Pin
|CS_Pin_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

uint8_t function3(uint8_t *request,uint8_t *response){
uint8_t s=0;

uint16_t temp_quan,temp_start_address;
temp_quan = 0x0;
temp_start_address = 0x0;

temp_quan |= request[10];
temp_quan <<=8;
temp_quan |= request[11];

if( (temp_quan >= 0x1) || (temp_quan <= 0x7D)){
	temp_start_address |= request[8];
	temp_start_address <<=8;
	temp_start_address |= request[9];
	if((temp_start_address <= 40001) && ((temp_start_address + temp_quan) <= 50000)){ //?????????
		//Request processing
		for(uint8_t i=0;i<8;i++){
			response[i] = request[i];
		}

		//response[0] = request[0];		//Transaction ID high byte
		//response[1] = request[1];		//Transaction ID low byte
		//response[2] = request[2];		//Protocol ID high byte
		//response[3] = request[3];		//Protocol ID low byte
		//response[4] = request[4];  	//Message length high byte
		//response[5] = request[5];		//Message length low byte
		//response[6] = request[6]; 	//Device address match
		//response[7] = request[7];     //Function code

		response[8] = 2*temp_quan;  //Assume that 1 analog output (AO0)

		uint16_t adc_value;

		adc_value = (uint16_t)HAL_ADC_GetValue(&hadc1); //Get ADC value from ADC1_IN1. This is our AO0 value

		response[9] = (adc_value >> 8) & 0xFF; 			//High byte of AO0  //set parameter is ok
		response[10] = adc_value && 0xFF;				//Low byte of AO0

		if(response[8] >= 1){
			return sendto(s, response, 11, (uint8_t *)MASTER_IP, 502);
		}else{
			while(1){
				HAL_GPIO_TogglePin(mavi_led_GPIO_Port, mavi_led_Pin); //Error exception 4
				delay();
			}
			return 4;
		}
	}else{
		while(1){
			HAL_GPIO_TogglePin(turuncu_led_GPIO_Port, turuncu_led_Pin); //Error exception 3
			delay();
		}
		return 3;
	}
}else{
	while(1){
		HAL_GPIO_TogglePin(yesil_led_GPIO_Port, yesil_led_Pin); //Error exception 2
		delay();
	}
	return 2;
}

}

uint8_t function4(uint8_t *request, uint8_t *response){
uint8_t s=0;

uint8_t temp_quan,temp_start_address;
temp_quan = 0x0;
temp_start_address = 0x0;

temp_quan |= request[10];
temp_quan <<=8;
temp_quan |= request[11];

if( (temp_quan >= 0x1) || (temp_quan <= 0x7D)){
	temp_start_address |= request[8];
	temp_start_address <<=8;
	temp_start_address |= request[9];
	if((temp_start_address <= 40001) && ((temp_start_address + temp_quan) <= 50000)){
		//Request processing
		for(uint8_t i=0;i<8;i++){
			response[i] = request[i];
		}

		//response[0] = request[0];		//Transaction ID high byte
		//response[1] = request[1];		//Transaction ID low byte
		//response[2] = request[2];		//Protocol ID high byte
		//response[3] = request[3];		//Protocol ID low byte
		//response[4] = request[4];  	//Message length high byte
		//response[5] = request[5];		//Message length low byte
		//response[6] = request[6]; 	//Device address match
		//response[7] = request[7];     //Function code

		response[8] = 2*temp_quan;  //Assume that 1 analog output (AO0)

		uint16_t adc_value;

		adc_value = (uint16_t)HAL_ADC_GetValue(&hadc1); //Get ADC value from ADC1_IN1. This is our AO0 value

		response[9] = (adc_value >> 8) & 0xFF; 			//High byte of AO0
		response[10] = adc_value && 0xFF;				//Low byte of AO0


		if(response[8] >= 1){
			return sendto(s, response, 11, (uint8_t *)MASTER_IP, 502);
		}else{
			while(1){
				HAL_GPIO_TogglePin(mavi_led_GPIO_Port, mavi_led_Pin); //Error exception 4
				delay();
			}
			return 4;
		}
	}else{
		while(1){
			HAL_GPIO_TogglePin(turuncu_led_GPIO_Port, turuncu_led_Pin); //Error exception 3
			delay();
		}
		return 3;
	}
}else{
	while(1){
		HAL_GPIO_TogglePin(yesil_led_GPIO_Port, yesil_led_Pin); //Error exception 2
		delay();
	}
	return 2;
}

}

/* USER CODE END 4 */

/**

  • @brief This function is executed in case of error occurrence.
  • @retval None
    /
    void Error_Handler(void)
    {
    /
    USER CODE BEGIN Error_Handler_Debug /
    /
    User can add his own implementation to report the HAL error return state /
    __disable_irq();
    while (1)
    {
    }
    /
    USER CODE END Error_Handler_Debug */
    }

#ifdef USE_FULL_ASSERT
/**

  • @brief Reports the name of the source file and the source line number
  •     where the assert_param error has occurred.
    
  • @param file: pointer to the source file name
  • @param line: assert_param error line source number
  • @retval None
    */
    void assert_failed(uint8_t file, uint32_t line)
    {
    /
    USER CODE BEGIN 6 /
    /
    User can add his own implementation to report the file name and line number,
    ex: printf(“Wrong parameters value: file %s on line %d\r\n”, file, line) /
    /
    USER CODE END 6 /
    }
    #endif /
    USE_FULL_ASSERT */
    We can not communicate with stm32+w5500 (as server mode). Host device (client)'s IP address is “192.168.0.101”. What do I wrong? Any help very help to me.