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.