Всем доброго времени суток! Некоторое время назад начал разбираться с интерфейсом 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);
}
Заранее спасибо за ответы)
Сообщение отредактировал Boom-Zoom - Mar 7 2017, 20:36
Эскизы прикрепленных изображений