인터럽트 문의

전체 코드: github.com/eloiz07/STM_Ethernet

ISR function
void EXTI2_IRQHandler(void)
{
// GPIO interrupt clear
EXTI_ClearITPendingBit(EXTI_Line2);

/**** (Q1) /
//getSn_IR(0x00);
/
***********/

// W5500 interrupt clear
setSn_IR(0x00, 0x1F);
}

Q1. ISR에서 interrupt register를 clear 하기 위해서 setSn_IR(0x00, 0x1F); 를 하는데 있어서
위 코드의 (Q1) 부분인 getSn_IR(0x00); 가 없으면 register가 clear가 정상적으로 되지 않습니다.
처음 1회 인터럽트 발생후 Clear가 되지 않아 인터럽트가 재발생하지 않는 문제가 발생합니다.
뭔가 코드상의 문제가 있는걸까요? 혹시나 해서 setSn_IR 이후에 delay를 주니 또 정상 동작합니다.
원인을 모르겠군요.

Q2. 통신 도중에 “Connection refused by remote host” 에러가 뜨면서 연결이 끊어지는 현상이 자주 있습니다.
폴링 방식의 통신시에는 안생기는데 유난히 인터럽트 형태로 데이터를 수신 하면 발생합니다.

Q3. 인터럽트 마스크 설정을
setSIMR(0x01);
setSn_IMR(0x00, 0x04);
이런식으로 SOCKET 0과 DATA_RECV 인터럽트에 대해서만 활성화를 시켰습니다.
그런데 ISR에서 getSn_IR(0x00) 해서 값을 살펴보면 TIMEOUT 부터 SEND_OK(전혀 보낸 데이터 없는데도 발생) 인터럽트 등이 1로 나타납니다.

Q4. ISR에서 데이터를 1회 이상 수신한 이후에 클라이언트가 Disconnect 한 후 다시 connect를 시도 하면 커넥트가 되지 않습니다.
(TCP connection error :10061 란 응답이 발생합니다) 디버깅 해보면 디스커넥팅을 시도하면 main 함수 내의 루프문 역시 중지 된것을 보면
오버플로우 같은것이 발생한것 같은데 제가 interrupt register clear를 잘못하고 있는지 알 수 있을까요?