W5500

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Аватара пользователя
VVVa
Открыл глаза
Сообщения: 53
Зарегистрирован: Вс янв 05, 2020 18:22:29

W5500

Сообщение VVVa »

Кто работал с этим чудом - отзовитесь пожалуста
Не могу с ним связаться по SPI
В лучшем случае после трансмита 4 байта единиц ....
Разное пробывал:
1 на микроконтроллере MI MO соединял - работает - дело в w5500
2 CS на землю бросал - не помогло
3 ресет w5500 делал
4 подключал с витой паре
5 другие регистры пробывал читать
...
ничего не помогло
А самое главное - как он должен реагировать когда режим SPI не правильный или когда формат команды не тот (тоже вроде всё перепробывал)?
Реклама
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: W5500

Сообщение roman.com »

[uquote="VVVa",url="/forum/viewtopic.php?p=4609557#p4609557"]Кто работал с этим чудом - отзовитесь[/uquote]
я много лет работаю...
и тут...
https://www.radiokot.ru/forum/viewtopic ... 8&t=190542
и тут...
https://www.radiokot.ru/forum/viewtopic ... 3&t=166654
и повсюду))

никаких проблем нет)) W5500 работает идеально))
:tea:
Реклама
Аватара пользователя
Starichok51
Модератор
Сообщения: 19053
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: W5500

Сообщение Starichok51 »

VVVa писал(а):Разное пробывал:
надо пробОвать, а не пробЫвать, тогда всё получится.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Re: W5500

Сообщение AlanDrakes »

Вообще, w5500 по большей части беспроблемный чип. Читается-пишется на скоростях до 20МГц точно (быстрее не требовалось разгонять, но по Datasheet'у - до 33МГц (гарантированно) и 80МГц (теоретически)).
Для проверки пробуйте читать его регистр версии (0x39) - должно возвращаться значение "4"
Ну и вся посылка (для проверки) должна выглядеть так: (биты выталкиваются от старшего к младшему).
0x00, 0x39, 0x01, 0x00
Чип должен ответить:
0x??, 0x??, 0x??, 0x04
Не забудьте добавить слабую подтяжку линии MISO к земле, чтобы не ловить помехи. Ну и направление собственно пина проверьте. Сам на эти грабли наступал.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
VVVa
Открыл глаза
Сообщения: 53
Зарегистрирован: Вс янв 05, 2020 18:22:29

Re: W5500

Сообщение VVVa »

судя по даташиту он работаеть должен с ARM_SPI_CPOL0_CPHA0 (The W5500 supports SPI Mode 0 and Mode 3)?

"Не забудьте добавить слабую подтяжку линии MISO к земле, чтобы не ловить помехи." - а почему это нужно ? резистор мегаомный? (может там открытый коллектор и к питанию нужно притянуть?)
"Ну и направление собственно пина проверьте." - замыкал на микроконтроллере MI и MO - получил что отправил вроде проверил

спасибо!

Добавлено after 37 minutes 11 seconds:
упс! работает ...
просто с частотой часиков в микроконтроллере намудрил...
утро вечера мудренеее...
Всем спасибо!
Реклама
Аватара пользователя
VVVa
Открыл глаза
Сообщения: 53
Зарегистрирован: Вс янв 05, 2020 18:22:29

Re: W5500

Сообщение VVVa »

проблемный чип!!!
Если получать и отправлять до 4 байт, то всё нормально (в заголовке размер указывается)
А вот если надо больше 4х байт за раз - то CS сигнал хардовый с STM32 почемуто ему не нравится, после него выдаёт бред...
Это все по 4 байта читают или у когото работает?

А не подскажите он DHCP поддерживает или нет? И что в него отправить чтоб автоматом IP с маской получал?
Реклама
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 431
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: W5500

Сообщение HardWareMan »

DHCP это же протокол а не настройка. Хотя, если оно в ICMP умеет, то есть вероятность что и в DHCP тоже умеет. Надо в букваре смотреть.
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Аватара пользователя
VVVa
Открыл глаза
Сообщения: 53
Зарегистрирован: Вс янв 05, 2020 18:22:29

Re: W5500

Сообщение VVVa »

просбома с CS решилась - просто програмно пин дёргаю ... работает
А вот DHCP ни в какую ...
Может оно ни у кого не работает?

Так TCP тоже протокол поверх сырых сокетов ... почему одни протоколы есть, а других нету
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 431
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: W5500

Сообщение HardWareMan »

[uquote="VVVa",url="/forum/viewtopic.php?p=4611819#p4611819"]Так TCP тоже протокол поверх сырых сокетов ... почему одни протоколы есть, а других нету[/uquote]
Без DHCP жить можно а без TCP - нет. А внутри места, видимо, не так много. Я работал с W5300, но не было надобности в DHCP. Вот тут тема с вопросом про DHCP, посмотри, может чего интересного найдёшь.
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: W5500

Сообщение roman.com »

HardWareMan писал(а):ез DHCP жить можно а без TCP - нет.
ну я как то вот много лет уже живу без дебильного TCP ... и нормально так ))
:tea:

