WIZnet Developer Forum

WIZ810SMJ Start 기본 동작

WIZ810SMJ 로 기본동작을 구현 하고 있습니다.
Example code 를 봤지만 제가 사용하던 코드에 내용을 맞추기가 힘들어 일단 기본기능을 구현해 보고 있습니다.

여기 내용을 참고 해서 일단 Ping 과 telnet 연결 부분만 확인하려고 합니다.

spi_rb 함수에서 printf 를 찍으면 0x10 이 계속 나오고 있습니다.
아직 Ping 과 telnet 모두 동작을 안하고 있습니다.
아시는 분 답변좀 부탁 드리겠습니다. 감사합니다.

`
void cs_sel() {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); //CS LOW
}

void cs_desel() {
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); //CS HIGH
}
 
uint8_t spi_rb(void) {
	uint8_t rbuf;
	HAL_SPI_Receive(&hspi1, &rbuf, 1, 0xFFFFFFFF);
	//TRACE("%d",rbuf);
	return rbuf;
}

void spi_wb(uint16_t b) {
	HAL_SPI_Transmit(&hspi1, &b, 2, 0xFFFFFFFF);
}

int main(void)
{
..............................................................................

    reg_wizchip_cs_cbfunc(cs_sel, cs_desel);
    reg_wizchip_spi_cbfunc(spi_rb, spi_wb);

  wizchip_init(bufSize, bufSize);
  
  wiz_NetInfo netInfo = { 
  .mac 	= {0x00, 0x08, 0xdc, 0xab, 0xcd, 0xef},	/* Mac address */
  .ip 	= {192, 168, 2, 192},					/* IP address */
  .sn 	= {255, 255, 255, 0},					/* Subnet mask */
  .gw 	= {192, 168, 2, 1}                                  /* Gateway address */
  };					

  wizchip_setnetinfo(&netInfo);
  wizchip_getnetinfo(&netInfo);

reconnect:
  /* Open socket 0 as TCP_SOCKET with port 5000 */
  if((retVal = socket(0, Sn_MR_TCP, 5000, 0)) == 0) {
	  /* Put socket in LISTEN mode. This means we are creating a TCP server */
	  if((retVal = listen(0)) == SOCK_OK) {
		  /* While socket is in LISTEN mode we wait for a remote connection */
		  while(sockStatus = getSn_SR(0) == SOCK_LISTEN)
			  HAL_Delay(100);
		  /* OK. Got a remote peer. Let's send a message to it */
		  while(1) {
			  /* If connection is ESTABLISHED with remote peer */
			  if(sockStatus = getSn_SR(0) == SOCK_ESTABLISHED) {
				  uint8_t remoteIP[4];
				  uint16_t remotePort;
				  /* Retrieving remote peer IP and port number */
				  getsockopt(0, SO_DESTIP, remoteIP);
				  getsockopt(0, SO_DESTPORT, (uint8_t*)&remotePort);
				  TRACE("ip %d %d %d %d port %d\r\n", remoteIP[0], remoteIP[1], remoteIP[2], remoteIP[3], remotePort);
				  /* Let's send a welcome message and closing socket */


				  if(retVal = send(0, GREETING_MSG, strlen(GREETING_MSG)) == (int16_t)strlen(GREETING_MSG))
					  TRACE("OK\r\n");
				  else { /* Ops: something went wrong during data transfer */
					  TRACE("fail\r\n");
				  }
				  break;
			  }
			  else { 
/* Something went wrong with remote peer, maybe the connection was closed unexpectedly */
				  TRACE("fail2\r\n");
				  break;
			  }
		  }

	  } else /* Ops: socket not in LISTEN mode. Something went wrong */
		  TRACE("Listen Err\r\n");
  } else { 
/* Can't open the socket. This means something is wrong with W5100 configuration: maybe SPI issue? */
	  TRACE("Socket open err\r\n");
  }

  /* We close the socket and start a connection again */
  disconnect(0);
  close(0);
  goto reconnect;
..............................................................................
}

static void MX_SPI1_Init(void)
{
  
  /* USER CODE BEGIN SPI1_Init 0 */

  /* USER CODE END SPI1_Init 0 */

  /* USER CODE BEGIN SPI1_Init 1 */

  /* USER CODE END SPI1_Init 1 */
  /* SPI1 parameter configuration*/

  hspi1.Instance               = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
  hspi1.Init.Direction         = SPI_DIRECTION_2LINES;
  hspi1.Init.CLKPhase          = SPI_PHASE_2EDGE;
  hspi1.Init.CLKPolarity       = SPI_POLARITY_HIGH;
  hspi1.Init.DataSize          = SPI_DATASIZE_8BIT;
  hspi1.Init.FirstBit          = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode            = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial     = 7;
  hspi1.Init.CRCLength         = SPI_CRC_LENGTH_8BIT;
  hspi1.Init.NSS               = SPI_NSS_SOFT;
  //hspi1.Init.NSS               =   SPI_NSS_HARD_OUTPUT;
  //hspi1.Init.NSSPMode          = SPI_NSS_PULSE_ENABLE;
  hspi1.Init.NSSPMode          = SPI_NSS_PULSE_DISABLE;

  
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN SPI1_Init 2 */

  /* USER CODE END SPI1_Init 2 */

}

wizchip_setnetinfo(&netInfo); 실행시 scope shot 입니다.

아마도 mac, ip 세팅시 spi writting 을 수행 하는것 같습니다.
첫 CS 구간에서 9byte 가 나가는데 맞나요? OPCODE(1byte) + ADDESS(2byte) + MAC(byte) 로 총 9byte 일 것 같은데…

해당 확대 이미지는 앞에 1-2byte 를 확인 하였습니다.

그리고 다음 3-4 byte 입니다.

해당 scope 가 정상적으로 통신 하고 있는지 답변 드립니다.

해결됬습니다. 현재 ping 과 telnet 모두 접속 됩니다.
그런데 좀 이상한게 W5100S 는 Address 가 2byte 라고 해서 callback write 함수를 아래와 같이 사용하면 안됩니다.
void spi_wb(uint16_t b) {
HAL_SPI_Transmit(&hspi1, &b, 2, 0xFFFFFFFF);
}
아래와 같이 size 1 로 보내야 합니다.
void spi_wb(uint16_t b) {
HAL_SPI_Transmit(&hspi1, &b, 1, 0xFFFFFFFF);
}
저가를 size 1 로 변경하니 되네요. 명확히 답변 부탁 드립니다.

HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);

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