w5300 네트웍 설정 문의

#1

stm32계열 cpu로 w5300 direct mode(16bit) 사용중입니다.
아래와 같이 네트웍 설정 후 확인 시 아래와 같이 읽히는데 뭐가 문제일까요??

//////////설정 후 read////////////////
SHAR : b8:00:b8:00:b8:00
GWR : 184.0.184.0
SUBR : 255.255.255.0
SIPR : 184.0.184.0

/////////////////////////////////////소스코드///////////////////////////////
u8 ip[4] = {192, 168, 0, 100};
u8 mac[6] = {0x00, 0x08, 0xdc, 0x00, 0x00, 0x02};
u8 sn[4] = {255, 255, 255, 0};
u8 gw[4] = {192, 168, 0, 254};

void BSP_ETH_Init(void)
{
uint8 tx_mem_conf[8] = {8,8,8,8,8,8,8,8}; // for setting TMSR regsiter
uint8 rx_mem_conf[8] = {8,8,8,8,8,8,8,8}; // for setting RMSR regsiter

W5300_Reset();
W5300_FSMC_Init();
/* initiate W5300 */
iinchip_init();

/* allocate internal TX/RX Memory of W5300 */
if(!sysinit(tx_mem_conf,rx_mem_conf))
{
printf(“MEMORY CONFIG ERR.\r\n”);
while(1);
}

setMR(getMR()|MR_FS); // If Little-endian, set MR_FS.

setSHAR(mac); // set source hardware address

#ifdef DEF_IINCHIP_PPP
if(pppinit((uint8*)“test01”, 6, (uint8*)“pppoe1000”, 9)!=1)
{
printf(“PPPoE fail.\r\n”);
while(1);
}
close(0);
#else
/* configure network information */
setGAR(gw); // set gateway IP address
setSUBR(sn); // set subnet mask address
setSIPR(ip); // set source IP address
#endif

/* verify network information */
getSHAR(mac); // get source hardware address
getGAR(gw); // get gateway IP address
getSUBR(sn); // get subnet mask address
getSIPR(ip); // get source IP address

 EthMsg("\r\nSHAR : %02x:%02x:%02x:%02x",mac[0],mac[1],mac[2],mac[3]);
 EthMsg(":%02x:%02x\r\n",mac[4],mac[5],0,0);

EthMsg("\r\nGWR : %d.%d.%d.%d",gw[0],gw[1],gw[2],gw[3]);
EthMsg("\r\nSUBR : %d.%d.%d.%d",sn[0],sn[1],sn[2],sn[3]);
EthMsg("\r\nSIPR : %d.%d.%d.%d",ip[0],ip[1],ip[2],ip[3]);

#2

W5300과 MCU간의 Hardware적 신호들은 잘 동작하는지 확인후(오실로스코프등으로 /CS, /WR 등 확인),
기본 베이직 I/O function을 검증하신 후 원하는 작업을 진행하시면 문제 분석에 도움일 될 겁니다.

우선, Hardware적 오류는 없는지 확인 하시고,
CHIP ID Regiter(IDR at 0x0FE)를 읽어 0x5300이 제대로 읽히는지 (Basice READ funtion 검증)
그후, RTR register에 임의 값들을 쓰고, 해당 값이 읽히는지 확인 바랍니다.

#3

한가지 이상한 현상이 발생합니다.
address 연결시 ad0-addr0 … ad9-addr9 이렇게 연결되어 있는데요
16비트로 설정해서 사용중입니다.
getIDR() 함수를 이용하여 id를 읽어보니 어드레스가 반토막되어 들어가더군요…

아래와 같이 어드레스를 2배로 하면 정상으로 읽힙니다.
add를 4로 설정하면 실제로 나가는 핀은 2로 나가는데요…
도무지 이해가 안가네요… 도움 부탁드립니다.

uint16 getIDR(void)
{
//return IINCHIP_READ(IDR_BASE); //IDR_BASE => 0x680000FE : 실패
return IINCHIP_READ(IDR_BASE); //IDR_BASE => 0x680001FC : 정상(return: 5300)
}

#4

16비트 데이터 버스를 유지하고 어드레스 주소를 2배로 설정하였습니다.

#define GAR (COMMON_REG_BASE + 0x102)
#define GAR0 GAR
#define GAR1 (GAR + 1
2)
#define GAR2 (GAR + 22)
#define GAR3 (GAR + 3
2)
;
;
;
이렇게 하니 getIDR();는 5300으로 정상으로 읽히는데요
net 설정은 아래와 같이 잘 안되네요

