W7500 SPI Slave모드 질문합니다.

SPI를 슬레이브 모드로 사용하고 있습니다.
SPI 1바이트를 수신하면 이후부터는 BUSY Flag가 1이 되면서 데이타는 계속 보내는데 RNE 플래그가 세트되지 않아서 1바이트 수신후에 SPI를 DISABLE시켰다가 다시 ENABLE시켜서 초기화
시키니까 다음 바이트가 들어옵니다. 물론 보내는쪽에서 초기화 시키는 시간 감안해서 일정 딜레이 후에 보내도록해서 계속 받고 있는데 문제는 1비트가 쉬프트 돼서 들어오는 문제가
있어서 아래 코드처럼 SPI 길이를 16비트로 설정하고 받는쪽에서 1비트를 쉬프트해서 8비트만 사용하는 방식으로 해서 쓰고 있습니다. 저속에서는 문제없이 사용하고 있는데 1바이트마다
SPI를 초기화 시켜서 사용하다보니 SPI속도가 느립니다. 해결방법이나 어느 부분에 문제가 있을까요?

------------------------------- 데이타 수신 코드 ------------------------
while ( (SSP0->SR & 0x04 ) != 0 )
{
SSP0->CR1 = 0x04; // SPI DISABLE
SSP0->CR1 = 0x06; //SPI ENABLE
g_UBuff[SSPCnt] = SSP0->DR>>1;
SSPCnt++;
}

-------------------- SPI 초기화 코드 --------------------------------------------------
SSP0_InitStructure.SSP_SerialClockRate = 0;
SSP0_InitStructure.SSP_FrameFormat = SSP_FrameFormat_MO;
SSP0_InitStructure.SSP_CPHA = SSP_CPHA_1Edge;//SSP_CPHA_1Edge;
SSP0_InitStructure.SSP_CPOL = SSP_CPOL_Low;//SSP_CPOL_Low;
SSP0_InitStructure.SSP_DataSize = SSP_DataSize_16b;
SSP0_InitStructure.SSP_SOD = SSP_SOD_RESET;
SSP0_InitStructure.SSP_Mode = SSP_Mode_Slave;
SSP0_InitStructure.SSP_NSS = SSP_NSS_Soft;
SSP0_InitStructure.SSP_LBM = SSP_LBM_RESET;
SSP0_InitStructure.SSP_SSE = SSP_SSE_SET;
SSP0_InitStructure.SSP_BaudRatePrescaler = SSP_BaudRatePrescaler_4;

안녕하세요, WIZnet Theo입니다.
아래는 제가 Slave 모드를 W7500 코드를 이용해 구현한 코드입니다.
정상적으로 수신 동작을 확인한 코드여서 한 번 사용해보시고 동일한 증상이 있는지 알려주세요.

/* Includes ------------------------------------------------------------------*/
#include “main.h”
#include “w7500x_ssp.h”

/* Private function prototypes -----------------------------------------------/
void delay_ms(__IO uint32_t nCount);
static void UART_Config(void);
void SSP1_Slave_Init(void);
/
Private functions ---------------------------------------------------------*/

/**

  • @brief Main Function
    */
    int main()
    {
    uint16_t slaveRxData = 0;

    /* Set Systme init */
    SystemInit();

    UART_Config();

    printf(“W7500x Standard Peripheral Library version : %d.%d.%d\r\n”, __W7500X_STDPERIPH_VERSION_MAIN, __W7500X_STDPERIPH_VERSION_SUB1, __W7500X_STDPERIPH_VERSION_SUB2);

    printf(“SourceClock : %d\r\n”, (int) GetSourceClock());
    printf(“SystemClock : %d\r\n”, (int) GetSystemClock());

    SSP1_Slave_Init();
    int i = 0;
    for(i=0; i<5000;i++){

    while(SSP_GetFlagStatus(SSP1, SSP_FLAG_RNE) == RESET);

    slaveRxData = SSP_ReceiveData(SSP1);

    printf(“slaveRxData: %#04x\r\n”, slaveRxData);
    }
    }

/**

  • @brief Delay Function
    */
    void delay_ms(__IO uint32_t nCount)
    {
    volatile uint32_t delay = nCount * 2500; // approximate loops per ms at 24 MHz, Debug config
    for(; delay != 0; delay–)
    __NOP();
    }

void SSP1_Slave_Init(void) {
SSP_InitTypeDef SSP_InitStructure;
/*
<SSP1 PORT & PIN NUMBER>
- SSP1 SSEL (PB.00) Pin
- SSP1 SCLK (PB.01) Pin
- SSP1 MISO (PB.02) Pin
- SSP1 MOSI (PB.03) Pin
*/

/* SSP1 Init -- SSP Slave */
SSP_StructInit(&SSP_InitStructure);
SSP_InitStructure.SSP_DataSize = SSP_DataSize_16b;
SSP_InitStructure.SSP_Mode = SSP_Mode_Slave; // SSP1 = Slave
SSP_Init(SSP1,&SSP_InitStructure);
SSP_Cmd(SSP1, ENABLE);

}

static void UART_Config(void)
{
UART_InitTypeDef UART_InitStructure;

UART_StructInit(&UART_InitStructure);

#if defined (USE_WIZWIKI_W7500_EVAL)
UART_Init(UART1, &UART_InitStructure);
UART_Cmd(UART1, ENABLE);
#else
S_UART_Init(115200);
S_UART_Cmd(ENABLE);
#endif
}

#ifdef USE_FULL_ASSERT

/**

  • @brief Reports the name of the source file and the source line number

  •     where the assert_param error has occurred.
    
  • @param file: pointer to the source file name

  • @param line: assert_param error line source number

  • @retval None
    /
    void assert_failed(uint8_t
    file, uint32_t line)
    {
    /* User can add his own implementation to report the file name and line number,
    ex: printf(“Wrong parameters value: file %s on line %d\r\n”, file, line) */

    /* Infinite loop */
    while (1)
    {
    }
    }
    #endif