현재 wztoe 예제의 loopback을 활용해서 tcp modbus 프레임을 구축해서 다른 MCU와 통신이 되는것을 확인을 한 상황입니다. polling 방식으로 수행을 해서 이를 interrupt 방식으로 수정을 하려고 하는데요
socket의 인터럽트에(Sn_IR(0) = 0x0014로 sendok 및 recv interrupt가 발생을 함에도
w7500x_it.c 의 WZTOE_Handler로 구문이 들어가질 않아서 질문드립니다.
제가 이해하기로는…NVIC_EnableIRQ(WZTOE_IRQn)를 활성화 한 상태에서
interrupt가 발생(ex. Sn_IR(0) = 0x0004 - recv interrupt)하면 w7500x_it.c의 WZTOE_Handler(void)로 들어가서 수행을 하는 것이 아닌가 이해를 했었는데요…
다른 MCU 측에서 데이터를 송신했음에도 불구하고 아무런 액션이 취해지질 않아서 여쭤봅니다…
답변이 늦어 죄송합니다.
Interrupt Handler 을 사용하기 위해서는 NVIC Enable도 해주어야 하지만
해당 레지스터의 인터럽트 Enable 또한 해주어야 합니다.
WZTOE의 Register중에 SIMR(Socket Interrupt Mask Register)가 있습니다.
0번 소켓을 이용하셨으므로 0번 Pin을1로 설정해야합니다.
초기값은 0x0000_0000으로 설정되어 있습니다.
setSIMR(0x01);
위와같이 추가하시면 됩니다.
또한 Interrupt가 발생한 후 해당 인터럽트핀을 클리어 시켜주어야 다음 인터럽트때 작동 합니다.
따라서 WZTOE_Handler에 Sn_IR을 clear해주는 코드를 추가 하셔야 합니다.
setSn_ICR(0, Sn_IR_RECV);
위와 같이 추가하시면 됩니다.
(interrupt mask라고 되어있는 bit는 오타입니다. Interrupt Clear로 보시면 됩니다.)
Socket 0 의 CONNECT, DISCONNECT, RECV, TIMEOUT, SENDOK 모든 Interrupt 발생 시 Interrupt Handler가 발생합니다.
하지만, WZTOE Handler에서 RECV 에만 Interrupt를 Clear하게 되어있습니다.
따라서 처음 Connect 인터럽트 발생 후 Connect Interrupt가 Clear되지 않아 다음 Handler가 정상 동작하지 않습니다.
setSn_ICR(0, Sn_IR_RECV);
가아닌 setSn_ICR(0, 0xff);
로 작성해주세요