Добавлено after 1 minute 52 seconds:
[uquote="VVVa",url="/forum/viewtopic.php?p=4611819#p4611819"]А вот DHCP ни в какую ...[/uquote]
DHCP у W5500 нет... самому писать надо... а в чём проблема ? када мне надо было DHCP я писал...
:tea:

Добавлено after 3 minutes 50 seconds:
у меня вот много лет уже W5500 работает прекрасно...
схема.jpg
(184.61 КБ) 104 скачивания
никаких проблем нет... от слова ваще))
:tea:
Аватара пользователя
VVVa
Открыл глаза
Сообщения: 53
Зарегистрирован: Вс янв 05, 2020 18:22:29

Re: W5500

Сообщение VVVa »

roman.com!
Да Вы как я погляжу аскет... и даже каждый раз ip c маской вводить не ленитесь при перенастройке сети...
Может скажите почему ему хардовый CS не понравился с STM32F401CCU6?
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6308
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: W5500

Сообщение Jack_A »

Спасибо, насмешил. Когда человек употребляет "вумное" слово, не понимая его смысл - хороший ржач.
Но телепатически я уловил содержимое: имел в виду "эстет". :))
Изображение
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: W5500

Сообщение roman.com »

- он имел в виду "аскет".

- я не аскет.. я продвинутый пользователь))

- DHCP есть в роутере)) одного DHCP в сети достаточно... самому писать DHCP не надо.
VVVa писал(а):Может скажите почему ему хардовый CS не понравился с STM32F401CCU6?
у W5500 есть разные форматы работы по SPI...
формат работы по SPI задаётся в настройках W5500...
Screenshot_1.jpg
(62.56 КБ) 95 скачиваний
VVVa писал(а):просбома с CS решилась - просто програмно пин дёргаю ... работает
- я использую формат работы по SPI с управлением по CS...
VVVa писал(а):CS на землю бросал - не помогло
в этом режиме CS на землю бросал нельзя...
в этом режиме надо после передачи каждой команды поднимать CS... (устанавливать высокий уровень на выводе CS).
высокий уровень на выводе CS модуль W5500 воспринимает как окончание команды...
проверьте формат работы по SPI в своей программе...
:tea:

Добавлено after 4 minutes 23 seconds:
чтоб не ходить далеко...
вот рабочая схема...
схема.jpg
(95.75 КБ) 105 скачиваний
вот рабочая программа...
-инициализация W5500:

Код: Выделить всё

////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////W5500 PHY:
//перед настройкой PHY сделать программный Cброс PHY: 
PORTB.2=0;        // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI();  // Address Registers + Control Registers 
tx=0x00; SPI();   // Data  -0x00
tx=0x00; SPI();   // Data  -0x00
PORTB.2=1;        // SS W5500
//пишем режим PHY:
// 1...  ....  RST - 1.
// .1..  ....  программная настройка режима - 1
// ..0.  ....  10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// ...0  ....  10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// ....  1...  10BT Full-duplex, Auto-negotiation disabled / Power Down mode
// ....  .1..  Duplex Status
// ....  ..0.  Speed Status 
// ....  ...1  Link Status
PORTB.2=0;        // SS W5500
tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI();  // Address Registers + Control Registers  
tx=0xC8; SPI();   // Data -0xC8 (10 Мбит/с, Full-duplex)  
tx=0x00; SPI();   // Data -0x00                     
PORTB.2=1;        // SS W5500
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////Socket_0 - MACRAW:
//протокол: пишем протокол MACRAW Socket_0: 
PORTB.2=0;        // SS W5500
tx=0x00; SPI(); tx=0x00; SPI(); tx=0x0C; SPI();  // Address Registers + Control Registers    
tx=0x04; SPI();   // Data -0x04 // MACRAW // Socket_0
PORTB.2=1;        // SS W5500
//пишем команду OPEN Socket_0:
PORTB.2=0;        // SS W5500
tx=0x00; SPI(); tx=0x01; SPI(); tx=0x0C; SPI();  // Address Registers + Control Registers    
tx=0x01; SPI();   // Data -0x01 (команда OPEN)  
PORTB.2=1;        // SS W5500
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////Socket_0 - INT:
//INT Mask Socket_0: пишем INT Mask Socket_0: (SIMR) 0x0018
PORTB.2=0;        // SS W5500
tx=0x00; SPI(); tx=0x18; SPI();  tx=0x04; SPI(); // Address Registers + Control Registers    
tx=0x01; SPI();   // Data 0x01 -Enable INT Socket_0.
PORTB.2=1;        // SS W5500
//INT Mask Socket_0 RECV: пишем INT Mask завершение приёма Socket_0: (Sn_IMR) 0x002C
PORTB.2=0;        // SS W5500
tx=0x00; SPI(); tx=0x2C; SPI(); tx=0x0C; SPI();  // Address Registers + Control Registers    
tx=0x04; SPI();   // Data 0x04 -INT Mask завершение приёма. 
PORTB.2=1;        // SS W5500
}
////////////////////////////////////////////////////////////////////////////////
и т.д.
:tea:

