STM32 와 W5500 SPI 통신 응답 문제

STM32F427 에 W5500 보드 제작하여 spi 통신 테스트 진행하고 있습니다.

해당 소스는 아래와 같습니다.

/* W5500 -----------------------------------------------------------------*/
#define spiW5500_SPI SPI4
#define spiW5500_SPI_CLK RCC_APB2Periph_SPI4
#define spiW5500_SPI_CLK_INIT RCC_APB2PeriphResetCmd

#define spiW5500_SPI_SCK_PIN GPIO_Pin_2
#define spiW5500_SPI_SCK_GPIO_PORT GPIOE
#define spiW5500_SPI_SCK_GPIO_CLK RCC_AHB1Periph_GPIOE
#define spiW5500_SPI_SCK_SOURCE GPIO_PinSource2
#define spiW5500_SPI_SCK_AF GPIO_AF_SPI4

#define spiW5500_SPI_MISO_PIN GPIO_Pin_5
#define spiW5500_SPI_MISO_GPIO_PORT GPIOE
#define spiW5500_SPI_MISO_GPIO_CLK RCC_AHB1Periph_GPIOE
#define spiW5500_SPI_MISO_SOURCE GPIO_PinSource5
#define spiW5500_SPI_MISO_AF GPIO_AF_SPI4

#define spiW5500_SPI_MOSI_PIN GPIO_Pin_6
#define spiW5500_SPI_MOSI_GPIO_PORT GPIOE
#define spiW5500_SPI_MOSI_GPIO_CLK RCC_AHB1Periph_GPIOE
#define spiW5500_SPI_MOSI_SOURCE GPIO_PinSource6
#define spiW5500_SPI_MOSI_AF GPIO_AF_SPI4

#define spiW5500_CS_PIN GPIO_Pin_4
#define spiW5500_CS_GPIO_PORT GPIOE
#define spiW5500_CS_GPIO_CLK RCC_AHB1Periph_GPIOE

#define spiW5500_CS_LOW() GPIO_ResetBits(spiW5500_CS_GPIO_PORT, spiW5500_CS_PIN)
#define spiW5500_CS_HIGH() GPIO_SetBits(spiW5500_CS_GPIO_PORT, spiW5500_CS_PIN)

void spiW5500_LowLevel_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/*!< Enable the SPI clock */
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI4, ENABLE);

/*!< Enable GPIO clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

/*!< SPI pins configuration *************************************************/

/*!< Connect SPI pins to AF5 */
GPIO_PinAFConfig(spiW5500_SPI_SCK_GPIO_PORT, spiW5500_SPI_SCK_SOURCE, spiW5500_SPI_SCK_AF);
GPIO_PinAFConfig(spiW5500_SPI_MISO_GPIO_PORT, spiW5500_SPI_MISO_SOURCE, spiW5500_SPI_MISO_AF);
GPIO_PinAFConfig(spiW5500_SPI_MOSI_GPIO_PORT, spiW5500_SPI_MOSI_SOURCE, spiW5500_SPI_MOSI_AF);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;

/*!< SPI SCK pin configuration */
GPIO_InitStructure.GPIO_Pin = spiW5500_SPI_SCK_PIN;
GPIO_Init(spiW5500_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);

/*!< SPI MOSI pin configuration */
GPIO_InitStructure.GPIO_Pin = spiW5500_SPI_MOSI_PIN;
GPIO_Init(spiW5500_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);

/*!< SPI MISO pin configuration */
GPIO_InitStructure.GPIO_Pin = spiW5500_SPI_MISO_PIN;
GPIO_Init(spiW5500_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);

/*!< Configure spiW5500 Card CS pin in output pushpull mode ********************/
GPIO_InitStructure.GPIO_Pin = spiW5500_CS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(spiW5500_CS_GPIO_PORT, &GPIO_InitStructure);
}

void spiW5500_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;

spiW5500_LowLevel_Init();

/*!< Deselect the FLASH: Chip Select high */
spiW5500_CS_HIGH();

/*!< SPI configuration */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // SPI_CPOL_High
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; // SPI_CPHA_2Edge
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; // SPI_BaudRatePrescaler_16

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(spiW5500_SPI, &SPI_InitStructure);

/*!< Enable the spiW5500_SPI */
SPI_Cmd(spiW5500_SPI, ENABLE);
}

uint8_t spiW5500_SendByte(uint8_t Byte)
{
/*!< Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(spiW5500_SPI, SPI_I2S_FLAG_TXE) == RESET);

/*!< Send Half Word through the spiW5500 peripheral */
SPI_I2S_SendData(spiW5500_SPI, Byte);

/*!< Wait to receive a Half Word */
while (SPI_I2S_GetFlagStatus(spiW5500_SPI, SPI_I2S_FLAG_RXNE) == RESET);

/*!< Return the Half Word read from the SPI bus */
return SPI_I2S_ReceiveData(spiW5500_SPI);
}

void Spi4_test(void)
{

spiW5500_Init();
	
spiW5500_CS_LOW();

spiW5500_SendByte(0xAA);

spiW5500_CS_HIGH();

}

현재 Main함수에서 W5500 하드웨어 리셋후에 Spi4_test() 초기화 하고

senbyte()의 while (SPI_I2S_GetFlagStatus(spiW5500_SPI, SPI_I2S_FLAG_TXE) == RESET);

구문의 while 루프에서 응답이 없습니다.

혹시 이런증상에서는 어떤 부분을 테스트 해야 할까요?

#define spiW5500_SPI_CLK_INIT RCC_APB2PeriphResetCmd 가 잘못되어 있었습니다.

RCC_APB2PeriphResetCmd 가 아니라 RCC_APB2PeriphClockCmd로 해야 했네요.