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 루프에서 응답이 없습니다.
혹시 이런증상에서는 어떤 부분을 테스트 해야 할까요?