본문 바로가기

[INTERFACE]/WIZNET_EVM

[W5100] SPI모드 제어시 주의 사항

[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;
}

 
SPI 타이밍도



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 로 해야
한다.



반응형