---
title: "w5100 interrupt 발생 시점"
url: "https://maker.wiznet.io/forum/14313"
markdown_url: "https://maker.wiznet.io/forum/14313/md"
type: "Forum topic"
category: "Ethernet Chips"
author: "drkim"
created: "2021-07-29T07:46:27+09:00"
last_activity: "2021-08-03T00:56:13+09:00"
language: "en"
views: 810
replies: 5
source: "WIZnet Makers forum (https://maker.wiznet.io/forum/)"
---

# w5100 interrupt 발생 시점

## Question

Asked by drkim on 2021-07-29 in Ethernet Chips.

안녕하세요.
W5100 을 사용해 TCP/IP 통신을 하고 있고, i/o lib 은 Ver 1.9를 사용 중입니다.

사용 도중, socket.h 의 send() API 를 non-blocking 으로 수정 및 사용하고 싶은데, 문의 드릴 것이 있어
글 남기게 되었습니다.

```
/**
@brief  This function used to send the data in TCP mode
@return 1 for success else 0.
*/
uint16 send(
  SOCKET s,     /**< the socket index */
  const uint8 * buf,  /**< a pointer to data */
  uint16 len    /**< the data size to be send */
  )
{
  uint8 status=0;
  uint16 ret=0;
  uint16 freesize=0;
#ifdef __DEF_IINCHIP_DBG__
  printf("send()\r\n");
#endif

   if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size.
   else ret = len;

   // if freebuf is available, start.
  do
  {
    freesize = getSn_TX_FSR(s);
    status = IINCHIP_READ(Sn_SR(s));
    if ((status != SOCK_ESTABLISHED) && (status != SOCK_CLOSE_WAIT))
    {
      ret = 0;
      break;
    }
#ifdef __DEF_IINCHIP_DBG__
    printf("socket %d freesize(%d) empty or error\r\n", s, freesize);
#endif
  } while (freesize < ret);

      // copy data
  send_data_processing(s, (uint8 *)buf, ret);
  **IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND);**
=> 이 부분에서, send 명령 후 Sn_IR 확인을 통해 SEND_OK interrupt 를 확인하는 것으로 보이는데,
      이 interrupt 발생 시점이 data 전송 후, ACK 를 통해 전송 완료 확인까지 한 뒤인가요?
      만약, 통신 오류로 ACK 를 받지 못한 경우에도 SEND_OK 가 발생하는지, 그리고 ACK 를 받지 못한 경우,
     자체적으로 RCR, RTR 에 따라 Retry 를 시도한 뒤, Timeout Interrupt 를 발생하나요?

  /* +20071122[chungs]:wait to process the command... */
  while( IINCHIP_READ(Sn_CR(s)) )
    ;
  /* ------- */

/* +2008.01 bj */
#ifdef __DEF_IINCHIP_INT__
  while ( (getISR(s) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK )
#else
  while ( (IINCHIP_READ(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK )
#endif
  {
    /* m2008.01 [bj] : reduce code */
    if ( IINCHIP_READ(Sn_SR(s)) == SOCK_CLOSED )
    {
#ifdef __DEF_IINCHIP_DBG__
      printf("SOCK_CLOSED.\r\n");
#endif
      close(s);
      return 0;
    }
    }
/* +2008.01 bj */
#ifdef __DEF_IINCHIP_INT__
    putISR(s, getISR(s) & (~Sn_IR_SEND_OK));
#else
  IINCHIP_WRITE(Sn_IR(s), Sn_IR_SEND_OK);
#endif
    return ret;
}
```

질문
**IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND);**
=> 이 부분에서, send 명령 후 Sn_IR 확인을 통해 SEND_OK interrupt 를 확인하는 것으로 보이는데,
이 interrupt 발생 시점이 data 전송 후, ACK 를 통해 전송 완료 확인까지 한 뒤인가요?
만약, 통신 오류로 ACK 를 받지 못한 경우에도 SEND_OK 가 발생하는지, 그리고 ACK 를 받지 못한 경우,
자체적으로 RCR, RTR 에 따라 Retry 를 시도한 뒤, Timeout Interrupt 를 발생하나요?

## Replies

### Reply 1 by louis, 2021-07-30

안녕하세요.

Sn_IR은 소켓의 상태변화나 Command 수행 결과를 알려줍니다.

1. 이 부분에서, send 명령 후 Sn_IR 확인을 통해 SEND_OK interrupt 를 확인하는 것으로 보이는데,
   이 interrupt 발생 시점이 data 전송 후, ACK 를 통해 전송 완료 확인까지 한 뒤인가요?
   = Sn_CR 커멘트 레지스터가 Send를 완료했을 경우 SEND OK Interrupt가 발생합니다.

2. RCR, RTR 에 따라 Retry 를 시도한 뒤, Timeout Interrupt 를 발생하나요?
   = ARP 또는 TCP 통신 과정에서 Sn_RCR(Socket Retransmission Count Register)이상의 재전송이 발생하면 Timeout이 발생합니다

감사합니다.

### Reply 2 by drkim, 2021-07-30 (in reply to reply 1)

우선, 답변 감사드립니다 ![:slight_smile:](https://emoji.discourse-cdn.com/twitter/slight_smile.png?v=12)

해주신 답변 중, “Sn_CR 커멘트 레지스터가 Send를 완료했을 경우” 라는 것이

[![image](https://maker.wiznet.io/forum_uploads/wiznet/original/2X/6/6bd2c7928cd351a13846f4f68a0831b9bc515983.png) image838×180 49.1 KB](https://maker.wiznet.io/forum_uploads/wiznet/original/2X/6/6bd2c7928cd351a13846f4f68a0831b9bc515983.png)

위 그림처럼 전송한 data 를 받은 상대방이 회신한 ACK 를 수신하게 되는 시점 직후를 의미하는 것인지,
아니면 data 를 전송한 시점을 나타내는 것인지 궁금합니다.

### Reply 3 by louis, 2021-07-30

Data를 ACK로 수신한 직후에 Interrupt가 발생하는 것이 아니고 현재 전송한 시점을 기준으로 SEND OK interrupt가 발생하는 것 입니다.

감사합니다

### Reply 4 by drkim, 2021-07-30

그렇다면 두 번째 답변이었던, “ARP 또는 TCP 통신 과정에서 Sn_RCR(Socket Retransmission Count Register)이상의 재전송이 발생하면 Timeout이 발생합니다” 에 대해서
data 전송 이후, ACK 를 받지 못한 상태로 RTR 이 만료된 경우에 Retry 를 발생하는 것으로 이해하면 될까요?

### Reply 5 by louis, 2021-07-30

네, 상대방이 응답이 없을 경우에 Retransmission이 발생합니다.
상대방이 응답을 수신할 때까지 설정된 RTR (Retransmission Time Register)시간 값에 따라 Packet을 전송하고 지정된 RCR (Retransmission count register)을 초과하면 Timeout이 발생합니다.

감사합니다

---

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