- тут я использую режим MACRAW.
в этом режиме W5500 тупо принимает и отправляет Ethernet пакеты.
больше ничего W5500 в этом режиме не делает))
а все Интернет протоколы у меня зашиты в МК типа ATmega328.

- другие режимы есть по ссылке что я давал выше...
:tea:
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Re: W5500

Сообщение AlanDrakes »

[uquote="VVVa",url="/forum/viewtopic.php?p=4612055#p4612055"]Может скажите почему ему хардовый CS не понравился с STM32F401CCU6?[/uquote]

У меня работает с аппаратным /CS. Разве что он включается-выключается при включении-выключении бита разрешения работы SPI-блока в контроллере.

Поднял исходники, мигрирующие по разным чипам, с которыми работал... и я отправляю данные в режиме VDM (Variable length Data Mode) и проблем нет.

Если что-то не работает - первым делом проверяйте код. А вообще обзаведитесь логическим анализатором, хотя бы простейшим, чтобы понимать, что происходит на шине.

DHCP - да, требуется программный, либо статика. А сам чип его не умеет делать (да и не надо).
Спойлер

Код: Выделить всё

volatile uint8_t TX_BUF_1[8];		// Заголовок и первый байт (если один)
volatile uint8_t RX_BUF_1[8];		// Буфер под ответ (если 1 байт данных)

