이더넷 통신 제품 개발중 W5100을 이용하여 이더넷 통신부분 프로그램 작성중 막히는 부분이 있어 질문 드립니다.
현재 Driver나 예제등을 검토하여 SPI설정후
-
0x0000주소에 0x80을 Write하여 리셋
-
setSHAR(MACAddress);//Write MAC Address unsigned char MACAddress[6] = {0x00, 0x08, 0xdc, 0x01, 0x02, 0x03}; setGAR(GateWay);//unsigned char GateWay[4] = {192, 168, 0, 1}; setSUBR(SubnetMask);//unsigned char SubnetMask[4] = {255, 255, 255, 0}; setSIPR(MySourceIP);//unsigned char MySourceIP[4] = {192, 168, 0, 60}; sysinit(0x55, 0x55); //
설정값 기록
-
Socket if(socket(Socket, Sn_MR_TCP, Port,0X20) == 0) //Fail
{} else //OK { //진입 성공 }
4.접속 시도 if( connect(Socket, MyDestinationIP, Port) == 0) 해당 부분에서 문제 발생
uint8_t connect(SOCKET s, uint8_t * addr, uint16_t port)
{
uint8_t 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
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_t)((port & 0xff00) >> 8));
IINCHIP_WRITE((Sn_DPORT0(s) + 1),(uint8_t)(port & 0x00ff));
// m2012.03.13 [ys]: set/clear subnet for ARP Errata
clearSUBR();
IINCHIP_WRITE(Sn_CR(s),Sn_CR_CONNECT);
/* m2008.01 [bj] : wait for completion */
while ( IINCHIP_READ(Sn_CR(s)) );
// check the SYN packet sending...
while (IINCHIP_READ(Sn_SR(s)) != SOCK_SYNSENT )
{
////////////
///// Sn_SR을 읽어보면 SOCK_ARP후 0x00이 됨.
/////////////
if(IINCHIP_READ(Sn_SR(s)) == SOCK_ESTABLISHED)
{
break;
}
if (getSn_IR(s) & Sn_IR_TIMEOUT)
{
setSn_IR(s,(Sn_IR_TIMEOUT )); // clear TIMEOUT Interrupt
ret = 0;
break;
}
}
applySUBR();
}
return ret;
}
코드 루틴 에서 Sn_SR을 읽어보았더니 SOCK_ARP에서 0x00 으로 된후 connect 실패로 뜹니다.
어떤 상황일때 이 현상이 발생하며 어떻게 해결해야 할까요
connect 후 타임아웃 끝난뒤 확인차 W5100의 레지스터를 읽어보니 정상적으로 값이 들어있음을 확인했습니다.
해당 통신 LAN선으로 접속하려는 곳으로 접속하여 라인이 살아있음도 확인 했습니다.
MAC Address 와 Gateway 그리고 Source IP를 레지스터에 넣고나면
해당 sourceIP로 ping 을 해보면 핑 테스트가 되나요?