[W5300] dhcp 테스트 문제

안녕하세요.

NUCLEO-H723ZG + WIZ830MJ 로 테스트 중에 문의 사항이 있어 글 남깁니다.

8Bit Bus 로 설정했고,

아래와 같은 방법으로, W5300 Reset → MR, IR, IDR 읽기까지 완료 했습니다.

HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, GPIO_PIN_SET);

vW5300Init();
vNetConfig();

printf("MR %X %X\n", *(__IO uint8_t*)0x60000000, *(__IO uint8_t*)0x60000001);
printf("IR %X %X\n", *(__IO uint8_t*)0x60000002, *(__IO uint8_t*)0x60000003);
printf("IMR %X %X\n", *(__IO uint8_t*)0x60000004, *(__IO uint8_t*)0x60000005);
printf("ID %X %X\n", *(__IO uint8_t*)0x600000FE, *(__IO uint8_t*)0x600000FF);

HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, GPIO_PIN_SET);

printf("MR %X %X\n", *(__IO uint8_t*)0x60000000, *(__IO uint8_t*)0x60000001);
printf("IR %X %X\n", *(__IO uint8_t*)0x60000002, *(__IO uint8_t*)0x60000003);
printf("IMR %X %X\n", *(__IO uint8_t*)0x60000004, *(__IO uint8_t*)0x60000005);
printf("ID %X %X\n", *(__IO uint8_t*)0x600000FE, *(__IO uint8_t*)0x600000FF);

iolibrary 중 socket.c 의 socket() 함수에서 소켓이 열리지 않고 무한루프에 빠집니다.

close(sn);
//M20150601
#if _WIZCHIP_ == 5300
   setSn_MR(sn, ((uint16_t)(protocol | (flag & 0xF0))) | (((uint16_t)(flag & 0x02)) << 7) );
   **printf("1getSn_MR %X %X\n", getSn_MR(sn), getSn_CR(sn));		//	TEST**
#else
   setSn_MR(sn, (protocol | (flag & 0xF0)));
#endif
if(!port)
{
   port = sock_any_port++;
   if(sock_any_port == 0xFFF0) sock_any_port = SOCK_ANY_PORT_NUM;
}

setSn_PORT(sn,port);
printf(“2getSn_MR %X %X\n”, getSn_MR(sn), getSn_CR(sn)); // TEST
setSn_CR(sn,Sn_CR_OPEN);
printf(“3getSn_MR %X %X\n”, getSn_MR(sn), getSn_CR(sn)); // TEST
while(getSn_CR(sn));
printf(“4getSn_MR %X %X\n”, getSn_MR(sn), getSn_CR(sn)); // TEST
//A20150401 : For release the previous sock_io_mode
sock_io_mode &= ~(1 <<sn);
//
sock_io_mode |= ((flag & SF_IO_NONBLOCK) << sn);
sock_is_sending &= ~(1<<sn);
sock_remained_size[sn] = 0;
//M20150601 : repalce 0 with PACK_COMPLETED
//sock_pack_info[sn] = 0;
sock_pack_info[sn] = PACK_COMPLETED;
//
uint8_t ucTemp;
uint16_t usTemp;
while(1)
{
HAL_Delay(1000);
usTemp = getSn_MR(sn);
printf(“MR %X\n”, usTemp);
ucTemp = getSn_SR(sn);
printf(“SR - %X\n”, ucTemp);
if(SOCK_CLOSED != ucTemp)
break;
}

// TEST 라고 주석 단 부분은 제가 중간중간 상태를 보기위해 넣었는데요.
1 MR 과 2 MR 에서 설정한대로 0x02 가 출력됩니다.
그런데 Sn_CR_OPEN을 write 한 이후로, 3 MR 부터 MR 이 0을로 읽힙니다.

UART 출력 화면을 캡쳐 했습니다.
1getSn_MR 2 0
2getSn_MR 2 0
3getSn_MR 0 0
4getSn_MR 0 0

어떤 문제가 있는 걸까요?

ioLibrary V4.0.0 으로 테스트 했습니다.