реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Как заставить PHY Ethernet отправлять и получать пакеты
Shevnnov
сообщение Sep 28 2010, 19:11
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498



Поправил проект квартуса (во-первых оказалось сначала выходы моего компонента из топового файла SOPC builder'a не включил в топовый файл квартуса, а во-вторых после того как включил, оказалось что память компонента у меня вместо RAM области полезла в логику - решилось переписывание модуля встроенной памяти по стандартному). Расставил пины, как они были до этого от TSE, в том числе RESET_N выставил единицу. Конфигурацию через MDIO не проводил (еще не писал). Включил в разъем RJ-45 заглушку (шла в комплекте с платой - такая как BSV писал).
Пакет отправил, пакет принялся. Данные совпадают кроме одного первого байта - он почему то всегда 0x505 был (хотя первый байт послыки был 0xAAAA). Остальный байты кадра дальше полностью совпадают.
Go to the top of the page
 
+Quote Post
x736C
сообщение Sep 28 2010, 19:53
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



Немного непонятно, как байт может иметь значения 0x505 или 0xAAAA. Первые два байта?

Байты 0x55 и 0xАА подобны с точностью до сдвига на один бит. Я бы тут покопал.

Сообщение отредактировал x736C - Sep 28 2010, 19:56
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Sep 29 2010, 01:15
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(x736C @ Sep 29 2010, 02:53) *
Байты 0x55 и 0xАА подобны с точностью до сдвига на один бит.

или чтение по-арабски, задом наперед
Go to the top of the page
 
+Quote Post
iosifk
сообщение Sep 29 2010, 05:32
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(x736C @ Sep 28 2010, 23:53) *
Байты 0x55 и 0xАА подобны с точностью до сдвига на один бит. Я бы тут покопал.

Тут надо не "копать" а "изучать".
На самом деле все работает так: сеть может быть проведена так, что + и - в паре окажутся перекрещенными.
Далее. И линия по получению преамбулы начинает "накачиваться", постоянная составляющая меандра приходит к нулю. Трансивер начинает хватать данные. Он может первым схватить 0, а может 1. Соотв. Получаем на приеме "Байты 0x55 и 0xАА". И это абсолютно правильно...
Когда в преамбуле идет шахматный код, то в линии это выглядит как меандр. И далее выдается код с нарушением этого меандра. Трансивер запоминает эту ситуацию и заносит бит в регистр "ксоринья". И после этого трансивер либо пропускает данные "как есть", либо инвертирует биты. Вот поэтому после преамбулы данные Вы получаете правильные.
Удачи!


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Shevnnov
сообщение Oct 1 2010, 14:47
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498



Реализовал на уровне драйвера интерфейс MDIO (с помощью команды IOWR изменяю значение регистров, которые идут на выход MDC и MDIO). Пробую считать значение регистра 0 - в ответ получаю одни 1. Непонятно, вроде формат кадра соблюдаю.

CODE
alt_u16 eth_phy_get_config (alt_u8 reg_address)
{
alt_u16 mdio_request = 0;
alt_u16 mdio_request_blank = 0x1980;
alt_u16 mdio_readdata = 0;
int i;
int tmp;

mdio_request = mdio_request_blank | ((alt_u16)((reg_address)&0x1f));

IOWR_ETH_CONTROL_MDIO_OPCODE(ETH_CONTROL_BASE, ETH_MDIO_OP_WRITE);

tmp = IORD_ETH_CONTROL_MDIO_READ_DATA(ETH_CONTROL_BASE) & ETH_CONTROL_MDIO_DATA_MSK;

for (i = 0; i < 14; i++)
{
tmp = (mdio_request >> (13-i)) & ETH_CONTROL_MDIO_DATA_MSK;
IOWR_ETH_CONTROL_MDIO_WRITE_DATA(ETH_CONTROL_BASE, tmp);
IOWR_ETH_CONTROL_MDIO_MDC_CLK(ETH_CONTROL_BASE,1);
IOWR_ETH_CONTROL_MDIO_MDC_CLK(ETH_CONTROL_BASE,0);
}

IOWR_ETH_CONTROL_MDIO_OPCODE(ETH_CONTROL_BASE, ETH_MDIO_OP_READ);

for (i = 0; i< 2; i++)
{
IOWR_ETH_CONTROL_MDIO_MDC_CLK(ETH_CONTROL_BASE,1);
IOWR_ETH_CONTROL_MDIO_MDC_CLK(ETH_CONTROL_BASE,0);
if (i==1) tmp = IORD_ETH_CONTROL_MDIO_READ_DATA(ETH_CONTROL_BASE) & ETH_CONTROL_MDIO_DATA_MSK;
}

for (i = 0; i<16; i++)
{
IOWR_ETH_CONTROL_MDIO_MDC_CLK(ETH_CONTROL_BASE,1);
IOWR_ETH_CONTROL_MDIO_MDC_CLK(ETH_CONTROL_BASE,0);

mdio_readdata = mdio_readdata | ((IORD_ETH_CONTROL_MDIO_READ_DATA(ETH_CONTROL_BASE) & ETH_CONTROL_MDIO_DATA_MSK) << (15 - i));
}

return mdio_readdata;
}
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Oct 1 2010, 14:56
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



скорее всего перепутали полярность mdio_oen, который управляет tri-state буфером
Go to the top of the page
 
+Quote Post
vitan
сообщение Oct 1 2010, 15:02
Сообщение #22


не указал(а) ничего о себе.
******

Группа: Свой
Сообщений: 3 325
Регистрация: 6-04-06
Пользователь №: 15 887



Цитата(Shevnnov @ Oct 1 2010, 18:47) *
Пробую считать значение регистра 0 - в ответ получаю одни 1.

Не надо гадать, ткните осциллографом в MDIO. PHY обязательно ответит, если на на то будут условия: правильный адрес, неактивный ресет, ну и т.п....
Go to the top of the page
 
+Quote Post
Shevnnov
сообщение Oct 1 2010, 16:21
Сообщение #23


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498



Цитата(vadimuzzz @ Oct 1 2010, 18:56) *
скорее всего перепутали полярность mdio_oen, который управляет tri-state буфером


MDIO портом управляю следующим образом:

Код
assign MDIO = (mdio_opcode_r) ? mdio_data_r : 1'hz


mdio_opecode_r выстанавливается в "1" командой IOWR_ETH_CONTROL_MDIO_OPCODE(ETH_CONTROL_BASE, ETH_MDIO_OP_WRITE); и в "0" командой IOWR_ETH_CONTROL_MDIO_OPCODE(ETH_CONTROL_BASE, ETH_MDIO_OP_READ)

Должно быть все нормально с iout портом

Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Oct 1 2010, 22:42
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(Shevnnov @ Oct 1 2010, 23:21) *
Должно быть все нормально с iout портом

а запись как идет?
Go to the top of the page
 
+Quote Post
Shevnnov
сообщение Oct 2 2010, 03:23
Сообщение #25


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498



Запись идет следующими командами:

Код
    IOWR_ETH_CONTROL_MDIO_OPCODE(ETH_CONTROL_BASE, ETH_MDIO_OP_WRITE); // выставить значение mdc_opcode на 1

    for (i = 0; i < 14; i++)
    {
        tmp = (mdio_request >> (13-i)) & ETH_CONTROL_MDIO_DATA_MSK;
        IOWR_ETH_CONTROL_MDIO_WRITE_DATA(ETH_CONTROL_BASE, tmp);     //  выставить следующий бит посылки
        IOWR_ETH_CONTROL_MDIO_MDC_CLK(ETH_CONTROL_BASE,1);              //   изменить значение mdc на 1
        IOWR_ETH_CONTROL_MDIO_MDC_CLK(ETH_CONTROL_BASE,0);              //  изменить значение mdc на 0
    }


в RTL это всё реализуется так:

CODE
//*********************** MIIM_MDIO *************************/

always @ (posedge clk or negedge rst)
begin
if(!rst)
mdio_opcode_r <= 1'b0;
else
if ((chipselect) && (ctrl_write) && (ctrl_address == MDIO_OPCODE))
mdio_opcode_r <= ctrl_writedata[0];
else
mdio_opcode_r <= mdio_opcode_r;
end

always @ (posedge clk or negedge rst)
begin
if (!rst)
mdio_data_r <= 1'b0;
else
if ((chipselect) && (ctrl_write) && (ctrl_address == MDIO_DATA))
mdio_data_r <= ctrl_writedata[0];
else
mdio_data_r <= mdio_data_r;
end

assign MDIO = (mdio_opcode_r) ? mdio_data_r : 1'bz;

always @(posedge clk or negedge rst)
begin
if(!rst)
mdio_clk_r <= 1'b0;
else
if ((chipselect) && (ctrl_write) && (ctrl_address == MDIO_DATA_CLK))
mdio_clk_r <= ctrl_writedata[0];
else
mdio_clk_r <= mdio_clk_r;
end

assign MDC = mdio_clk_r;

//****************** AVALON-MM_READ_INTERFACE *****************/
always @(posedge clk or negedge rst)
begin
if(!rst)
ctrl_readdata_r <= 32'b0;
else
if (chipselect & ctrl_read)
case (ctrl_address)
RX_RECEIVED_BYTES: ctrl_readdata_r <= {21'b0, rx_bite_count_clk_r};
TX_READY: ctrl_readdata_r <= {31'b0, tx_ready_clk_r};
MDIO_DATA: ctrl_readdata_r <= {31'b0, MDIO};
endcase
else
ctrl_readdata_r <= 32'd0;
end

assign ctrl_readdata = ctrl_readdata_r;



Симулировал систему в ModelSim'e - данные вылетают как надо (в плане записи по шине RTL). В нужном порядке. Только MDC получается не регулярный - состояние в значении 0 на порядок длиннее состояния в значении 1

Сообщение отредактировал Shevnnov - Oct 2 2010, 03:28
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Oct 2 2010, 03:44
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



а адрес PHY правильный указали (надо в даташите смотреть)?
Go to the top of the page
 
+Quote Post
Shevnnov
сообщение Oct 2 2010, 06:22
Сообщение #27


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498



Цитата(vadimuzzz @ Oct 2 2010, 07:44) *
а адрес PHY правильный указали (надо в даташите смотреть)?


Адрес PHY брал такой же как в примере в даташите был написан (0Ch)
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Oct 2 2010, 06:29
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(Shevnnov @ Oct 2 2010, 13:22) *
Адрес PHY брал такой же как в примере в даташите был написан (0Ch)

может он на плате резисторами задается? попробуйте в цикле перебрать все адреса PHY, а читать какой-нибудь ID-регистр
Go to the top of the page
 
+Quote Post
vitan
сообщение Oct 2 2010, 08:01
Сообщение #29


не указал(а) ничего о себе.
******

Группа: Свой
Сообщений: 3 325
Регистрация: 6-04-06
Пользователь №: 15 887



Цитата(Shevnnov @ Oct 1 2010, 20:21) *
Код
assign MDIO = (mdio_opcode_r) ? mdio_data_r : 1'hz

Я не знаток верилога... Это 1 Герц? Это может оказаться слишком медленно. Какой у Вас PHY?
Go to the top of the page
 
+Quote Post
Shevnnov
сообщение Oct 2 2010, 08:42
Сообщение #30


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 8-04-10
Из: Нижний Новгород
Пользователь №: 56 498



Цитата(vitan @ Oct 2 2010, 12:01) *
Я не знаток верилога... Это 1 Герц? Это может оказаться слишком медленно. Какой у Вас PHY?


Не 1'hz - это не частота, это присваиваю высокоимпедансное значение (z) 1 биту (h - шестнадцатеричная система счисления)
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 07:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016