Перейти к содержанию
    

Дорогие сотоварищи!

У меня есть вопрос о запуске W5300
Я пытаюсь использовать его в режиме UDP (для использования далее  с VLC Player)
В datasheet W5300 существует неясное описание
1) Не описано определение битов WDF в регистре MR
2) Не описано определение адресации регистра. В одном случае написано
big-endian , в другом - в 16-битном режиме наоброт
3) Пример инициализации не состоит из регистров для сокетов? ...
Пожалуйста подкорректируйте мои предположение, кто работал с W5300
Ниже приведена инициализация

localparam MR_ADR = 16'0000;
// Исходный аппаратный адрес физический адрес (MAC-адрес)
localparam SHAR = 16'h0008; // milticast datasheet exmp 00.08.DC.01.02.03
localparam SHAR_ADR = 10 часов 008; //
localparam SHAR2 = 16'hDC01;
localparam SHAR2_ADR = 10'0000A; //
localparam SHAR4 = 16'h0203;
localparam SHAR4_ADR = 10'0000C; //
// Шлюз IP-адрес 192.168.0.1
localparam GAR = 16'hC0A8;
localparam GAR_ADR = 10'h010;
localparam GAR2 = 16'0000;
localparam GAR2_ADR = 10'h012;
// Маска подсети с адресом СУБР 255.255.255.0
localparam SUBR = 16'hFFFF;
localparam SUBR_ADR = 10'h014;
localparam SUBR2 = 16'hFF00;
localparam SUBR2_ADR = 10'h016;
// Исходный IP-адрес 192.168.0.3
localparam SIPR = 16'hC0A8;
localparam SIPR_ADR = 10'h018;
localparam SIPR2 = 16'h0003;
localparam SIPR2_ADR = 10'h01A;
/// Тайм-аут повторной передачи RTR 400 мс
localparam RTR = 16'h0fA0;
localparam RTR_ADR = 10'h01C;
/// RCR количество раз повторной передачи
localparam RCR = 16'000000;
localparam RCR_ADR = 10'h01E;
localparam TMS01R = 16'h4000; // SOCKET0 - 64 КБ, SOCKET1 - 0 КБ
localparam TMS01R_ADR = 10'h020;
localparam TMS23R = 16'0000; // SOCKET2 - 0 КБ, SOCKET3 - 0 КБ
localparam TMS23R_ADR = 10'h022;
localparam TMS45R = 16'0000; // SOCKET4 - 0 КБ, SOCKET5 - 0 КБ
localparam TMS45R_ADR = 10'h02C;
localparam TMS67R = 16'0000; // SOCKET6 - 0 КБ, SOCKET7 - 0 КБ
localparam TMS67R_ADR = 10'h026;
localparam RMS01R = 16'h0C00; // SOCCKET0 - 12 КБ
localparam RMS01R_ADR = 10'h028;
localparam RMS23R = 16'0000; // SOCKET2 - 0 КБ, SOCKET3 - 0 КБ
localparam RMS23R_ADR = 10'h02A;
localparam RMS45R = 16'0000; // SOCKET4 - 0 КБ, SOCKET5 - 0 КБ
localparam RMS45R_ADR = 10'h02C;
localparam RMS67R = 16'0000; // SOCKET6 - 0 КБ, SOCKET7 - 0 КБ
localparam RMS67R_ADR = 10'h02E;
localparam MTYPER = 16'h00FF; // TX - 8 блоков, RX- 8 блоков
localparam MTYPER_ADR = 10'h030;
локальный параметр PTIMER = 16'0000C8; // 5 с эхо-запрос
localparam PTIMER_ADR = 10'h036;
localparam PMAGICR = 16'0000; // магическое число
localparam PMAGICR_ADR = 10'h038;
локальный параметр PSIDR = 16'0000; // идентификатор сеанса PPP
localparam PSIDR_ADR = 10'h03C;
localparam PDHAR = 16'0000; // PPPoE аппаратный адрес назначения 00.01.02.03.04.05
localparam PDHAR_ADR = 10'h040;
localparam PDHAR2 = 16'h0203; //
localparam PDHAR2_ADR = 10'h042;
localparam PDHAR4 = 16'h0405; //
localparam PDHAR4_ADR = 10'h044;
localparam Pn_BRDYR = 16'0000; // Отключить PIN BRDY
localparam P0_BRDYR_ADR = 10'h060;
localparam SnMR = 16'000000; // Включить socketn для UDP // = 16'h0082; // Включить socketn для UDP
localparam SnMR_RST = 16'h0080;
localparam S0MR_ADR = 10'h200;
localparam SnCRopen = 16'h0031; // Открыть Socketn (с SEND и SEND_MAC = 1?)
localparam S0CR_ADR = 10'h202;
localparam SnCclose = 16'0000; // Закрыть Socketn
localparam Sn_IMR = 16'0000; // SENDOK разрешение прерывания
localparam S0_IMR_ADR = 10'h204;
localparam Sn_IR = 16'h0010; // очищаем прерывание SENDOK
localparam S0_IR_ADR = 10'h206;
localparam Sn_InitDONE = 16'h0032; // SOCKET - это режим UDP после OPEN
localparam Sn_CLOSE = 16'0000; //
localparam Sn_PORTR = 16'h1388; // Исходный порт номер 5000
localparam S0_PORTR_ADR = 10'h20A;
localparam Sn_DHAR = 16'h0008; // Целевой аппаратный адрес Socketn 00.08.DC.01.02.10
localparam S0_DHAR_ADR = 10'h20C;
localparam Sn_DHAR2 = 16'hDC01; //
localparam S0_DHAR2_ADR = 10'h20E;
localparam Sn_DHAR4 = 16'h0210; //
localparam S0_DHAR4_ADR = 10'h210;
localparam Sn_DPORTR = 16'h1388; // Номер порта назначения Socketn = 5000
localparam S0_DPORTR_ADR = 10'h212;
// localparam Sn_DIPR = 16'hC0A8; // Целевой IP-адрес Socketn C0.A8.00.0B
localparam Sn_DIPR = 16'hFFFF; // IP-адрес получателя Socketn 255.255.255.255
localparam S0_DIPR_ADR = 10'h214;
localparam Sn_DIPR2 = 16'hFFFF; // IP-адрес получателя Socketn 255.255.255.255
localparam S0_DIPR2_ADR = 10'h216;
localparam Sn_MSSR = 16'h05B4; // Максимальный размер сегмента
localparam S0_MSSR_ADR = 10'h218;
localparam Sn_TX_WRSR = 16'h0001; // размер данных 64 КБ, записанных во внутренней памяти TX

