wiz820sio(w5100s) client 동작

wiz820sio 모듈을 사용하고있습니다.

wiz820sio(server) - pc(client) 간의 통신은 확인하였는데요,

wiz820sio가 client 동작을 하기위해서는 어떻게 해야하는지 모르겠네요…

wiznet의 socket.c소스를보니 connect 함수가 있던데,

socket → connect 순서가 맞지않나요?
socket함수를 보니 port를 생성하더라구요…

이건 server동작할때 동작할 포트로 보이는데,

client 동작할때는,
소켓 생성하고 그 소켓으로 connect할때, 주소와 port를 사용해서 하지않나요…?

결론은 w5100s 칩에서 tcp_ip client 동작은 어떻게 하는걸까요!?

안녕하세요

server 동작을할때는
socket → listen

client 동작을 할때는
socket → connect 입니다.

socket에서 적어준 port는 wiz820sio(client)의 port이며
connect에서는 server port를 적어주시면 됩니다.

감사합니다!!
잠깐 혼동이 왔던거같아요!

tcps는 server
tcpc는 client 예제코드입니다.
참고하시면 좋을 것 같습니다.

혹시 인터럽트 사용하는 예제코드는 없나요…?

지금 Server로 사용시 While문 돌면서 데이터 수신을 기다리고있거든요…

상당히 안좋아보여 인터럽트를 사용하려고합니다…

안녕하세요
인터럽트는 MCU마다 다르기때문에 안타깝게도 없습니다.

하나만 더 여쭤봐도될까요?

데이터 수신 시, INTn 핀이 GPIO로 0,1 동작하는지 궁금합니다.

오실로스코프가 없어서 볼수가 없네요…

mbed os 에서 코드 작성중인데요,
INTn 핀이 데이터 수신 이벤트때 0 또는 1로 동작한다면,

INTn 핀과 연결된 MCU핀을 인터럽트로 설정해 주고
풀업 풀다운모드 설정한 뒤 인터럽트 함수 안에서 데이터 수신(ret = recv(sn,buf,size);)하면 되는거죠?

데이터시트에는 이벤트 발생시 LOW가 된다고 나와있는데…

데이터 통신시 왜 인터럽트가 안칠까요…?ㅠㅠ

안녕하세요

Interrupt Masking은 해주셨나요?
Socket Interrupt를 발생시키고 싶은신경우
Sn_IMR, IMR 레지스터 모두 마스킹 해주셔야합니다.
아래 문서 참고하시면 좋을 것 같습니다.
http://wizwiki.net/wiki/lib/exe/fetch.php?media=products:w5100s:application:w5100s_an_interrupt_v110k.pdf

masking 해주는 메소드가 따로있나요?

w5100s.h 파일에

#define IMR (W5100S_IO_BASE + (0x0016)) // Socket Interrupt Mask
#define Sn_IMR(sn) (W5100S_IO_BASE + WIZCHIP_SREG_BLOCK(sn) + (0x002C))

두가지 확인했는데요,

마스킹방법을 모르겠네요…

마스킹 후에

setSn_IR(sn, Sn_IR_RECV);

이렇게 사용하면 RECV할때만 인터럽트가 치나요?
으 모르는게 너무 많네요…ㅜㅜ

wiz810sio 모듈의 INTn 핀을 MCU의 GPIO 핀에 연결하였습니다.
wiz810sio(w5100s)의 인터럽트 레지스터를 마스킹해주고, (해주는 방법을 모르겠어요)
RECV 이벤트 발생시 인터럽트 발생하도록 설정(해주는 방법을 모르겠어요)

RECV 이벤트 발생시 MCU에 연결된 INTn(GPIO) 핀이 HIGH에서 LOW로 상태 바뀌어 인터럽트 발생하고 MCU 인터럽트핸들러(처리함수) 안에서 데이터 수신

하면되는 순서 맞나요…?

datasheet를 보시면 설명 나와있습니다
image
먼저 MR2 레지스터의 6번 bit를 Enable 해주셔야 인터럽트가 발생됐을때 INTn가 Low 됩니다.

image
image
0번 socket을 이용한다고 가정하고
setIMR(0x01);
setSn_IMR(0x04);
위와같이 설정해주실경우 0번 socket의 recv 인터럽트에만 인터럽트가 발생됩니다.

setSn_IR(sn, Sn_IR_RECV);는 Interrupt 를 Clear시키는 역할을 합니다.
Interrupt 발생시마다 clear 해주셔야 다음 interrupt 발생시 동작 합니다.

MCU의 GPIO핀을 인터럽트 Intin 으로 선언하고 하강에지일때 인터럽트 함수가 발생하도록 설정했습니다.
wiz810sio의 INTn 핀은 MCU의 GPIO 핀과 연결했습니다.

그 후 말씀하신대로, 0번 socket을 사용하였구요,

setMR2(0x01) // Enable
setIMR(0x01)
setSn_IMR(0, Sn_IR_RECV) // 0번소켓, RECV 0x04

위처럼 설정하였습니다,
하지만 INTn에서 데이터 RECV 이벤트 때, 아무런 변화 없이 계속 HIGH로 유지되는데요, (오실로스코프로 확인)
추가 설정해줘야할 부분이있을까요?

MR2 레지스터는 6번 bit를 Enable 해주셔야합니다~
setMR2(0x40);으로 셋팅해주셔야합니다
기본값이 0x40이니 별도로 설정안해주셔도 되는부분인데
0x01로는 설정하면 안됩니다.

setIMR(0x01);
setSn_IMR(0, Sn_IR_RECV);

이 두 설정만 하면 된다는말씀이죠…?

이 두 설정만 해줬고 wiz810sio는 Server고,
pc client에서 계속 데이터를 보내는데

인터럽트가 안칩니다…

becky@winzet.io
메일로 코드 보내주시면 확인해드리겠습니다.

becky@winzet.io

메일 맞나요…?
주소가 잘못됬다고 보내지지 않습니다…

오타가있네요 죄송합니다.

becky@wiznet.io입니다

안녕하세요

우선 메일확인했는데
Interrupt Masking을 버스 연결하기전에 하셨네요
PHY LINK 확인하고나서 설정해주시는게 좋을것 같습니다.

베리 굿입니다
도움 주신 덕분에 끝냈습니다

감사합니다