void w5500_SPI_TXRX(uint16_t RamAddress, uint8_t Register, uint8_t RW, uint16_t DataSize, void *DataAddress) {
	Register = Register & 0x1F;
	RW = RW & 0x01;
	RX_BUF_1[3] = 0;
	TX_BUF_1[0] = (RamAddress >> 8);
	TX_BUF_1[1] = (RamAddress & 0xFF);
	TX_BUF_1[2] = (Register << 3) | (RW << 2);
	TX_BUF_1[3] = *((uint8_t *)DataAddress);
	SPI2->CR2 |= SPI_CR2_SSOE;				// Enable CS output.
	SPI2->CR1 |= SPI_CR1_SPE;				// Включаем SPI2
	DMA1->LIFCR = 0x0F600000;
	DMA1->HIFCR = 0x0000003D;
	// Отправляем заголовок и до 5 байт вслед за ним (требуется для отправки данных, которые передаются через стэк).
	// Требуется для передачи настроек.
	if (DataSize == 1) {
		DMA1_Stream4->NDTR = 4;
		DMA1_Stream3->NDTR = 4;
	} else if (DataSize == 2) {
		DMA1_Stream4->NDTR = 5;
		DMA1_Stream3->NDTR = 5;
		DataAddress++;
		TX_BUF_1[4] = *((uint8_t *)DataAddress);
		DataSize--;
	} else if (DataSize == 4) {
		DataAddress++;
		TX_BUF_1[4] = *((uint8_t *)DataAddress);
		DataAddress++;
		TX_BUF_1[5] = *((uint8_t *)DataAddress);
		DataAddress++;
		TX_BUF_1[6] = *((uint8_t *)DataAddress);
		DMA1_Stream4->NDTR = 7;
		DMA1_Stream3->NDTR = 7;
		DataSize -= 3;
	}
	DMA1_Stream4->M0AR = (uint32_t)&(TX_BUF_1);
	DMA1_Stream3->M0AR = (uint32_t)&(RX_BUF_1);
	DMA1_Stream4->CR |= DMA_SxCR_MINC;
	DMA1_Stream3->CR |= DMA_SxCR_MINC;
	DMA1_Stream3->CR |= DMA_SxCR_EN;
	DMA1_Stream4->CR |= DMA_SxCR_EN;
	while (DMA1_Stream3->CR & DMA_SxCR_EN);
	while (DMA1_Stream4->CR & DMA_SxCR_EN);
	// Сбрасываем флаги
	DMA1->LIFCR = 0x0F600000;
	DMA1->HIFCR = 0x0000003D;
	if (!RW) {
		*((uint8_t *)DataAddress++) = RX_BUF_1[3];
	}
	DataAddress++;
	DataSize--;
	if (DataSize) {
		// Если более 1 байта данных - передача будет продолжена.
		DMA1_Stream4->NDTR = DataSize;
		DMA1_Stream3->NDTR = DataSize;
		if (RW) {
			// TX
			DMA1_Stream4->M0AR = (uint32_t)DataAddress;
			DMA1_Stream3->M0AR = (uint32_t)&(DevNull);
			DMA1_Stream4->CR |= DMA_SxCR_MINC;
			DMA1_Stream3->CR &= ~(DMA_SxCR_MINC);
		} else {
			// RX
			DevNull = 0;
			DMA1_Stream4->M0AR = (uint32_t)&(DevNull);
			DMA1_Stream3->M0AR = (uint32_t)DataAddress;
			DMA1_Stream4->CR &= ~(DMA_SxCR_MINC);
			DMA1_Stream3->CR |= DMA_SxCR_MINC;
		}
		DMA1_Stream3->CR |= DMA_SxCR_EN;
		DMA1_Stream4->CR |= DMA_SxCR_EN;
		while (DMA1_Stream3->CR & DMA_SxCR_EN);
		while (DMA1_Stream4->CR & DMA_SxCR_EN);
		
	}
	SPI2->CR1 &= ~(SPI_CR1_SPE);				// Disable SPI2
	SPI2->CR2 &= ~(SPI_CR2_SSOE);				// Disable CS output.
}

void w5500_Init(uint32_t IPAddr, uint32_t NetMask, uint32_t GW, uint8_t *Mac) {
	w5500_SetMac(Mac);
	w5500_SetLocalIP(IPAddr);
	w5500_SetNetMask(NetMask);
	w5500_SetGW(GW);
}
uint8_t Lan_Init(void) {
	uint32_t i;
	uint8_t v;
	GPIOE->BSRR = GPIO_BSRR_BR_14;
	LinkState = 0;
	SPI_MUTEX = 0;
	for (i=0;i<SOCKETS_COUNT;i++) {
		Sock[i].flags = SOCKET_NON_USABLE;
	}
	RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;			// Enable DMA1
	RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;			// Enable SPI2
	delay_ms(1);
	GPIOE->BSRR = GPIO_BSRR_BS_14;				// UnReset W5500
	delay_ms(2);
	v = w5500_GetVersion();
	if (v != 0x04) {
		console_timestamp();
		console_put("eth0: PHY not detected. Chip version: 0x");
		console_put_hex_byte(v);
		console_put(" != 0x04\r\n");
		return 0x02;
	}
	// Сброс чипа. Софт-ресет.
	v = MR_RST;
	i = 0;
	w5500_SetMode(v);
	while(v) {
		delay_us(100);					// Ожидаем окончания сброса кристалла.
		v = w5500_GetMode();				// Читаем состояние регистра
		v = (v & MR_RST);				// Выбираем только флаг сброса
		i++;						// Отсчитываем время
		if (i > 100) {
								// Если больше 100 мс - сбой.
			console_timestamp();
			console_put("eth0: Reset timeout.\r\n");
			break;
		}
	}
	if (v == MR_RST) {
		return 0x01;					// Если сброс не завершился - выходим с ошибкой
	}
	for (i=0;i<SOCKETS_COUNT;i++) {
		w5500_SetSocketMem(i, 2, 2);			// Устанавливаем стандартное распределение памяти
	}
	w5500_Init(ntohl(System_IPAddress), ntohl(System_NetMask), ntohl(System_GW), System_MACAddress);
	return 0;		// Временно-постоянно
}
Ответить

Вернуться в «Периферия»