W5100 사용하려고 데이터 시트와 W5100E01-AVR 예제 코드 보고 공부중입니다.
궁금한 점은 추가 적으로 받았던 문서중에 “3150Aplus_5100_errata_kr_v2.4.pdf” 라는 문서가 존재하는데
해당 문서의 Errata 2, 3번 을 보고 W5100E01-AVR 예제 코드를 보면서 생겼습니다. (정확히는 socket.c )
해당 문서의 2번에 문제를 기술후 solution으로 기제된 답에 따르면
<
이 Erratum을 피하기 위해 TCP의 “Connect”명령과 UDP의 “SEND”명령을
제외하고 항상 subnet mask register의 값을 0으로 유지한다. TCP connect명
령과 UDP send명령은 ARP패킷을 송신하기 때문에 위 그림처럼 유효한
subnet mask 값을 전역변수에 저장해두고 TCP connect와 UDP send명령을
수행할 때만 subnet mask register값을 설정하고 명령이 완료되면 다시
subnet mask register값을 0으로 clear한다.
위의 내용을 적용했을 경우에는 Subnet broadcasting이 되지 않는다.
으로 되어있습니다. 그런데 제공되는 socket.c의 코드를 보게되면
uint8 connect(SOCKET s, uint8 * addr, uint16 port)
{
uint8 ret;
if(
((addr[0] == 0xFF) && (addr[1] == 0xFF) && (addr[2] == 0xFF) && (addr[3] == 0xFF)) ||
((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) ||
(port == 0x00)
)
{
ret = 0;
}
else
{
ret = 1;
// set destination IP, 목적지 IP 설정, 포트 설정
IINCHIP_WRITE(Sn_DIPR0(s),addr[0]);
IINCHIP_WRITE((Sn_DIPR0(s) + 1),addr[1]);
IINCHIP_WRITE((Sn_DIPR0(s) + 2),addr[2]);
IINCHIP_WRITE((Sn_DIPR0(s) + 3),addr[3]);
IINCHIP_WRITE(Sn_DPORT0(s),(uint8)((port & 0xff00) >> 8));
IINCHIP_WRITE((Sn_DPORT0(s) + 1),(uint8)(port & 0x00ff));
// m2012.03.13 [ys]: set/clear subnet for ARP Errata
[color=#FF0000]clearSUBR();[/color]
IINCHIP_WRITE(Sn_CR(s),Sn_CR_CONNECT);
/* m2008.01 [bj] : wait for completion */
while ( IINCHIP_READ(Sn_CR(s)) );
[color=#FF0000]applySUBR();[/color]
}
return ret;
}
으로 되어있는데 설명과는 반대로 Connet 명령을 보낼때만 clear를 하고 명령이 전송된 후에 Set를 하고있는것 처럼 보입니다.
문서와 제공 코드가 서로 다른거 같아서 의문점이 생깁니다.