W5500 TCP 소켓통신 오류 문제
Ethernet Chips
No replies yet. Be the first to reply.
Join the discussion.
Ethernet Chips
No replies yet. Be the first to reply.
Join the discussion.
Share projects and connect with makers.
Joined before the site update? first.
New to WIZnet Makers?
We sent a verification link to your address. Open it to activate your account, then log in.
Accounts from this email provider are reviewed by an administrator after verification. Approval usually takes one business day.
Already have an account?
Enter your email address. If it belongs to an account, we'll send a link to set a new password. Members who joined before the site update use this to set their password.
If an account uses that address, we sent a link to set a new password. The link works once and expires in 30 minutes.
Know your password?
Need an account?
RE: W5500 TCP 소켓통신 오류 문제
by Grace_Koo WIZnet ·
안녕하세요.
제공해주신 코드에서는 Socket n Register Block과 RX Buffer Block 접근이 혼동된 것으로 보입니다.
(Sn << 5) | 0x08 은 Socket n Register Read입니다.
따라서 Socket 1에서는 0x28이 되며, 이는 Socket 1의 레지스터 영역을 읽는 값입니다.
실제 수신 데이터(payload)는 RX Buffer Block에서 읽어야 하므로, Socket 0은 0x18, Socket 1은 0x38 control byte를 사용해야 합니다.
즉 Sn_RX_RSR, Sn_RX_RD 같은 레지스터를 읽을 때는 0x28이 맞지만, 수신 payload를 읽을 때는 0x38이어야 합니다.
데이터 시트를 다시 참고 부탁드리며,
SPI 파형 또는 디버그 로그로 수신 데이터 read 구간의 control byte가 Socket 1에서 0x38로 나가는지 확인 부탁드립니다.
감사합니다.
RE: RE: W5500 TCP 소켓통신 오류 문제
by namdori ·
우선 답변 달아주신 점 감사드립니다.
맞습니다. 소켓 레지스터는 Read 시에 0x08, 0x28
버퍼는 0x18, 0x38 .. 로 컨트롤 값이 이루어집니다. 소스에 주석 부분에 그렇게 적었습니다.
문제는 같은 함수를 사용하고 Sn 값만 0, 1을 넣어주었을 뿐이라는 겁니다....
소켓 0에서는 제대로 된 값이 수신이 되는데 Sn 값만 1 ~ 7을 넣으면 엉뚱한 데이터가 수신된다는 점입니다.
소켓 버퍼는 8개 2kbyte 씩 설정해 주었습니다.
이상입니다. 감사합니다.
RE: RE: W5500 TCP 소켓통신 오류 문제
by Grace_Koo WIZnet ·
추가 설명 감사합니다.
Control byte가 정상적으로 설정되어 있다면, 다음 확인 포인트는 Read_5500(h_add, l_add, control)에서 사용하는 h_add/l_add 값입니다.
W5500은 control byte의 BSB로 Socket n RX Buffer Block을 선택하므로, RX payload read 시 address phase에는 Socket별 base offset을 더하지 않고
해당 Socket의 Sn_RX_RD 값을 그대로 사용해야 합니다.
예를 들어 Socket 1에서 Sn_RX_RD가 0x0123이면, payload read SPI header는 아래와 같이 나가야 합니다.
즉 주소 계산은 아래와 같은 형태가 되어야 합니다.
그리고 수신 데이터를 읽은 후에는 읽은 길이만큼 Sn_RX_RD를 증가시켜 갱신하고, Sn_CR에 RECV command를 써주어야 합니다.
반대로 아래와 같이 2KB buffer 할당을 고려하여 Socket offset을 더하면 문제가 될 수 있습니다.
Socket 0에서는 offset이 0이므로 정상처럼 보일 수 있지만, Socket 1부터는 잘못된 위치를 읽게 되어 엉뚱한 데이터가 수신될 수 있습니다.
따라서 Socket 1 수신 시 실제 SPI header의 address high/low 값이
Sn_RX_RD와 동일한지, 그리고 control byte가 0x38인지 확인 부탁드립니다.
감사합니다.
RE: RE: W5500 TCP 소켓통신 오류 문제
by namdori ·
답변 감사드립니다.
답변상으로 보면 아래와 같이 계산하면 안된다는 말씀이신가요??
get_offset = S1_RX_RD & S1_RX_MASK;
get_start_address = S1_RX_BASE + get_offset; <-- 이 부분에서 S1_RX_BASE 값을 더해주지 말란 말씀이신거죠??
S1_RX_MASK = 0x07FF(2KB), S1_RX_BASE = 0x0800
예를 들어 S1_RX_RD 값이 0x44 일 경우 get_start_address = 0x844 부터 시작 아닌지요??
h_add = 0x08, l_add = 0x44 가 아니라는 말씀이신데....
UDP 모드로 사용할 때는 위 코드를 사용하여 데이터 수신하였습니다.
물론 그땐 데이터 수신이 정상 동작 하였습니다. 헷갈리네요..
S1_RX_BASE 값을 더해주지 않고 해보았으나 같은 동작입니다. ㅠㅠ
RE: RE: W5500 TCP 소켓통신 오류 문제
by Grace_Koo WIZnet ·
제 설명이 혼동을 드린것같습니다.
공식 ioLibrary 내 함수를 참조 드리면 다음과 같습니다.
https://github.com/Wiznet/ioLibrary_Driver/blob/f6406a7fd2e9e527f702320929dc751ecd5b707a/Ethernet/W5500/w5500.c#L240