////

CS_1:
		
	case(flag_st)
	
	SWreset:
	if(clk_cnt == 3'b000)
	comnd = WAIT;
	
	WAIT:
	if(clk_cnt == 3'b000)
	comnd = MRr;
	
	MRr:
	if(clk_cnt == 3'b000)
	comnd = S0MR;
	
	S0MR:
	if(clk_cnt == 3'b000)
	comnd = IMRr;
	
	IMRr:
	if(clk_cnt == 3'b000)
	comnd = SHARr;
	
	SHARr:
	if(clk_cnt == 3'b000)
	comnd = SHAR2r;
	
	SHAR2r:
	if(clk_cnt == 3'b000)
	comnd = SHAR4r;
	
	SHAR4r:
	if(clk_cnt == 3'b000)
	comnd = GARr;
	
	GARr:
	if(clk_cnt == 3'b000)
	comnd = GAR2r;
	
	GAR2r:
	if(clk_cnt == 3'b000)
	comnd = SUBRr;
	
	SUBRr:
	if(clk_cnt == 3'b000)
	comnd = SUBR2r;
	
	SUBR2r:
	if(clk_cnt == 3'b000)
	comnd = SIPRr;
	
	SIPRr:
	if(clk_cnt == 3'b000)
	comnd = SIPR2r;
	
	SIPR2r:
	if(clk_cnt == 3'b000)
	comnd = RTRr;
	
	RTRr:
	if(clk_cnt == 3'b000)
	comnd = RCRr;
	
	RCRr:
	if(clk_cnt == 3'b000)
	comnd = MTYPERr;
	
	
	MTYPERr:
	if(clk_cnt == 3'b000)
	comnd = TMSRr;
	
	TMSRr:
	if(clk_cnt == 3'b000)
	comnd = RMSRr;
	
	RMSRr:
	if(clk_cnt == 3'b000)
	comnd = DIP;
	
	DIP:
	if(clk_cnt == 3'b000)
	comnd = DIP2;
	
	DIP2:
	if(clk_cnt == 3'b000)
	comnd = S0PORTR;
	
	S0PORTR:
	if(clk_cnt == 3'b000)
	comnd = CR_0;
	
	endcase

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а почему вы не пользуетесь их библиотекой? у них очень хорошо все расписано и настроено.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я смотрел их библилотеку, делаю все также, регистры пишутся, читаются, но не пингуеться и wireshark ничего не показывает что записываю. И ножка инит постоянно в высоком уровне.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот рабочий пример. UDP и TCP.

Только в дефайнах поставьте W5300, я работаю с W5500

 

Wiznet.zip

 

замените w5500.c w5500.h на w5300.c w5300.h

w5300.c

w5300.h

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо!

Вроде все так как и у вас на этапе инициализации

Но по прежнему ничего нет, регистры пишутся , записываются но режим UDP не устанавливается и INT в HIGH

 

В связи с этим уточняющий вопрос - после какой минимальной конфигурации устройство должно пинговатся?

 

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, another_one said:

Спасибо!

Вроде все так как и у вас на этапе инициализации

Но по прежнему ничего нет, регистры пишутся , записываются но режим UDP не устанавливается и INT в HIGH

 

В связи с этим уточняющий вопрос - после какой минимальной конфигурации устройство должно пинговатся?

 

Спасибо!

вот мой тестовый мейн

void main()
{
    GPIO_Setup();
    USART_Setup(USART1, 921600); 
    SPI_Setup(SPI1);
    DWT_Init();

    WIZNET_Init();  
    
    while(1)
    {
        
        //WIZNET_RunTcpServer(SOCK_TCPS, g_data_buff, PORT_TCPS, &g_size);
        WIZNET_RunUdpServer(SOCK_UDPS, g_data_buff, PORT_UDPS);
    }
  
 }

Со стороны компьютера запускаю Hercules.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 часов назад, another_one сказал:

В связи с этим уточняющий вопрос - после какой минимальной конфигурации устройство должно пинговатся?

Для 3100, 3150, 5100 так: MR(RST = 0, PB=0), SHAR, GWR, SUBR, SIPR.

С 5300 уже не работал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо!

Я посмотрел Ваш

WIZNET_Init()

  и складывается впечатление что достаточно записать MR, SHAR, GAR, SUBR, SIPR, чтобы устройство начало пинговатся...

Еще маленький вопрос - есть ли зависимость этих адресов от инициализации, например если я поставлю на свое усмотрение, может ли быть это причиной дальнейших проблем с инициализацией

2 minutes ago, Сергей Борщ said:

Для 3100, 3150, 5100 так: MR(RST = 0, PB=0), SHAR, GWR, SUBR, SIPR.

С 5300 уже не работал.

Спасибо!

Получается что так

Но что-то не заводиться... и уже все что можно перепроверил

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 минут назад, another_one сказал:

есть ли зависимость этих адресов от инициализации

Разумеется. SHAR должен быть уникален в вашей подсети, SUBR должен содержать маску именно вашей подсети, куда включено устройство, SIPR должен принадлежать вашей подсети и быть уникальным в этой подсети. GAR должен содержать адрес шлюза этой подсети.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 minutes ago, Сергей Борщ said:

Разумеется. SHAR должен быть уникален в вашей подсети, SUBR должен содержать маску именно вашей подсети, куда включено устройство, SIPR должен принадлежать вашей подсети и быть уникальным в этой подсети. GAR должен содержать адрес шлюза этой подсети.

Похоже именно в этом проблема, я записывал все значения этих регистров как в даташите

Прошу подсказать исходя из

https://my-files.ru/ear7xp

Какие данные нужно записывать в моем случае

Заранее благодарен!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое!

Теперь пингуется!)))

Только вот в режим UDP не входит

Мониторю Wireshark'ом, передачу еще пока никакую не делаю

Ожидаю факт открытия UDP, которого не происходит согласно данным в S0_CR и S0_SSR

Вероятно что-то напутал с адресами, прошу меня подкорректировать

Вот моя инициализация конкурирования UDP и его открытие

:

1) nRESET pin hold in low 10
2) After nRESET release(going to HIGH) wait 10 ms
3) Write to MR        (address 0x000)    = 0x0000    ;
4) Write to IMR        (address 0x004)     = 0x70FE    ;
5) Write to SHAR    (address 0x008)     = 0x0008    ;
6) Write to SHAR2    (address 0x00A)     = 0xDC01    ;
7) Write to SHAR4    (address 0x00C)     = 0x0203    ;
8) Write to GAR        (address 0x010)     = 0xA9FE    ;
9) Write to GAR2    (address 0x012)     = 0xD959    ;
10) Write to SUBR    (address 0x014)     = 0xFFFF    ;
11) Write to SUBR2    (address 0x016)     = 0x0000    ;
12) Write to SIPR    (address 0x018)     = 0xA9FE    ;
13) Write to SIPR2    (address 0x01A)     = 0xD957    ;
14) Write to RTR    (address 0x01C)    = 0x0FA0    ;
15) Write to RCR    (address 0x01E)    = 0x0007    ;
16) Write to MTYPER    (address 0x30)    = 0x00FF    ;
17) Write to TMS01R    (address 0x20)    = 0x400        ;
18) Write to RMS01R    (address 0x028)    = 0x0C00    ;
19) Write to S0_MR    (address 0x200)    = 0x0002    ;
20) Write to S0_IMR    (address 0x204)    = 0x0011    ;
21) Write to S0_DIP    (address 0x214)    = 0xA9FE    ;
22) Write to S0_DIP2    (address 0x216)    = 0xD955    ;
23) Write to S0_PORTR    (address 0x20A)    = 0x1388    ;
24) Write to S0_DPORTR    (address 0x212)    = 0x1388    ;
25) Write to S0_CR    (address 0x202)     = 0x0001    ;

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, another_one сказал:

Ожидаю факт открытия UDP, которого не происходит

А его и не будет - UDP протокол без соединений, как только что-нибудь пошлете - оно и выскочит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо!, я тоже так подумал, но смущает тот факт что регистры S0_CR и S0_SSR  не показывают что прошла инициализация UDP, т.е сокет не открыт в UDP, как я тогда буду что-то посылать??

S0_CR показывает LISTEN...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал передать в этих условиях, wireshark не показывает передачу по UDP. Посмотрел посредством netstat какие UDP открыты, использую один из них, указываю  DIPR 0.0.0.0, DPORTR 5000.

По-прежнему SOCK_UDP не читается

Прошу подсказать что не так с инициализацией UDP, видимо что-то в указанием адресов и портов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, another_one said:

Попробовал передать в этих условиях, wireshark не показывает передачу по UDP. Посмотрел посредством netstat какие UDP открыты, использую один из них, указываю  DIPR 0.0.0.0, DPORTR 5000.

По-прежнему SOCK_UDP не читается

Прошу подсказать что не так с инициализацией UDP, видимо что-то в указанием адресов и портов

я  не понял вы сокет открываете? (socket(sn, Sn_MR_UDP, port, 0x00)).  что показывает Sn_SR?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...