cancel
Showing results for 
Search instead for 
Did you mean: 

stm32h7 spi dma receive error

gcaif
Associate II

I want to use w5500 on stm32h7 board. Using HAL_SPI_Transmit_DMA() can send msg sucess.But Using HAL_SPI_Receive_DMA() can receive data sucess one time,and run second time,the DMA status is busy tx,and the lock status is locked.

the picture is w5500 receive data timing0693W000005Cq2mQAC.png

1 REPLY 1
Ayuks.1
Associate II

when debug, everything is good and working. but If I shut down the computer then I cannot connect to the processor again. When you enter the ethernet settings from the control panel and turn the ethernet off and on, it works normally again. how to solve this error. can you help me. my mcu is working tcp server mode. ı am using tcp comunication.

ı am using stm32f407vg .w5500 module .

my code

/* Open socket 0 as TCP_SOCKET with port 5000 /

if((retVal = socket(0, Sn_MR_TCP, 80, SF_TCP_NODELAY)) == 0) {

/ Put socket in LISTEN mode. This means we are creating a TCP server /

if((retVal = listen(0)) == SOCK_OK) {

/ While socket is in LISTEN mode we wait for a remote connection */

while(sockStatus = getSn_SR(0) == SOCK_LISTEN)

delay(600);

/* OK. Got a remote peer. Let's send a message to it */

while(1) {

/* If connection is ESTABLISHED with remote peer */

if(sockStatus = getSn_SR(0) == SOCK_ESTABLISHED) {

/* Retrieving remote peer IP and port number */

getsockopt(0, SO_DESTIP, remoteIP);

getsockopt(0, SO_DESTPORT, (uint8_t*)&remotePort);

sprintf(msg, CONN_ESTABLISHED_MSG, remoteIP[0], remoteIP[1], remoteIP[2], remoteIP[3], remotePort);

PRINT_STR(msg);

while(received_len==0)

{

if((RSR_len = getSn_RX_RSR(0) )> 0)

{

received_len = recv(0, data_buf, RSR_len);

if(data_buf[0] == 1)

{

HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_15);

sprintf(msg,"adc degeri %d",adc_ntc[0]);

send(0, msg, strlen(msg));

}

else

{

sprintf(msg,"adc degeri %d",adc_ntc[0]);

send(0, msg, strlen(msg));

HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_14);

}

}

}

received_len =0;

/* Let's send a welcome message and closing socket */

if(retVal = send(0, GREETING_MSG, strlen(GREETING_MSG)) == (int16_t)strlen(GREETING_MSG))

PRINT_STR(SENT_MESSAGE_MSG);

else { /* Ops: something went wrong during data transfer */

sprintf(msg, WRONG_RETVAL_MSG, retVal);

PRINT_STR(msg);

}

break;

}

else { /* Something went wrong with remote peer, maybe the connection was closed unexpectedly */

sprintf(msg, WRONG_STATUS_MSG, sockStatus);

PRINT_STR(msg);

break;

}

}

} else /* Ops: socket not in LISTEN mode. Something went wrong */

PRINT_STR(LISTEN_ERR_MSG);

} else { /* Can't open the socket. This means something is wrong with W5100 configuration: maybe SPI issue? */

sprintf(msg, WRONG_RETVAL_MSG, retVal);

PRINT_STR(msg);

}

/* We close the socket and start a connection again */

// disconnect(0);

close(0);