////설정값////
u8 ip[4] = {192, 168, 0, 100};
u8 mac[6] = {0x00, 0x08, 0xdc, 0x00, 0x00, 0x02};
u8 sn[4] = {255, 255, 255, 0};
u8 gw[4] = {192, 168, 0, 254};

////읽은값////
SIPR : 255.168.192.100
SHAR : 00:08:00:00:dc:02
SUBR : 0.255.255.0
GWR : 0.168.192.254

#5

이번엔 8bit로 설정 후 테스트하였습니다. address은 x2를 하지 않고 원래대로 했구요…
당연히 bit 16en 핀은 gnd처리 하였습니다.

질문1>setMR(getMR()|MR_FS); 설정에 따라 아래와 같이 결과가 다릅니다.
설정했을때 값이 아주 엉뚱하게 나오는데 설정안했을때는 "읽은데이터 #1"처럼 뒤바뀐상태로
읽히는데 STM32에서는 Little endian이므로 설정하는것이 맞지 않을까요??

질문2>아래 #1처럼 순서가 바뀌어 읽히는 이유를 모르겠네요…

//설정 데이타//
SHAR : 01:02:03:04:05:06
GWR : 7.8.9.10
SUBR : 11.12.13.14
SIPR : 15.16.17.18

//읽은 데이타 #1//
getIDR(); =>정상
SHAR : 02:01:04:03:06:05 =>비정상
GWR : 8.7.10.9 =>비정상
SUBR : 12.11.14.13 =>비정상
SIPR : 16.15.18.17 =>비정상

//읽은 데이타 #2//
setMR(getMR()|MR_FS);
getIDR(); =>비정상
SHAR : 10:0b:10:10:ff:ff =>비정상
GWR : 16.11.16.16 =>비정상
SUBR : 255.255.255.255 =>비정상
SIPR : 16.11.16.16 =>비정상

#6

http://wizwiki.net/forum/viewtopic.php?f=52&t=507&p=1569&hilit=16bit#p1569
이부분을 먼저 확인하셨다면 고생 안하셨을 것 같네요. 저도 이문제인지 정확히 알수 없었고, 미처 생각하지 못해 죄송하네요.

그리고, MR_FS 비트는 Sn_TX_FIFOR 과 Sn_RX_FIFOR에만 영향을 줍니다.
MR_DBS 비트가 있는데 이는 Data bus를 swap해 주는 기능으로 16bit 버스를 사용할 때만 적용됩니다.

그리고, 헷갈려 하실 것 같아 다시 설명드리면,
W5300은 무조건 내부적으로 Big-endian을 사용합니다. 단순 호스트 통신에 있어 인터페이스할 때 Data 값을 뒤집어 알려주고 뒤집어 받습니다.
8bit인 경우 해당 사항이 없을 것 같네요.

#7

현재는 그냥 8비트로 운영할 계획입니다.
그럴러면 w5300.c 파일이 8bit에 맞도록 변경해 줘야하나요??

위 질문처럼 8bit시 뒤집혀서 출력이 되는 현상은 해결못했네요

#8

8bit로 access를 하시면
원하는 주소에 원하는 값이 나옵니다.
혹시 8bit주소에 16bit, 32bit 변수로 값을 읽고 쓰는 지요?
예로)
uint32_t ip;
getIP((uint8_t*)&ip);

8bit example은 WIZnet 홈페이지에 배포되어 있을 겁니다. 물론 Porting 작업은 해주셔야 할 겁니다.

http://www.wiznet.co.kr/sub_modules/en/product/product_detail.asp?Refid=662&page=1&cate1=5&cate2=7&cate3=25&pid=1012&cType=2#tab

#9

메일드렸습니다.
도움 부탁드립니다.

#10

클럭 타이밍 문제로 해결했습니다. ㅠㅠ

#11

해결되었다니 다행이네요.
감사합니다.