Jump to content

    

Recommended Posts

Всем доброго времени суток! Некоторое время назад начал разбираться с интерфейсом RGMII и уже неделю не могу добиться данных на передачу по этому интерфейсу. Своих идей уже нет и как я почитал на форумах такой проблемы ни у кого и близко не было, в основном затыки на передачу на уровне физики возникают.

 

Исходный данные у меня такие:

-IDE Quartus 13.1;

-отладочная плата на базе Stratix III, на ней микросхема PHY 88E1111;

-PHY и TSE сконфигурировал для связи по RGMII, тактовая 125 МГц;

-обработка пакетов производится связкой TSE+SGDMA+NIOS2;

-TSE сконфигуриван с выравниванием по 32;

-соединение отладочной платы с ПК точка-точка;

-приём настроить удалось, пакет от ПК (ARP) сохраняется в память, по прерыванию я его обрабатываю и отправляю ответ;

 

-SGDMA_tx обрабатывает дескриптор, и я вижу в SignalTap как по шине Avalon-ST в TSE передаётся сформированный мной ответный пакет (скрин 1 из SignalTap);

 

И тут у меня вопрос: SGDMA отновременно с концом пакета EOP выставляет 4 байта данных (frame word) и out_empty[1..0]=2, которые подключены к линиям ff_tx_mod[1..0] корки TSE - в доке на TSE говорится что это "Indicates invalid bytes in the final frame word", а русской доке на Avalon-ST говорится что EOP интепретируется каждым ведомым индивидульно.

 

Вопрос 1: теоретически всё правильно-SGDMA сказал TSE сколько валидных байт защёлкнуть на такте при появлении EOP?

 

Вопрос 2: эта же двойка присутствует на такте "старт пакета" - это правильно?

 

-тактовую на вход TSE интерфейса RGMII tx_clk подаю от PLL 125 МГц;

-в SignalTap по фильтру all names удалось найти внутренние линии/отладочные регистры корки TSE под названием U_RGMII и на линии tx_data я вижу свои данные вместе с безошибочной преамбулой RGMII на передачу и двумя потерянными байтами 0xFF, tx_control не вижу (скрин 2 из SignalTap);

-на пинах не вижу не tx_data не tx_control;

 

Вопрос 3: если с выравниванием проблемы нет то куда можно капнуть?

 

-адрес буфера с пакетом выравнивал на 32, но пока писал что то сомневаться начал, после праздника попробую поиграться....

-передача по TSE разрешена, прикреплю на всякий случай код настройки TSE;

-HW reset от кнопки есть и использую;

 

void MacInit()

{

// Initialize MAC registers

IOWR_ALTERA_TSEMAC_CMD_CONFIG( TSE_MAC_BASE, IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE) | ALTERA_TSEMAC_CMD_SW_RESET_MSK );

while(IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE) & ALTERA_TSEMAC_CMD_SW_RESET_MSK);

//Установил адрес MDIO устройства

IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_MAC_BASE, 0x12);

//Инициализация физического уровня

HWresetPHY();

PHYDeviceInit();

//Шаг a

alt_u32 mode = 0;

//Запрещяю приём и передачу

mode = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE) & (~ALTERA_TSEMAC_CMD_TX_ENA_MSK) & (~ALTERA_TSEMAC_CMD_RX_ENA_MSK);

IOWR_ALTERA_TSEMAC_CMD_CONFIG( TSE_MAC_BASE, mode );

//Жду когда биты разрешения приёма и передачи станут 0 при чтении

mode = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE);

while( (mode & ALTERA_TSEMAC_CMD_TX_ENA_MSK) || (mode & ALTERA_TSEMAC_CMD_RX_ENA_MSK) )

mode = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE);

 

//IOWR_32DIRECT( TSE_MAC_BASE, 0xD0*4, 8<<16 );

 

//Шаг b

IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(TSE_MAC_BASE, 8);

IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(TSE_MAC_BASE, 8);

IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_RECEIVE_FIFO_DEPTH-16);

IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE_MAC_BASE, 16);

IOWR_ALTERA_TSEMAC_TX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_TRANSMIT_FIFO_DEPTH-16);

IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(TSE_MAC_BASE, 3);

IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(TSE_MAC_BASE,8);

IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_MAC_BASE, 16);

//Шаг c

IOWR_ALTERA_TSEMAC_MAC_0(TSE_MAC_BASE,0x7761632A);

IOWR_ALTERA_TSEMAC_MAC_1(TSE_MAC_BASE,0x00002A61);

//Шаг d

IOWR_ALTERA_TSEMAC_FRM_LENGTH(TSE_MAC_BASE, 1518);//frame length 16-bit - 1518

IOWR_ALTERA_TSEMAC_TX_IPG_LENGTH(TSE_MAC_BASE,12);

//IOWR_ALTERA_TSEMAC_PAUSE_QUANT(TSE_MAC_BASE, 0xFFFF); //XON

//IOWR_32DIRECT(TSE_MAC_BASE, 0x44, 0xFFFF); //XOFF

mode = ALTERA_TSEMAC_CMD_XON_GEN_MSK |

ALTERA_TSEMAC_CMD_ETH_SPEED_MSK

| ALTERA_TSEMAC_CMD_PROMIS_EN_MSK

| ALTERA_TSEMAC_CMD_HD_ENA_MSK

| ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK

//| ALTERA_TSEMAC_CMD_LOOPBACK_MSK

| ALTERA_TSEMAC_CMD_XOFF_GEN_MSK

| ALTERA_TSEMAC_CMD_CNT_RESET_MSK

| ALTERA_TSEMAC_CMD_RX_ERR_DISC_MSK;

IOWR_ALTERA_TSEMAC_CMD_CONFIG( TSE_MAC_BASE, mode);

//Шаг e

IOWR_ALTERA_TSEMAC_CMD_CONFIG( TSE_MAC_BASE, mode | ALTERA_TSEMAC_CMD_SW_RESET_MSK );

while(IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE) & ALTERA_TSEMAC_CMD_SW_RESET_MSK);

 

//alt_u32 rr = IORD_32DIRECT(TSE_MAC_BASE, 0x3A*4);

 

//Шаг f

mode |= ALTERA_TSEMAC_CMD_TX_ENA_MSK |

ALTERA_TSEMAC_CMD_RX_ENA_MSK;

IOWR_ALTERA_TSEMAC_CMD_CONFIG( TSE_MAC_BASE, mode );

//Жду когда биты разрешения приёма и передачи станут 1 при чтении

mode = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE);

while( !(mode & ALTERA_TSEMAC_CMD_TX_ENA_MSK) || !(mode & ALTERA_TSEMAC_CMD_RX_ENA_MSK) )

mode = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE);

}

 

Заранее спасибо за ответы)

post-71762-1488918641_thumb.jpg

post-71762-1488918649_thumb.jpg

Edited by Boom-Zoom

Share this post


Link to post
Share on other sites

Насколько я помню, в этом чипе (88E1111) нужны дополнительные телодвижения при инициализации в режиме RGMII. Поищите в этой теме:

https://electronix.ru/forum/index.php?showtopic=37680

Share this post


Link to post
Share on other sites

Про передачу марвелом я почитываю... Но сейчас дело в том что от 88E1111 в сторону TSE данные идут (приём работает). А в обратную сторону данные на TSE от системы обработки поступают, но на выход TSE данные не выставляет.

 

Может быть кто то сможет скрины из SignalTap выложить с успешной транзакцией(переданным далее по RGMII пакетом) по Avalon-St от SGDMA к TSE?

Или может быть есть ещё какая то информация относительно линий ff_tx_mod[1..0] которую я упустил?

Share this post


Link to post
Share on other sites

Общую тактовую подаю на PLL, повышаю её в два раза, от 250 МГц тактирую SignalTap и собственно в нём смотрю. Если вы про осциллограф, то до него ещё дело не дошло т.к. эти линии внутри ПЛИС не вырабатываются.

Share this post


Link to post
Share on other sites
Общую тактовую подаю на PLL, повышаю её в два раза, от 250 МГц тактирую SignalTap и собственно в нём смотрю. Если вы про осциллограф, то до него ещё дело не дошло т.к. эти линии внутри ПЛИС не вырабатываются.

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

