WIZnet Developer Forum

[W5100]ioLibrary_Driver-master 사용 문의입니다.

안녕하세요.
기존에 W5100 Driver V1.9을 사용하던 보드를 ioLibrary_Driver-master로 하드웨어는 그대로이고 f/w만 변경하여 프로그램 진행중입니다. 페러럴통신을 사용합니다.
제품연결은 잘되는데 rx 데이터가 pc에서 보낸것과 다른 값이 버퍼에 저장이 됩니다. tx 데이터도 버퍼에 저장된 것과 다른 것이 전송이 되는 상태입니다.
설정한 부분은 아래와 같습니다.

reg_wizchip_bus_cbfunc(wizchip_read, wizchip_write);
void wizchip_write(unsigned int addr, iodata_t wb)
{
((volatile unsigned char)(addr)) = wb;
}

iodata_twizchip_read(uint32_t addr)
{
iodata_t data;
data = ((volatile unsigned char)(addr));
return data;
}
====================wizchip_conf.h ========================================
#ifndef WIZCHIP
#define WIZCHIP W5100 // W5100, W5100S, W5200, W5300, W5500
#endif

#if (WIZCHIP == W5100)
#define WIZCHIP_ID “W5100\0”
#define WIZCHIP_IO_MODE WIZCHIP_IO_MODE_BUS_DIR

#if WIZCHIP_IO_MODE & WIZCHIP_IO_MODE_BUS
#define WIZCHIP_IO_BASE ((unsigned int)0xc0000000) // for 5100S IND

어느 부분을 검토해야 하는지 궁금합니다.
버퍼는 0번 소켓만 사용하려 하는데 아래처럼 하면 되는지요?
void network_WizchipBufInit(void)
{
uint8_t memsize[2][4] = {{8,0,0,0},{8,0,0,0}};
ctlwizchip(CW_RESET_WIZCHIP,(void*)memsize) ;
if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1)
{
while(1);
}
}

현재 Direct bus mode사용중이신가요??
우선 IO BASE가 제대로 설정되었는지 다시한번 확인하시기 바랍니다.

소켓 버퍼 사이즈 설정은 말씀하신대로 하시면됩니다.

감사합니다.
네. Direct bus mode 사용중입니다.
IO BASE 설정이라하시면 #define WIZCHIP_IO_BASE을 말씀하시는 것인가요?
0xc0000000는 W5100 Driver V1.9에서도 사용하던 주소입니다.

글을 다시한번 읽어보았는데
제품연결이 잘된다는 말씀은 W5100 레지스터의 R/W는 잘되는데 TCP/UDP 통신에서만 문제가 있는건가요??
아니라면 제품연결이 잘된다는건 무슨의미인가요??

  1. TCP 통신을 사용합니다. pc에서 connect를 하고 getSn_SR()을 읽으면 0x17로 잘 표현됩니다.
  2. getSn_RX_RSR(0)으로 읽으면 pc에서 보내는 데이터 개수는 정확히 표현됩니다.
    -> 그 후 recv()로 데이터를 읽어보면 읽어보면 버퍼에 개수는 같은데, 저장되는 값이 다릅니다.
  3. send()를 사용하여 데이터를 보내도 데이터 개수는 맞지만, 데이터 값이 버퍼와 다릅니다.

W5100 레지스터들이 잘읽히시는거면 interface부분(Bus mode)은 확인하실 필요 없습니다.
TCP 데이터 부분만 잘못될 수 없습니다. 정상이라고 보시면 됩니다.

send() recv() 함수를 호출하는 부분의 code와 PC에서 전송한 data, W5100에서 read한 data 를 알고싶습니다. 매개변수 전달이나, 데이터 read하는 부분에 있어서 문제가 있는것으로 생각됩니다. recv()함수를 사용하실 때 buf의 데이터형과 read하는 법은 아래와 같습니다. 같은지 확인하시기 바랍니다.

uint8_t* buf; //or uint8_t buf[50];
recv(sn, buf, size);
for(int i=0; i<size; i++) {
   printf("%c", buf[i]);
}

코드는 아래와 같습니다.
버퍼에 저장되는 내용은 UART 대신 디버거로 확인하고 있습니다.
PC에서 0x00을 반복해서 전송해도 mcu버퍼에 저장되는 값은 랜덤하게 됩니다.
pc -> mcu(buffer)
0x00 -> 0xc9
0x00-> 0x85
0x00 -> 0x62
0x00 -> 0x48

typedef struct RxProtocol
{
unsigned char buffer[128];
} rxProtocolStruct;

=================================================
case 0x17: //socket established됨.
length = getSn_RX_RSR(0);
if( length > 0)
{
recv(0, eth_rx.buffer, length);
send(0,eth_rx.buffer, length);
}
break;

eth_rx.buffer대신에
다른 버퍼를 선언해서 테스트해도 같은결과인가요?

네. 다른 버퍼를 써도 동일한 증상이고요.
w5100을 쓰는 다른 보드도 드라이버를 바꾸니까 동일하게 증상이 나타납니다.

recv의 return값이 실제로 받은 데이터의 길이거나 Error 메시지입니다.
send의 return 값은 실제 보낸데이터의 길이거나 Error 메세지 값입니다.
이 두개의 값이 제대로 나오는지 확인하시고 W5100에서 수신된 버퍼의 값을 디버그말고 UART로 확인 부탁드립니다.

		if( length > 0)
		{
			ret = recv(0, buffer33, length);		
			uart_sendData(buffer33,length);
			Delay(1000);
			uart_sendData(&ret,1);
			send(0,buffer33, length);		
		}

위와 같이 uart로 확인하였습니다. buffer33은 다른값이 출력되었고, ret는 length와 동일한 값이 출력됩니다.

라이브러리 변수 타입수정하면 송수신 잘 됩니다.
void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
{
uint32_t dst_ptr;
}
void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
{
uint32_t src_ptr;
}
이것은 "wizchip_conf.h"에서 바꿀수 없는건가요?

uint16_t dst_ptr; (uint16_t src_ptr;) 였던 변수타입을
uint32_t dst_ptr; (uint32_t src_ptr;) 로 변경하니 잘된다는 말씀이신가요?

네. 변경하면 잘됩니다.
예전에 쓰던 라이브러리는 typedef unsigned int uint16으로 되어있어서 실제는 4byte로 사용됐었네요.
지금것은 컴파일러것을 쓰는데 typedef unsigned short int uint16_t 이라서 2byte 같습니다.
mcu의 fsmc 어드레스가 0xc0000000번지 부터 시작이라서 16비트 어드레스사용하면, 주소가 잘리는 것같아요.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.