WIZnet Developer Forum

[w7500] tcp interrupt 관련 문의

안녕하세요
w7500 tcp interrupt 관련하여 질문이 있어서 연락드립니다.

현재 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해주는 코드를 추가 하셔야 합니다.

image
setSn_ICR(0, Sn_IR_RECV);
위와 같이 추가하시면 됩니다.
(interrupt mask라고 되어있는 bit는 오타입니다. Interrupt Clear로 보시면 됩니다.)

감사합니다.

넵 감사합니다!

안녕하세요

부족한 부분이 있어 더 작성합니다.
제가 위에 Guide 한대로 작성 시,

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);
로 작성해주세요

정찬미 드림

2 Likes

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.