Share this post


Link to post
Share on other sites
Посмотрите в сообщениях квартуса при компиляции, не выбросил ли он эти цепи из сигналтапа. Еще можно прицепить сигналтап к входным портам выходных ddr-регистров, к этим точно можно подключаться

 

Спасибо за совет, проверю. Пока решил на GMII перейти, перенастроил проект, данные из TSE сразу появились. Но передачи в сеть сегодня так и не добился. Решил что сначала дожму GMII, потом вернусь к RGMII.

 

Share this post


Link to post
Share on other sites

Недавно удалось получить положительный результат. Решил похвалиться) И рассказать о ключевых моментах.

 

Во первых решил сначала пробовать запускать проект на 100 мб используя MII. Опытный коллега, который использовал MII/GMII интерфейс выдал самописный коммутатор сигналов, который нужен для полноценной поддержки трёх скоростей. Без него либо 10/100 либо 1000. Этот коммутатор есть на картинках в руководстве на корку TSE в виде кубика, с описанием принципа его работы. Картинку я вспомнил, описание не вспомнил) но перечитывать не стал т.к. выдали обкатанное решение. Ещё дал совет перепроверить автосогласование.

 

Вставил к себе в проект ииии... ничего не заработало.

Стал копаться в процессе автосогласования. Заметил такою вещь - с партнёром у которого принудительно выставленно 100 у меня поднимается линк 1000.

Подумал...Почитал... Нашёл статусные регистры в которых есть данные о поддерживаемых партнёром режимах работы. В итоге добавил в функцию настройки марвела цикл ожидания окончания процесса автосогласования.

Написал функцию которая читает статусные регистры марвела, хранящие свой режим работы и режим работы партнёра, на их основе определяет максимальную, общую для себя и партнёра скорость и основываясь на этой скорости настраивает три бита SPEED, 10MB и HALF_DUPLEX в регистре команд TSE.

Общий смысл такой: если оба партнёра поддерживают 1000 полный дуплекс, то биты 10MB и HALF_DUPLEX выставлять не надо. Если общая максимальная скорость 100 полный дуплекс, то биты SPEED и HALF_DUPLEX выставлять не надо и т.д.

После вызова PHYDeviceInit(); Добавил вызов новой функции. Соответственно переколбасил настройку регистра команд дальше по тексту.

 

Запустил. Немного поотлаживал протоколы arp и icmp и всё заработало как часы. Пробовал на 100 полный дуплекс (это MII) и 1000 полный дуплекс (GMII).

 

Переконфигурировал корку TSE на RGMII, изменил режим работы марвела с GMII на RGMII, зашил. И RGMII завёлся с полпинка. PROFIT))).

 

Всем отвечавшим и сопереживавшим спасибо. Надеюсь кому то эта тема поможет.

Share this post


Link to post
Share on other sites

Удалось ли вам посмотреть сигналтапом сигналы на выходах DDR регистров?

У меня ни разу не получилось. Толи я такой дурной, толи очередная "фича" от альтеры.

Edited by umarsohod

Share this post


Link to post
Share on other sites
Удалось ли вам посмотреть сигналтапом сигналы на выходах DDR регистров?

У меня ни разу не получилось. Толи я такой дурной, толи очередная "фича" от альтеры.

В квартусе я только мышкой пины с модулем nios соединять умею) Но если правильно понял и речь о RGMII интерфейсе то у меня было две ситуации связанные с DDIO (Quartus 13.1):

- проект не собирался если в сигнал тап была попытка анализировать внутренний регистр U_RGMII корки TSE и пины используемые интерфейсом RGMII, на анализ нужно было ставить что то одно;

- мне советовали в assignment editor добавить правило, в котором нужно указать что пины RGMII подключаются через DDIO регистры. Попробовал, проект так же не собирался.

Поэтому у меня в проекте содержимое assignment editor,почти, отражает содержимое pin planner, правило global clock добавлял на входную тактовую. И ещё правилами тактовых приёма и передачи игрался, в каком они состоянии не помню.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this