WIZnet Developer Forum

SPI connecting problem W5500 Ethernet Shield

Greetings!
I am getting wrong info from Ethernet Shield W5500. In datasheet it is said that the content of VersionR is always 0x04, but I’m getting 0x03. Also I have found in datasheet that the SPI speed varies in the range of 33.3 - 80 MHz. I’m using a board based on ATmega2560 with external crystall oscillator of 14.7456 MHz. Maybe the problem is in the wrong speed? But I have seen an example of using the W5500 ethernet shield with the Seeeduino which has a ATmega328 as a central unit and an external quarz of 16 MHz as a oscillator.
Please help me with this issue! :nerd:

There should be no minimal SPI speed threshold, thus if you think that SPI protocol has some problems just lower its speed down to 1 Hz, attach LEDs to the lines and see which signals are out there :slight_smile:
But in general, when chip responds with garbage, there’re two things to look into:

  1. power quality - 3v3 and 1v8;
  2. proper reset timing.

Евгений здравствуйте!
Сомнения по поводу скорости возникли, когда я увидел эту запись в даташите - там так и написано что скорость SPI гарантируется от 33 до 80. А скорость которую даёт микроконтроллер - самая быстрая F_osc/2. В моём случае порядка 7 МГц.
По поводу резета - в программе выдерживается необходимая длительность сигнал Резет - 1 мс, после него ещё 500 мкс.
То что вы написали про питание - я подаю 5 вольт. Стабилизатор их приводит к 3.3 вольтам. Тут проблем нет. Немного не ясно, что вы имели ввиду говоря о 1.8 вольтах.
Надеюсь на вашу помощь
Александр

Я понял, вы не разбираетесь в схемотехнике W5500.
В даташите написано -

Symbol Description Min Max Units FSCK SCK Clock Frequency 80/33.34 MHz То есть минимум не определен. Если плата уже готовая и вы пользуетесь платой как пользователь, и мы подразумеваем, что она не дефектная, то получается, что что-то действительно не то с протоколом SPI. Поэтому я предложил его потрассировать на самой минимальной скорости, то есть 1 Гц. Можно 0.5 Гц, чтобы успеть записать показания на линиях. Если убедитесь, что доступ по SPI производится правильно, тогда плата под вопросом - попробуйте взять другую (если есть). Вы умеете программировать SPI? Это немного нетривиальная задача.

Каюсь - я проглядел что 80/33 указаны, как максимум, а минимум пуст.
Тогда этот вопрос отпадает.
Что касается железа - обмен данными по SPI я осуществляю между “заводской” W5500 ethernet shield и своей платой с контроллером ATmega2560. На моей плате реализованы USART и SPI, собственно то что я получаю по SPI - транслирую обратно по USARTу для слежения.
Вообщем то для справедливости скажу, что со SPI я встречаюсь второй раз.
Базовые SPI функции я скопипастил с даташита. Там инициализация и операции чтения и записи. Я просимулировал инициализацию - всё пишется куда надо. Насчёт скорости я понял вашу идею - попробую проверить таким образом.
Обмен данными по СПИ я осуществляю таким образом:
MISO на вход
MOSI на выход
SS на выход
SCLK на выход
RESET на выход

SS ставится в 1
SPI настройка:
Мастер;
Первый бит - старший;
Скорость - тактовая частота/4;
Интерфейс - вкл.

(далее привожу код)


void resetW5500(void)
{
	SPI_port &=~ (1 << Reset_chip);//  генерируем «Сброс» для Ethernet  шилда 
	cpu_delay_ms(1, Fosc); //8000000);
	SPI_port |= (1 << Reset_chip);
	cpu_delay_us(500, Fosc); //8000000);
}

void spi_send(unsigned char data)
{	
	SPDR = data; 	
	
	while(!(SPSR & (1 << SPIF))); //if SPIF is set, than the byte is sent
}

unsigned char spi_read(void)
{
	while(!(SPSR & (1 << SPIF))); //if SPIF is set, than we can read a byte from SPDR
	
	return SPDR;	
}

void init_w5500(void)
{
	unsigned char ctrl = 0;
	unsigned char send_data = 0x80; //RST is 1 - all internal registers will be initialized
	unsigned char received_data[4];
	uint8 temp1;
	cpu_delay_ms(200, Fosc);
	resetW5500();	

	ctrl = 0x01;	// адрес блока - 00000, операция чтения - 0, режим - 1 фиксированный бит; итого: 0b00000001
	SPI_port &=~ (1 << SCS);
	spi_send(0x00);	//старший байт адреса
	spi_send(0x39); //младший байт адреса
	spi_send(ctrl); // команда
	temp1 = spi_read(); // читаем
	SPI_port |= (1 << SCS);
	cpu_delay_ms(1, Fosc);
	
	USART_Transmit(temp1);
}	
	

Если вам не сложно - помогите разобраться в чём же дело.

П.С.
Наименьшая частота линии SCLK, которая достижима при моём кварце (14.7456 МГц) - 115200 Гц. Достичь меньшего можно только используя встроенные источники тактирования МК, что я бы делать не хотел :slight_smile:

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