Send command to W5500 on SPI


Hi everyone!
I have a microcontroller ATmega32 and Ethernet interface, based on W5500 chip. I know, there were a lot of topics about SPI, but i’ll ask my question: how to correctlly transmit SPI data? I am read chapter 2.2 about SPI frame, and wrote this code:

#define SPI_SS PB4 //SPI contact on my ATmega32
#define SPI_MOSI PB5
#define SPI_MISO PB6
#define SPI_SCK PB7

#define FDM1 01 //a two bits for fixed leight data mode
#define WRITE 1 //one bits for ‘read’ command
#define COMMON_BSB 00000 //select common register’s block

void spi_init() //Initialization of SPI
DDRB = (1<<SCK)|(1<<MOSI)|(1<<MISO);
SPCR = (0<<SPIE)|(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(1<<SPR1)|(1<<SPR0);
SPSR = (1<<SPI2X);

void spi_write(uint16_t address, uint8_t data)
SPDR = (addr<<8); //Send a high part of address
while(!(SPCR & (1<<SPIF))); //Waiting…
SPDR = addr; //Send a low part of address
while(!(SPCR & (1<<SPIF))); //Waiting
SPDR = (COMMON_BSB<<3)|(WRITE<<2)|(FDM1); //Send ‘control phase’ (BSB - 00000, WRITE - 1, FDM1 - 01)
while(!(SPCR & (1<<SPIF))); //Waiting…
SPDR = data; //Send data…
while(!(SPCR & (1<<SPIF))); //Waiting

So, I repeated the scheme of SPI frame, but i am not sure, that i make record in register correctly. Can anybody tell me that my tactics are correct or incorrect?

Sorry for grammatical errors, i am not english-speaking.

Happiness and joy to all. :slightly_smiling_face: :tada:


Compile the code and try it; in the best case you must also read the register contents to see what is in there to ensure that write was successful. Use any register which can be read back, for example SIPR.


Eugeny, I am sorry for “off topic” question.
Do you know, where I can see an example of using standert fuctions on w5500.h?
I am read “Socket APIs” document, but i am don’t understand, how to use standart functions.
Where can I see these things?

Thank you for any answer.


I am sure you will find examples of implementation for ATmega; if you want to know how to program W5500 then the best source of information should be the datasheet for the device. Function and procedures declared in the header file perform functions explained in the chapter 5 of the datasheet for W5100.


Евгений, добрый день!

Прошло достаточно много времени с момента старта этой темы, но я решил поделиться своими успехами и задать ещё один небольшой вопрос.

  1. Все мои функции чтения-записи работают. Mac, ip, mask и gate пишутся в регистры, и так же хорошо оттуда читаются. Я даже считал версию чипа (0x04). В этом плане мои действия оказались правильны.

  2. Но чип всё равно упорно не хочет запускаться с моими настройками. Сначала я делаю хард-ресет, потом пишу в MR 0x80, но мои настройки всё равно не определяются системой (вместо указанного мною ip адреса там появляется совершенно другой). Скажите, пожалуйста, на что мне ещё следует обратить внимание в таком случае? Система, кстати, Windows 10.

Буду благодарен за любой ответ.

С Уважением, Александр.