vadimuzzz 0 10 апреля, 2013 Опубликовано 10 апреля, 2013 · Жалоба поправил для передатчика set phy_tsu 10 set phy_th 0 set_output_delay -clock { txclk_virt } -rise -max $phy_tsu [get_ports {enet0_tx_d* enet0_tx_en}] set_output_delay -clock { txclk_virt } -rise -min -$phy_th [get_ports {enet0_tx_d* enet0_tx_en}] насчет приемника, думаю дело не в констрейнах. имеет смысл пробежаться сигналтапом, начиная от выхода TSE и до приемного sgdma Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 11 апреля, 2013 Опубликовано 11 апреля, 2013 (изменено) · Жалоба поправил для передатчика set phy_tsu 10 set phy_th 0 set_output_delay -clock { txclk_virt } -rise -max $phy_tsu [get_ports {enet0_tx_d* enet0_tx_en}] set_output_delay -clock { txclk_virt } -rise -min -$phy_th [get_ports {enet0_tx_d* enet0_tx_en}] насчет приемника, думаю дело не в констрейнах. имеет смысл пробежаться сигналтапом, начиная от выхода TSE и до приемного sgdma Спасибо. Я виноват. Мог-бы и сам заметить опечатку. Сигналтапом нет возможности. Пробую другие варианты системы... Если не сложно посоветуйте пожалуйста где можно почитать как строится скрипт констрейнов .sdc. Совсем смутно в этом ориентируюсь. Изменено 11 апреля, 2013 пользователем Acvarif Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acvarif 0 14 апреля, 2013 Опубликовано 14 апреля, 2013 · Жалоба Железо перепроовал по всякому (разные процессоры и т.п) Всеравно 88e1111 виснет на приемнике. В то же время на DE0Nano + ksz8721 и приемник и передатчик работает на любом железе и при небольших вариациях констрейнов без проблем. Нашел пару документов 1. http://www.altera.com/literature/ug/ug_tq_tutorial.pdf 2. http://embedders.org/sites/default/files/T...for_dummies.pdf Попробую проанализировать стандартный пример web сервера. Пример работает нормально. Но там столько наворочено... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 28 мая, 2013 Опубликовано 28 мая, 2013 · Жалоба Помогите объяснить разницу в результатах работы функций 1 и 2. 2 - абсолютно рабочая, 1 - для нормальной работы системы необходимо поставить breakpoint и просмотреть содержимое структуры, после чего tse mac начинает принимать пакеты. 1.-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- np_tse_mac *pmac= (np_tse_mac *) TSE_MAC_BASE; void TseMacInit() { ... ... pmac->COMMAND_CONFIG = ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK; ... ... } 2.-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void TseMacInit() { ... ... IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE, ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK); ... ... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 30 мая, 2013 Опубликовано 30 мая, 2013 · Жалоба Помогите объяснить разницу в результатах работы функций 1 и 2. 2 - абсолютно рабочая, 1 - для нормальной работы системы необходимо поставить breakpoint и просмотреть содержимое структуры, после чего tse mac начинает принимать пакеты. во втором случае запись гарантировано идет мимо кэша. в первом же случае необходимо сбрасывать кэш, например установкой breakpoint Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 4 июня, 2013 Опубликовано 4 июня, 2013 (изменено) · Жалоба во втором случае запись гарантировано идет мимо кэша. в первом же случае необходимо сбрасывать кэш, например установкой breakpoint т.е. нельзя объявить указатель на структуру, описывающую регистры периферии, привязать к соответствующему адресу и использовать для конфигурации данного модуля? В обязательном порядке необходимо использовать макросы IOWR, IORD? Поясните пожалуйста, что значит - сбрасывать кэш. Если я использую указатель, то данные сначала запишутся в кэш, а потом необходимо их каким-то образом переписать в регистр? Изменено 4 июня, 2013 пользователем doom13 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
targasonic 0 7 июня, 2013 Опубликовано 7 июня, 2013 · Жалоба Подскажите пожалуйста с реализацией UDP протокола на Cyclone III: Я столкнулся с задачей передачи видео по RTP/RTCP, который стоит поверх UDP/IP. Поэтому по сути мне нужно реализовать обмен данными по UDP, возникли вопросы как это сделать и с чего начать... Элементная база: Cyclone III, Marvell 88E1111, SDRAM В связи со спецификой разработки НЕ могу использовать операционные системы. Как я понимаю, таким образом и NicheStack не получиться подключить. Скорость передачи: 48 МБ/с = 380 Мбит/с Не очень понимаю функционал Triple Speed Ethernet, на вход этой мегафункции необходимо подавать полностью сформированные данные со всеми заголовка, crc и т.д. или часть задач она берет на себя? Подскажите в каком направление двигаться, заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 7 июня, 2013 Опубликовано 7 июня, 2013 · Жалоба Подскажите пожалуйста с реализацией UDP протокола на Cyclone III: Я столкнулся с задачей передачи видео по RTP/RTCP, который стоит поверх UDP/IP. Поэтому по сути мне нужно реализовать обмен данными по UDP, возникли вопросы как это сделать и с чего начать... Элементная база: Cyclone III, Marvell 88E1111, SDRAM В связи со спецификой разработки НЕ могу использовать операционные системы. Как я понимаю, таким образом и NicheStack не получиться подключить. Скорость передачи: 48 МБ/с = 380 Мбит/с Не очень понимаю функционал Triple Speed Ethernet, на вход этой мегафункции необходимо подавать полностью сформированные данные со всеми заголовка, crc и т.д. или часть задач она берет на себя? Подскажите в каком направление двигаться, заранее спасибо. Начать с передачи-приёма данных с помощью ядра TSE, выше выкладывали рабочий драйвер, а к нему уже привинтить реализацию UDP. На вход мегафункции TSE подаётся готовый пакет со всеми заголовками, IP-crc и UDP-crc. TSE считает только контрольную сумму всего пакета (FRAME CHECK SEQUENCE), может заменять мак-адрес передатчика и при приёме может осуществлять фильтрацию мак-адресов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 9 июня, 2013 Опубликовано 9 июня, 2013 · Жалоба т.е. нельзя объявить указатель на структуру, описывающую регистры периферии, привязать к соответствующему адресу и использовать для конфигурации данного модуля? В обязательном порядке необходимо использовать макросы IOWR, IORD? можно, используйте функцию alt_remap_uncached. иногда можно кэш данных вообще выбросить без ущерба для производительности, зависит от типа памяти. Поясните пожалуйста, что значит - сбрасывать кэш. Если я использую указатель, то данные сначала запишутся в кэш, а потом необходимо их каким-то образом переписать в регистр? если используете указатель, значит работаете с памятью. вот компилятор и считает себя в праве оптимизировать доступ. если это не совсем то, что вы от него желаете, надо бить его иногда по рукам. в HAL для этого есть несколько функций: alt_dcache_flush() alt_dcache_flush_all() alt_icache_flush() alt_icache_flush_all() alt_remap_cached() alt_remap_uncached() alt_uncached_free() alt_uncached_malloc() Элементная база: Cyclone III, Marvell 88E1111, SDRAM В связи со спецификой разработки НЕ могу использовать операционные системы. Как я понимаю, таким образом и NicheStack не получиться подключить. Скорость передачи: 48 МБ/с = 380 Мбит/с я в этой теме выкладывал пример проекта. после небольшой доработки напильником, из него можно выжать примерно вдвое больше Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TASK 0 10 июня, 2013 Опубликовано 10 июня, 2013 · Жалоба Помогите, пожалуйста, разобраться с приемом TSE. За основу взят проект уважаемого VadimZZZ. Kit DK-DEV-4CGX15N, Cyclone IV, SGMI, Marvell 88e1111. Передача работает. Приема нет При PING ллаты (broadcast) не попадаю в обработчик прерывания. Код выкладываю. eth_driver.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 10 июня, 2013 Опубликовано 10 июня, 2013 · Жалоба Помогите, пожалуйста, разобраться с приемом TSE. За основу взят проект уважаемого VadimZZZ. Kit DK-DEV-4CGX15N, Cyclone IV, SGMI, Marvell 88e1111. Передача работает. Приема нет При PING ллаты (broadcast) не попадаю в обработчик прерывания. Код выкладываю. Вообще не заходит в прерывание или заходит один раз при старте? Если заходит один раз - где-то ошибка с sgdma, разрешено ли прерывание при возникновении ошибки в макросе ALTERA_TSE_SGDMA_INTR_MASK? Я бы построил обработчик прерывания несколько иначе, см. ug_embedded_ip.pdf подраздел Building and Updating Descriptor List. alt_sgdma_descriptor * pCurrDescRx = &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]; alt_sgdma_descriptor * pNextDescRx = &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST]; char *rx_buff; int SgDMARx_Isr(void* context, alt_u32 id) { alt_u32 data; alt_u32 *uncached_packet; alt_sgdma_descriptor *pDescRx; alt_u32 desc_stat = 0; data = IORD_ALTERA_AVALON_SGDMA_CONTROL( SGDMA_RX_BASE ); data &= ~(ALTERA_AVALON_SGDMA_CONTROL_IE_GLOBAL_MSK | ALTERA_AVALON_SGDMA_CONTROL_RUN_MSK); IOWR_ALTERA_AVALON_SGDMA_CONTROL( SGDMA_RX_BASE, data ); if(IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK) { IOWR_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE, 0); desc_stat = IORD_ALTERA_TSE_SGDMA_DESC_STATUS(pCurrDescRx); if(desc_stat & ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK) { pCurrDescRx->status &= ~ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_TERMINATED_BY_EOP_MSK; //,,, (ОБРАБОТКА ПРИНЯТОГО ПАКЕТА) } uncached_packet = (alt_u32 *)alt_remap_cached((volatile void*) rx_buff, 4); alt_avalon_sgdma_construct_stream_to_mem_desc(pCurrDescRx, pNextDescRx, uncached_packet, 0, 0); alt_dcache_flush(uncached_packet, 4); while (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) ; alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, pCurrDescRx); } return 0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TASK 0 10 июня, 2013 Опубликовано 10 июня, 2013 · Жалоба Порядок действий: 1) В режиме DEBUG устанавливается точка останова в начале обработчика прерывания int tse_sgdmaRx_isr(void * context, alt_u32 irqnum) 2) Запускается программа int main() { alt_u32 t=0; alt_printf("Hello from NIOS\n"); MAC_init(); while (1){ } return 0; } 3) Затем с PC подается ARP-запрос: Ping 192.168.1.2 4) На точку останова в обработчике ни разу не попасть! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TASK 0 10 июня, 2013 Опубликовано 10 июня, 2013 · Жалоба Не попасть при приема в обработчик прерывания. (для Cyclone IV, SGMI, Marvell 88e1111) int MAC_init() { alt_u32 ,t2=0; int status=0; p_counter=0; IOWR_ALTERA_TSEMAC_MDIO_ADDR1(TSE_MAC_BASE, 0); // PHY and other board peripherial initialization IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_MAC_BASE,PHY); t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x1B); //Extended PHY Specific Status Register t2 &= 0xFFF0; IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x1B,t2 | 0x4);//SGMII without clock to Copper t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x14); // Disable RGMII Timing Control t2 &= ~0x82; //marvell_cfg_sgmii IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,0x14, t2); t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,ALTERA_TSEMAC_PHY_ADDR_CONTROL);// PHY reset IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE,1,ALTERA_TSEMAC_PHY_ADDR_CONTROL,t2 | PCS_CTL_sw_reset);//Previous Operations Require SW Reset if((IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_STATUS) & PCS_ST_an_done) == 0) { IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL + 16, 0x78); t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL); IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_CONTROL, t2 | PCS_CTL_sw_reset); } // Without next string don't work reading packet t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, ALTERA_TSE_PCS_IF_MODE); IOWR_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 0, ALTERA_TSE_PCS_IF_MODE,t2 | 0x03); // PCS SGMII mode enabled do { Delay(0xFFFFF); t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_MAC_BASE, 1, ALTERA_TSEMAC_PHY_ADDR_STATUS); }while((t2&0x04)==0); //wait for link-up // Get the Rx and Tx SGDMA addresses sgdma_tx_dev = alt_avalon_sgdma_open(SGDMA_TX_NAME); sgdma_rx_dev = alt_avalon_sgdma_open(SGDMA_RX_NAME); IOWR_ALTERA_AVALON_SGDMA_CONTROL (SGDMA_RX_BASE,ALTERA_AVALON_SGDMA_CONTROL_SOFTWARERESET_MSK); IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_RX_BASE, 0x0); // reset the mac IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE, ALTERA_TSEMAC_CMD_SW_RESET_MSK | ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK ); while(IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE) & ALTERA_TSEMAC_CMD_SW_RESET_MSK); // Initialize MAC registers IOWR_ALTERA_TSEMAC_FRM_LENGTH(TSE_MAC_BASE, ALTERA_TSE_MAC_MAX_FRAME_LENGTH); IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(TSE_MAC_BASE, 8); IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(TSE_MAC_BASE, 8); IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(TSE_MAC_BASE, 8); IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(TSE_MAC_BASE, 3); IOWR_ALTERA_TSEMAC_TX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_TRANSMIT_FIFO_DEPTH - 16); //1024/4; IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_MAC_BASE, 0); 32/4; // start transmit when there are 48 bytes IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_RECEIVE_FIFO_DEPTH - 16); //4000/4); IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE_MAC_BASE, 0); IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE_MAC_BASE,ALTERA_TSEMAC_TX_CMD_STAT_TXSHIFT16_ MSK); //IOWR_ALTERA_TSEMAC_TX_CMD_STAT(TSE_MAC_BASE,0); IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE_MAC_BASE,ALTERA_TSEMAC_RX_CMD_STAT_RXSHIFT16_ MSK); //IOWR_ALTERA_TSEMAC_RX_CMD_STAT(TSE_MAC_BASE,0); IOWR_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE, ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK | ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK | ALTERA_TSEMAC_CMD_RX_ERR_DISC_MSK | ALTERA_TSEMAC_CMD_PAD_EN_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK);//???ALTERA_TSEMAC_CMD_PROMIS_EN_MSK IOWR_ALTERA_TSEMAC_MAC_0(TSE_MAC_BASE,((int)(0x00) | (int)(0x07 << 8) | (int)(0xED << 16) | (int)(0x19 << 24))); IOWR_ALTERA_TSEMAC_MAC_1(TSE_MAC_BASE,(((int)(0x05) | (int)(0x9B << 8)) & 0xFFFF)); alt_avalon_sgdma_register_callback(sgdma_rx_dev,(alt_avalon_sgdma_callback)&tse_sgdmaRx_isr,(alt_u16)ALTERA_TSE_SGDMA_INTR_MASK, sgdma_rx_dev); alt_u32 *uncached_packet_payload; uncached_packet_payload = (void *)alt_remap_cached ((volatile void*) pkt, 4); alt_avalon_sgdma_construct_stream_to_mem_desc( (alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST], // descriptor I want to work with (alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST], // pointer to "next" uncached_packet_payload, // starting write_address 0, // read until EOP 0); while ( (IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE) & ALTERA_AVALON_SGDMA_STATUS_BUSY_MSK) ); t2=alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]); sem=0; return status; } //--------------------------------------------------------------------------------------------- int tse_sgdmaRx_isr(void * context, alt_u32 irqnum) { alt_u32 t2=0; alt_u32 *uncached_packet_payload; t2=IORD_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE); if (t2 & (ALTERA_AVALON_SGDMA_STATUS_CHAIN_COMPLETED_MSK | ALTERA_AVALON_SGDMA_STATUS_DESC_COMPLETED_MSK)) { p_counter++; alt_printf("Packet counter:%x\n",p_counter); IOWR_ALTERA_AVALON_SGDMA_STATUS(SGDMA_RX_BASE,ALTERA_AVALON_SGDMA_STATUS_CHAIN_C OMPLETED_MSK); t2=IORD_ALTERA_TSE_SGDMA_DESC_STATUS(&desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]); /*check status and handle packet*/ if( (t2 & (ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_CRC_MSK | ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_PARITY_MSK | ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_OVERFLOW_MSK | ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_SYNC_MSK | ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_UEOP_MSK | ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_MEOP_MSK | ALTERA_AVALON_SGDMA_DESCRIPTOR_STATUS_E_MSOP_MSK ) ) == 0) { t2=IORD_16DIRECT(&desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST].actual_bytes_transferred, 0)-2; CheckPacket(pkt,t2); } else { alt_printf("RX descriptor reported error. Packet dropped\n"); } uncached_packet_payload = (void *)alt_remap_cached ((volatile void*) pkt, 4); alt_avalon_sgdma_construct_stream_to_mem_desc( (alt_sgdma_descriptor *) &desc[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST], // descriptor I want to work with (alt_sgdma_descriptor *) &desc[ALTERA_TSE_SECOND_RX_SGDMA_DESC_OFST], // pointer to "next" uncached_packet_payload, // starting write_address 0, // read until EOP 0); // don't write to constant address t2=alt_avalon_sgdma_do_async_transfer(sgdma_rx_dev, &des[ALTERA_TSE_FIRST_RX_SGDMA_DESC_OFST]); } return 0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexPec 3 11 июня, 2013 Опубликовано 11 июня, 2013 · Жалоба Помогите, пожалуйста, разобраться с приемом TSE. За основу взят проект уважаемого VadimZZZ. Kit DK-DEV-4CGX15N, Cyclone IV, SGMI, Marvell 88e1111. Передача работает. Приема нет При PING ллаты (broadcast) не попадаю в обработчик прерывания. Код выкладываю. Дурацкий вопрос - а констрейны для приема прописали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dlsh 2 15 июня, 2013 Опубликовано 15 июня, 2013 · Жалоба Здравствуйте. возник вот какая проблема с использованием PHY_88E1111 + MAC_tse + Nios. В ниосе проект от уважаемого vadimzzz. Когда подключаешся к сети то все нормально все пакеты ходят взад вперед, все работает, лампочки усердно мигают . Собственно так проект и отладили до конца через общественную сеть. Сложность возникла когда стали использовать Media Converter 10/100/1000Base-T to 1000Base-X. Есть два конвертера, когда делаешь связку общественная сеть --- КонвертерА --- оптика --- КонвертерВ -- ПК то все работает как положено, все линки есть и сеть работает. А вот когда подключаешь прибор например к КонвертеруА( или Б) то лампочки на конвертере горит только PWR и иного мигает FDX (по описанию это означает коллизия). На плате прибора тоже все лампочки гаснут и иного мигает лампочка Duplex как сказано в описание тоже означает что коллизия. ни какое шаманство с регистрами не поменяло состояние. Еще заметил что часто бывает что первое чтение после программного сброса возвращает нормальные записи в реситрах, а последующие чтения рестров возвращают всегда фффф. При просмотре сигналов видно что действительно марвел не отвчает по шине мдио/млс. при подключении прибора к ПК на прямую прямым кабелем светодиоды маргают что линк есть, но данные идут странные вот когда связь есть т.е. общественная сеть http://gyazo.com/05d003d967dae4be0368f02ece9c225d а вот когда анпрямую к ПК http://gyazo.com/114e94aa45b6d8446475cd91f440cf26 видно что потерялась преамбула я так понимаю что марвел должен был автоматом поменять полярность.. или что то нужно еще сделать чтобы это произошло? вот рисунок дампа регистров взятых и марвела http://gyazo.com/ac80ec5b599128cc1efa4ab7eabe9288 здесь показан дамп регистров когда прибор подключен к сети и с линком все нормально http://gyazo.com/c04829de874a1f808321ff8f5d146e03 документация на конвертер http://gyazo.com/d313c01d2734b09e4c8329fceed85d16 http://gyazo.com/4c2a277e89eec85bf7ba3d7974a13a04 фотка конвертера при подключении его к прибору http://gyazo.com/63121c90c10225904d2e760dbd4445a6 вот код подключения модуля module DevEthernet( // Clock input CLOCK_50, // reset input reset_n, // Ethernet output NET0_GTX_CLK, output NET0_MDC, inout NET0_MDIO, output NET0_RESET_N, input NET0_RX_CLK, input [3: 0] NET0_RX_DATA, input NET0_RX_DV, output [3: 0] NET0_TX_DATA, output NET0_TX_EN ); wire sys_clk, clk_125, clk_25, clk_2p5, clk_200, tx_clk; wire core_reset_n; wire mdc, mdio_in, mdio_oen, mdio_out; wire eth_mode, ena_10; // -- wire udp_stack_fifo_start_to_ethernet; // udp_stack_fifo.start_to_ethernet wire [7:0] udp_stack_fifo_rd_data; // .rd_data wire udp_stack_fifo_rdreq; // .rdreq wire udp_stack_fifo_rdempty; // .rdempty wire [10:0] udp_stack_fifo_rdusedw; // .rdusedw wire [7:0] udp_stack_fifo_wr_data; // .wr_data wire udp_stack_fifo_wrreq; // .wrreq wire udp_stack_fifo_wrfull; // .wrfull wire udp_stack_eth_cntrl_export; // udp_stack_eth_cntrl.export assign mdio_in = NET0_MDIO; assign NET0_MDC = mdc; assign NET0_MDIO = mdio_oen ? 1'bz : mdio_out; assign NET0_RESET_N = core_reset_n & udp_stack_eth_cntrl_export; assign udp_stack_fifo_start_to_ethernet = 1'b0; assign udp_stack_fifo_rdreq = 1'b0; assign udp_stack_fifo_wr_data = 8'h00; assign udp_stack_fifo_wrreq = 1'b0; pll pll_inst( .areset(~reset_n), .inclk0(CLOCK_50), .c0(sys_clk), .c1(clk_125), .c2(clk_25), .c3(clk_2p5), .c4(clk_200), .locked(core_reset_n) ); assign tx_clk = eth_mode ? clk_125 : // GbE Mode = 125MHz clock ena_10 ? clk_2p5 : // 10Mb Mode = 2.5MHz clock clk_25; // 100Mb Mode = 25 MHz clock ddio_out ddio_out_inst( .datain_h(1'b1), .datain_l(1'b0), .outclock(tx_clk), .dataout(NET0_GTX_CLK) ); nios_system system_inst( .clk_clk (sys_clk), // clk.clk .reset_reset_n (core_reset_n), // reset.reset_n .reset_tse_reset_n (udp_stack_eth_cntrl_export), .tse_export_rx_control (NET0_RX_DV), // tse_mac_conduit.rx_control .tse_export_rx_clk (NET0_RX_CLK), // .rx_clk .tse_export_tx_control (NET0_TX_EN), // .tx_control .tse_export_tx_clk (tx_clk), // .tx_clk .tse_export_rgmii_out (NET0_TX_DATA), // .rgmii_out .tse_export_rgmii_in (NET0_RX_DATA), // .rgmii_in .tse_export_ena_10 (ena_10), // .ena_10 .tse_export_eth_mode (eth_mode), // .eth_mode .tse_export_mdio_in (mdio_in), // .mdio_in .tse_export_mdio_out (mdio_out), // .mdio_out .tse_export_mdc (mdc), // .mdc .tse_export_mdio_oen (mdio_oen), // .mdio_oen // -- .udp_stack_fifo_start_to_ethernet(udp_stack_fifo_start_to_ethernet), // udp_stack_fifo.start_to_ethernet .udp_stack_fifo_rd_data(udp_stack_fifo_rd_data), // .rd_data .udp_stack_fifo_rdreq(udp_stack_fifo_rdreq), // .rdreq .udp_stack_fifo_rdempty(udp_stack_fifo_rdempty), // .rdempty .udp_stack_fifo_rdusedw(udp_stack_fifo_rdusedw), // .rdusedw .udp_stack_fifo_wr_data(udp_stack_fifo_wr_data), // .wr_data .udp_stack_fifo_wrreq(udp_stack_fifo_wrreq), // .wrreq .udp_stack_fifo_wrfull(udp_stack_fifo_wrfull), // .wrfull .udp_stack_eth_cntrl_export(udp_stack_eth_cntrl_export) // udp_stack_eth_cntrl.export ); endmodule вот код инициализации IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_BASE, PHY); t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x1B);//Extended PHY Specific Status Register t2 &= 0xFFF0; IOWR_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x1B,t2|0xB);//RGMII to Copper t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x14);//Extended PHY Specific Control Register IOWR_ALTERA_TSEMAC_MDIO(TSE_BASE,0,0x14,t2|0x82);//Add Delay to RX_CLK for RXD Outputs; Add Delay to GTX_CLK for TXD Inputs t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,ALTERA_TSEMAC_PHY_ADDR_CONTROL); IOWR_ALTERA_TSEMAC_MDIO(TSE_BASE, 0, ALTERA_TSEMAC_PHY_ADDR_CONTROL, t2 | PCS_CTL_sw_reset);//Previous Operations Require SW Reset do { for(i = 0; i < sizeof(reg_phy); i++){ reg_phy[i] = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE, 0, i); } t2 = IORD_ALTERA_TSEMAC_MDIO(TSE_BASE,0,ALTERA_TSEMAC_PHY_ADDR_STATUS); } не могу понять куда дальше копать, в чем проблема что марвел не хочет подключится к прибору? Как/чем можно посмотреть почему phy не поднял линк? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться