w5500 spi 통신 문제 getVERSIONR() 리턴값 질문입니다.

stm32f7 시리즈를 사용하고 있고, chip 초기화 과정에서 spi통신을 통해 getVERSIONR 의 리턴값이 0x04가 돌아오는지 확인중인데 0xff가 들어옵니다.

원인이 뭔지 잘 파악이 안되네요…
w5500 리셋핀도 확인하였습니다. 해당 부분은 이상없습니다…
spi 설정값 및 chip 초기화 함수 보시고 어떤 게 문제인지 뭐를 좀더 확인해보고 테스트해야하는지 알려주시면 감사하겠습니다.

  • spi3 설정값
    hspi3.Instance = SPI3;
    hspi3.Init.Mode = SPI_MODE_MASTER;
    hspi3.Init.Direction = SPI_DIRECTION_2LINES;
    hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
    hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi3.Init.NSS = SPI_NSS_SOFT;
    hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
    hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi3.Init.CRCPolynomial = 7;
    hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
    hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
    if (HAL_SPI_Init(&hspi3) != HAL_OK)
    {
    Error_Handler();
    }

  • spi 통신 및 chip 초기화 함수

extern SPI_HandleTypeDef hspi3;

#define ETH_SPI &hspi3

void WIZ_SPI_Select(void)
{
HAL_GPIO_WritePin(ETH_CS_GPIO_Port, ETH_CS_Pin, GPIO_PIN_RESET);
}

void WIZ_SPI_Deselect(void)
{
HAL_GPIO_WritePin(ETH_CS_GPIO_Port, ETH_CS_Pin, GPIO_PIN_SET);
}

void WIZ_SPI_TxByte(uint8_t byte)
{
HAL_SPI_Transmit(ETH_SPI, &byte, 1, HAL_MAX_DELAY);
}

uint8_t WIZ_SPI_RxByte(void)
{
uint8_t ret;
HAL_StatusTypeDef r;
r = HAL_SPI_Receive(ETH_SPI, &ret, 1, HAL_MAX_DELAY);
return ret;
}

void WIZ_SPI_TxBuffer(uint8_t *buffer, uint16_t len)
{
HAL_SPI_Transmit(ETH_SPI, buffer, len, HAL_MAX_DELAY);
}

void WIZ_SPI_RxBuffer(uint8_t *buffer, uint16_t len)
{
HAL_SPI_Receive(ETH_SPI, buffer, len, HAL_MAX_DELAY);
}

bool WIZ_ChipInit(void)
{
// int32_t ret;
// uint8_t tmpstr[6] = { 0, };

uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};

HAL_GPIO_WritePin(ETH_RSTn_GPIO_Port, ETH_RSTn_Pin, GPIO_PIN_RESET);
osDelay(100);
HAL_GPIO_WritePin(ETH_RSTn_GPIO_Port, ETH_RSTn_Pin, GPIO_PIN_SET);
osDelay(100);

WIZ_SPI_Select();

//register spi functions
reg_wizchip_cs_cbfunc(WIZ_SPI_Select, WIZ_SPI_Deselect);
reg_wizchip_spi_cbfunc(WIZ_SPI_RxByte, WIZ_SPI_TxByte);
reg_wizchip_spiburst_cbfunc(WIZ_SPI_RxBuffer, WIZ_SPI_TxBuffer);
osDelay(100);
//check version register
uint8_t version = getVERSIONR();
if(version != 0x04)
{
	printf("getVERSIONR returns wrong version!\r\n");

// return false;
}
while(1)
{
if(getVERSIONR() != 0x04){
printf(“ACCESS ERR: VERSIONR != 0x04, Read value=%x\r\n”, getVERSIONR());
}else{
printf(“ACCESS : VERSIONR != 0x04, Read value=%x\r\n”, getVERSIONR());
}
osDelay(1000);
}

if(ctlwizchip(CW_INIT_WIZCHIP, (void*)memsize) == -1){
	printf("W5500 Initialized fail \r\n");
}else {
	printf("W5500 Initialized success \r\n");
}
//check PHY status

// wiz_PhyConf phyConf;
// wizphy_getphystat(&phyConf);
// printf(“PHY conf.by = {%d}, conf.mode={%d}, conf.speed={%d}, conf.duplex={%d}\n”,
// phyConf.by, phyConf.mode, phyConf.speed, phyConf.duplex);
WIZ_SPI_Deselect();

return true;

}

오실로스코프로 찍어보니, CS/CLK/MOSI는 파형이 나오는데 MISO가 잘 나오지않네요.
저 함수에 수정해야될 부분이 있는지 봐주시면 하드웨어에 문제가 있나 좀 찾아보겠습니다.

급하게 테스트를 해야되는데 초기화 부분에서 막히네요…
감사합니다.

해결했습니다.