[W5100] SPI 제어시 주의 사항
SPI 결선 회로도
회로도는 아래와 같고 MCU의 /SS신호는 GPIO로 대체 가능하다.
W5100의 SPI 제어는 4byte로 해야하며 Write시 0xF0 OP code가 들어가고 이후 어드레스 2byte, data 1byte로 제어할 수 있다. Read시 0x0F OP code + Address + data로 제어 가능하다.
주의사항
SPI제어시 SPI_EN핀은 High가 되어야 하고, /SCS핀은 레지스터 제어시 Low로 start하고, 4byte전송후 High로 end 해야 한다.
W5100 SPI제어 예제 코드
/**
@brief This function writes the data into W5100 registers.
*/
uint8 IINCHIP_WRITE(uint16 addr,uint8 data)
{
IINCHIP_ISR_DISABLE();
IINCHIP_SpiInit();
//SPI MODE I/F
IINCHIP_CSoff(); // SCS=0, SPI start
IINCHIP_SpiSendData(0xF0); //Write OP code
IINCHIP_SpiSendData((addr & 0xFF00) >> 8); //High Address
IINCHIP_SpiSendData(addr & 0x00FF); //Low Address
IINCHIP_SpiSendData(data); //Write Data
IINCHIP_CSon(); // SCS=1, SPI end
IINCHIP_ISR_ENABLE();
return 1;
}
/**
@brief This function reads the value from W5100 registers.
*/
uint8 IINCHIP_READ(uint16 addr)
{
uint8 data;
IINCHIP_ISR_ENABLE();
IINCHIP_ISR_DISABLE();
IINCHIP_SpiInit();
IINCHIP_CSoff(); // SCS=0, SPI start
IINCHIP_SpiSendData(0x0F); //Read OP code
IINCHIP_SpiSendData((addr & 0xFF00) >> 8); //High Address
IINCHIP_SpiSendData(addr & 0x00FF); //Low Address
IINCHIP_SpiSendData(0);
data = IINCHIP_SpiRecvData(); //Read Data
IINCHIP_CSon(); // SCS=1, SPI end
IINCHIP_ISR_ENABLE();
return data;
}
W5100 SPI사용시 문제점
1. 문제의 원인
W3150A+, W5100 를 SPI 모드로 사용할 때 /SCS 가 high 일 경우에도 MISO 출력을
drive 한다. 따라서 SPI master(일반적으로 MCU)가 SPI 버스상에 다른 SPI device 를 read
또는 write 할 경우 read/write 가 제대로 안될 수 있다. 단 SPI 버스상에 다른 SPI device 가
없을 경우는 문제가 안된다.
2. 해결 방법
SPI bus 상에 다른 SPI device 를 access 할 때, W3150A+, W5100 의 SPI_EN 을 low 로 한 후
access 를 한다. 물론 다시 W3150A+, W5100 를 access 할 때는 SPI_EN 을 high 로 해야
한다.