WIZnet Developer Forum

Spi 통신 문제를 해결해 주세요

stm32f407과 W5200의 SPI 통신을 할려고 합니다.
그런데 다음의 함수가 의문입니다.

uint8_t SPI1_SendByte(uint8_t byte)
{
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

  SPI_I2S_SendData(SPI1, byte);
      
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
      
  return SPI_I2S_ReceiveData(SPI1);

}

보낼 때, 왜 쓰고, 다시 데이터를 받고 있나요?

그리고 SCK의 bandwidth는 어느정도를 해야 합니까?

안녕하세요.

SPI 특성상 Master에서 Clock을 Slave에게 입력시켜주어야 Slave가 input/output을 하게됩니다.
보통 많은 MCU들이 Read를 하기 위해 dummy write를 하게됩니다.
write를 하게되면 SCLK이 발생하게 되도록 되어 있기 때문입니다.
이때 Slave는 data를 output하게 됩니다.
따라서 SPI의 단위 함수가 아래와 같이 구현된 경우가 많습니다.
보다 자세한 사항은 해당 MCU, stm32f407의 datasheet를 참고 하시기 바랍니다.

이부분은 stm32f407이 지원하고 있는 SPI속도와 구현 하려는 App.및 보드의 특성을
고려하여 설정하시기 바랍니다
W5200은 SPI Clock이 88MHz까지를 지원하고 있습니다.

감사합니다.

SPI의 Read/Write 설명이 아니라,

보통 Send나 Receive할 때 동일 함수 uint8_t SPI1_SendByte(uint8_t byte)를 씁니다.

Send할 때도 쓰고, Receive할 때도 쓰고.

그런데 Send시나 Receive시나 두 함수가 어떻게 공통으로 쓰이는지 궁금합니다.

안녕하세요.

앞에서도 말씀드렸다시피 SPI는 Write와 Read가 동시에 이루어 집니다.
따라서 한개의 함수를 이용하여 처리할 수 있으며 아래와 같이 사용하시면 됩니다.

send시에는 return값을 무시하시면 됩니다.

uint8 send_data = 0x01;
SPI1_SendByte();

반대로 recv시에는 return값을 사용하시면 됩니다.

uint8 recv_data;
recv_data = SPI1_SendByte(0x00); //0x00은 dummy data

감사합니다.

보통 함수 SPI1_SendByte(uint8_t byte)가 한 바이트를 쓰고 그 다음 값이 들어올때가지 기다립니다.

그리고 Receive를 하지요. 그런데 값이 들어오지 않으면 RXNE이 Flag가 1이 되지 않습니다. 그럼 계속 While에서

있습니다.

값이 들어오려면 Master에서 Clock을 보내야 하는데, 보내지도 않고 마냥 기다리는 것 같아요.

어떻게 하나요?

SPI1_SendByte(0x00);
를 하게 되면 클럭이 인가됩니다.

따라서 recv 할때도 send를 해야 하는 겁니다.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.