[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를 함수에서 직접 레지스트로 바꾸니 좀 더 빨라졌다
{
//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 두 함수 모두 변경하니 조금 더 빨라졌다.
{
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)
------------------------------------------------------------