본문 바로가기

[INTERFACE]/WIZNET_EVM

[W5100] STM32에서 SPI로 테스트중... 속도문제

[W5100] STM32에서 SPI로 테스트중... 속도문제

STM32에서 SPI로 테스트중...
STM32를 SPI를 이용하여 W5100테스트 중이다. 기본 동작은 잘 되지만 전송 속도가 문제다.
SPI클럭을 18M/4 = 4.5Mhz 로 구동 하는데 속도가 400kbps도 안된다. AVR 4Mhz로 구동해도 500k이상 나왔는데...




SPI를 클럭을 메인클럭에서 2분주 해서 다시 시도 해본다. 아예 SPI리드 라이트가 않된다.

wiz_write_buf() 함수를 좀 수정해야 할듯...
CS를 for루프 위쪽으로 올려서 CS제어 부분도 줄여볼까해서 해보니 데이터 에러가 발생한다.

  IINCHIP_CSoff();        
  for(idx=0;idx<len;idx++)
 {
  IINCHIP_SpiSendData(0xF0);
  IINCHIP_SpiSendData(((addr+idx) & 0xFF00) >> 8);
  IINCHIP_SpiSendData((addr+idx) & 0x00FF);
  IINCHIP_SpiSendData(buf[idx]);
   }
 IINCHIP_CSon();


SPI Wirte를 함수에서 직접 레지스트로 바꾸니 좀 더  빨라졌다

 void SPI1_WriteByte(unsigned char Data)
{
 //while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
   
 SPI_I2S_SendData(SPI2, Data);

//while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);

 SPI_I2S_ReceiveData(SPI2);

}



[1] iInChip Send: 0.4277 Mbps(148684 bytes, 2.6525 sec)
iInChip Recv: 0.4213 Mbps(148684 bytes, 2.6923 sec)
------------------------------------------------------------


Data Read, Write부분도 변경하니 좀더 빨라진다.
[1] iInChip Send: 0.5328 Mbps(148684 bytes, 2.1290 sec)
iInChip Recv: 0.5251 Mbps(148684 bytes, 2.1604 sec)
------------------------------------------------------------


SPI Read/Wrte 두 함수 모두 변경하니 조금 더 빨라졌다.

void SPI1_WriteByte(unsigned char Data)
{
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    
 SPI2->DR =  Data;

 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);

 Data = SPI2->DR;
}


560k까지 나오고 있다.
[1] iInChip Send: 0.5737 Mbps(148684 bytes, 1.9773 sec)
iInChip Recv: 0.5655 Mbps(148684 bytes, 2.0060 sec)
------------------------------------------------------------

SPI1_WriteByte() 함수를 쓰지 않고 하니 더 빨라진다.

       int temp;
      
    while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    SPI2->DR = 0xF0;
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
    temp = SPI2->DR;
   
   
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    SPI2->DR = ((addr)>>8);   
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
    temp = SPI2->DR;

   
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    SPI2->DR = (addr);  
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
    addr = SPI2->DR;
   
   
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    SPI2->DR = data;    
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
    temp = SPI2->DR;


630kbps가 최대 인것 같다.
[1] iInChip Send: 0.6455 Mbps(148684 bytes, 1.7574 sec)
iInChip Recv: 0.6362 Mbps(148684 bytes, 1.7831 sec)
------------------------------------------------------------

반응형