[WIZ850io] DSP와 연결

안녕하세요 2개월쯤 전에 이더넷 통신을 도전했다가 다시 시작하게 되었습니다.
Wiz850io모듈을 사용하여 dsp(송신) — Wiz850io ------ Wiz850io ----- dsp(수신) 이런 방향으로 하려고 하는데 W5500데이터시트를 읽어 보았습니다. w5500의 레지스터를 설정해야하는것을 알았습니다. 여기서 제가 하려고하는 시스템에서 Gatway IP, Subnet Mask, Source Hardware, Source IP 이거를 다 하나하나 설정을 해야하는지 또한 소켓 tx,Rx 사이즈 까지 일일이 다 설정을 하고 데이터를 보내야하는지 궁금합니다. 그리고 저렇게 레지스터를 맞추고 난 뒤에 내가 보내고자 하는 데이터를 보낼때 다시 처음부터 ip, subnet mask 등을 다시 설정하고 데이터를 보내야하는지 궁금합니다. 감사합니다.

안녕하세요:slight_smile:

DHCP를 이용하는것이 아니라면 네트워크 정보는 사용자마다 다르기때문에,
Gateway IP, Subnet Mask, Source Hardware, Source IP 는 각각 설정해 주어야합니다.

소켓 tx, rx 사이즈는 각 2KB씩 할당되어있으므로, 변경하고 싶은경우에만 설정하면 됩니다.

네트워크 정보는 한번 설정하고나면 다시 설정할 필요는 없습니다.

W5500칩이 들어간 EVB보드의 소스코드입니다.
혹시 도움이 될까하여 주소알려드립니다.

감사합니다.

3 Likes

답변 정말 감사드립니다.!! 그렇다면 수신쪽 모듈과 송신쪽 모듈 Gateway IP, Subnet Mask, Source Hardware, Source IP 를 동일하게 설정하면 되는 것인지요?? 네트워크 정보세팅이 끝나고 데이터를 보낼때에는 소켓 tx, rx버퍼에 데이터를 입력하면
될 것같은데 address phase에 tx,rx버퍼의 address를 입력해야하는데 데이터시트에는 소켓 tx,rx 버퍼 address가 안보이는지 못찾는지 모르겠어서 질문합니다… 감사드립니다!!

Source Hardware와 Source IP는 기기를 식별하기 위한 정보입니다.
따라서 수신쪽과 송신쪽은 다른정보를 갖고 있어야하고, Destination IP에 수신쪽 IP를 적어주면 됩니다.

데이터를 보낼때는 tx memory에 데이터를 써준 후 send command를 전송해주어야 데이터가 전송됩니다.

데이터를 쓸때는 Sn_TX_WR레지스터를 이용하고, command는 Sn_CR 레지스터를 이용하면 됩니다. Sn_TX_WR에
데이터를 써주는것이아니라 address값을 써주어야합니다. 데이터시트에서 레지스터 설명을 읽어보시길 바랍니다.

아래 코드는 위에 링크해드렸던 git의 iolibrary안의 w5500.c의 일부입니다. 다른 코드들도 더 참고하시는게 좋을것 같습니다.

void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
{
   uint16_t ptr = 0;
   uint32_t addrsel = 0;

   if(len == 0)  return;
   ptr = getSn_TX_WR(sn);
   //M20140501 : implict type casting -> explict type casting
   //addrsel = (ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
   addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
   //
   WIZCHIP_WRITE_BUF(addrsel,wizdata, len);
   
   ptr += len;
   setSn_TX_WR(sn,ptr);
}



void     WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
{
   uint8_t spi_data[3];
   uint16_t i;

   WIZCHIP_CRITICAL_ENTER();
   WIZCHIP.CS._select();

   AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_);

   if(!WIZCHIP.IF.SPI._write_burst) 	// byte operation
   {
		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
		WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
		for(i = 0; i < len; i++)
			WIZCHIP.IF.SPI._write_byte(pBuf[i]);
   }
   else									// burst operation
   {
		spi_data[0] = (AddrSel & 0x00FF0000) >> 16;
		spi_data[1] = (AddrSel & 0x0000FF00) >> 8;
		spi_data[2] = (AddrSel & 0x000000FF) >> 0;
		WIZCHIP.IF.SPI._write_burst(spi_data, 3);
		WIZCHIP.IF.SPI._write_burst(pBuf, len);
   }

   WIZCHIP.CS._deselect();
   WIZCHIP_CRITICAL_EXIT();
}

답변 감사합니다! 혹시 TCP모드 UDP모드도 설정해야하나요?

네, 설정하셔야 합니다 :slight_smile:
어떠한 프로토콜로 통신할지 선택해야하기 때문에 설정해야 합니다.
관련 레지스터는 Sn_MR 입니다.

그렇다면 제가 TCP 를 한다고 가정한다면 TCP는 데이터를 보낼때 마다 네트워크정보를 계속 보내야하는거 아닌가요?

TCP 헤더에 포함된 네트워크 정보들을 말씀하시는건가요?
WIZnet 칩에서는 몇 가지 레지스터를 통해 네트워크 정보를 입력해주면, 칩 내에서 TCP Header를 만들어 데이터를 전송합니다.

즉, 사용자는 필요한 레지스터를 활용하여 데이터만 보내기만 하면, 칩이 표준 프로토콜에 맞추어 데이터를 전송해 줍니다.
우선 아래 링크들의 오픈 소스를 참조하시고 전체적인 흐름을 먼저 파악하시는게 좋을 것 같습니다.

1 Like

아 답변 감사합니다. 예제를 보는데 어떤 파일을 봐야할지도 모르겠고 봐도 잘 모르겠어서,… 데이터시트에 많이 의존하는것같습니다… 계속 질문에 답해주셔서 감사합니다!

1 Like

위에서 드린 링크 중에,
W5500-EVB는 내부에 있는 특정 예제의 링크입니다.
거기서 main.c 를 참조하시어, 초기 설정 및 메인 루틴 내용을 참조하시면 되겠습니다.

그리고 아래의
WIZ550SR의 경우는 어떤 것을 살펴보아도 상관 없지만,
App쪽을 확인하셔서 어떻게 초기설정을 하고, 메인 루틴에서는 어떻게 진행되는지 보시면 도움이 되시리라 생각됩니다. 이 경우도 main.c를 기준으로 보시면 되겠습니다.

1 Like

W5500 TCP 통신에 대한 전반적인 Flow가 나와 있는 아래 링크를 참조하시면 도움이 되시리라 판단됩니다.

W5500 TCP Application Guide

1 Like

W5500의 레지스터 세팅을 위해서 dsp에서 SPI 통신을 하는데 dsp의 SPI는 16bit까지 지원을 하는데 W5500 SPI Frame은 Address Phase 16bit control Phase 8bit 데이터 8bit 한다면 총 32bit인데 이러면 제가 16bit를 순서대로 2번 보내면 처음 보내는 16bit 짜리SPI Frame은 Address Phase 두번째 16bit짜리는 Control Phase(8bit)랑 data Phase(8bit) 로 되는건가요??

네 그렇습니다.

해당 내용은 아래 링크에서 156번 라인에 있는
WIZCHIP_WRITE_BUF 함수를 참조하시면 되겠습니다.
(8bit씩 처리하는 경우입니다)